برنامج C عالق على الانتظار غير المنقطع أثناء أداء القرص I / O على Mac OS X Snow Leopard

StackOverflow https://stackoverflow.com/questions/2017283

  •  19-09-2019
  •  | 
  •  

سؤال

سطر واحد من الخلفية: أنا مطور Redis، قاعدة بيانات Nosql. وبعد واحدة من الميزات الجديدة التي أقوم بها هي الذاكرة الظاهرية، لأن Redis يأخذ جميع البيانات في الذاكرة. بفضل VM Redis قادر على النقل نادرا ما يستخدم الكائنات من الذاكرة إلى القرص، وهناك عدد من الأسباب التي تجعل هذا يعمل بشكل أفضل بكثير من السماح لنظام التشغيل القيام بعمل مبادلة الولايات المتحدة (كائنات Redis مخصصة للعديد من الأشياء الصغيرة المخصصة في غير متجاورة الأماكن، عند التسلسل إلى القرص بواسطة Redis، يستغرقون مساحة أقل من 10 مرات مقارنة بصفحات الذاكرة حيث يعيشون، وما إلى ذلك).

الآن لدي تطبيق ألفا الذي يعمل تماما على Linux، ولكن ليس جيدا على Mac OS X Snow Leopard. من وقت لآخر، في حين يحاول Redis نقل صفحة من الذاكرة إلى القرص، تدخل عملية Redis حالة الانتظار غير المنقطعة لمدة دقائق. كنت غير قادر على تصحيح هذا، ولكن هذا يحدث إما في مكالمة fseeko() أو fwrite(). وبعد بعد دقائق، يتم إرجاع المكالمة أخيرا، وتستمر Redis في العمل دون مشاكل على الإطلاق: لا تحطم.

كمية البيانات التي نقلت هي جداً صغير، شيء مثل 256 بايت. لذلك لا ينبغي أن يكون الأمر مسألة كبيرة جدا من I / O التي أجريتها.

ولكن هناك تفاصيل مثيرة للاهتمام حول ملف المبادلة الهدف من عملية الكتابة. إنه ملف كبير (26 غيغابايت) تم إنشاؤه فتح ملف fopen() ثم تكبير باستخدام ftruncate(). وبعد وأخيرا الملف هو unlink()Ed بحيث يستمر Redis في الإشارة إليه، لكننا متأكدون من أنه عندما تقوم عملية Redis بالخروج من نظام التشغيل، فسيحتوي على ملف المبادلة حقا.

حسنا، هذا كل شيء ولكني هنا لأي تفاصيل أخرى. و BETW يمكنك حتى العثور على التعليمات البرمجية الفعلية في Redis Git، لكنها ليست تافهة لفهمها في خمس دقائق بالنظر إلى أن هذا نظام معقد إلى حد ما.

شكرا جزيلا على اي مساعدة.

هل كانت مفيدة؟

المحلول

كما أفهمها، HFS + لديها دعم ضعيف جدا لملفات متفرق. لذلك قد يكون الكتابة الخاصة بك يؤدي إلى توسيع ملف يتم تهيئة / تجسد جزء كبير من الملفات الكبيرة من الملف.

على سبيل المثال، أعرف mmap'ing ملف فارغ جديد جديد ثم الكتابة في بعض المواقع العشوائية ينتج ملف كبير جدا على القرص مع HFS +. إنه أمر مزعج تماما لأن الملفات MMP و Sparse هي وسيلة مريحة للغاية للعمل مع البيانات، وكلها تقريبا منصة / ملفات من النظام الأساسي هناك مقابض هذا بأمان.

هل ملف المبادلة مكتوبا خطيا؟ بمعنى أننا نتحل محل كتلة موجودة أو كتابة كتلة جديدة في النهاية وزيادة مؤشر مساحة حرة؟ إذا كان الأمر كذلك، فربما تفعل المزيد من مكالمات FTRuncate أصغر تكرارا لتوسيع الملف سيؤدي إلى توقف مؤقت.

كقدم، أنا فضولي لماذا لا يستخدم Redis VM MMP ثم حرك كتل في محاولة لتركيز الكتل الساخنة في الصفحات الساخنة.

نصائح أخرى

أنطيرتز، لست متأكدا من أنني سأكون مساعدة كبير منذ أن تقتصر تجربة Apple الخاصة بي على Apple ][, ، لكنني سأعطيه طلقة.

أول شيء هو سؤال. كنت أعتقد أنه بالنسبة للذاكرة الافتراضية، فإن سرعة التشغيل ستكون مقياسا أكثر أهمية من مساحة القرص (خاصة بالنسبة ل NOSQL DB حيث السرعة هي النقطة برمتها، وإلا فسوف تستخدم SQL أو لا؟). ولكن، إذا كان ملف المبادلة الخاص بك هو 26 جرام، فربما لا :-)

بعض الأشياء التي يجب تجربتها (إن أمكن).

  1. حاول فعلا عزل المشكلة للبحث أو الكتابة. لدي صعوبة في الاعتقاد أن تأخذ السعي بعد فترة طويلة منذ ذلك الحين، في أسوأ الأحوال، يجب أن يكون تغيير مؤشر مؤقت. ومع ذلك، لم أكتب OSX لذلك لا أستطيع أن أكون متأكدا.
  2. حاول ضبط حجم ملف المبادلة لمعرفة ما إذا كان هذا ما يسبب المشكلة.
  3. هل سبق لك أن قمت بتوسيع ملف المبادلة ديناميكيا (بدلا من التخصيص المسبق)؟ إذا قمت بذلك، فقد يكون هذا ما يسبب المشكلة.
  4. هل تكتب دائما منخفضة في الملف قدر الإمكان؟ قد يكون إنشاء ملف 26 جرام قد لا يملأه بالفعل مع البيانات ولكن إذا قمت بإنشائه ثم اكتب إلى البايت الأخير، فقد تضطر نظام التشغيل إلى الصفر من البايتات قبل ذلك (تأجيل التهيئة، إن وجدت).
  5. ماذا يحدث إذا قمت فقط بتخصيص الملف بأكمله مسبقا (اكتب إلى كل بايت) وليس إلغاء ربطه؟ بمعنى آخر، اترك الملف هناك بين أشواط من برنامجك (إنشاءه إذا لم يكن موجودا بالفعل بالطبع). ثم في رمز بدء التشغيل الخاص بك ل REDIS، فقط تهيئة الملف (المؤشرات ومثل هذه). قد يتخلص هذا من أي مشاكل مثل تلك الموجودة في النقطة 4 أعلاه.
  6. اسأل عن مواقع BSD المختلفة أيضا. لست متأكدا من مقدار تغيير Apple تحت الأغطية ولكن OSX هو مجرد BSD عند أدنى مستوى (البط باكس للغطاء).
  7. أيضا النظر في السؤال على مواقع Apple (إذا لم تكن قد قمت بذلك بالفعل).

حسنا، هذه مساهمتي الصغيرة، نأمل أن تساعد. حظا سعيدا مع المشروع الخاص بك.

هل قمت بإيقاف تشغيل ملف التخزين المؤقت للملف الخاص بك؟ أي fcntl (fd، f_global_nocache، 1)

هل حاولت تصحيح الأخطاء مع DTRACE وأدوات (ABPLE التجريبية DTRACE الواجهة الأمامية)؟

استكشاف الفهد مع DTRACE

تصحيح الكروم على نظام التشغيل X

كما قال Linus مرة واحدة على القائمة البريدية GIT:

"أدرك أن OS X الأشخاص الذين يمارسون صعوبة في قبولها، ولكن أنظمة ملفات OS X تامة عموما وحماقة مطلقة - حتى أكثر من Windows."

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top