مخاطر التحسينات غير الصحيحة

عندما يتعلق الأمر بتحسين النظام لتحقيق أقصى أداء ، يمكن أن يكون من السهل جدًا ارتكاب الأخطاء إذا طبقت ممارسات الآخرين بشكل متهور. إحدى هذه الممارسات هي تحديد nobarrier عند تركيب أنظمة الملفات.

كيف ولدت هذه المذكرة


أعمل كمهندس في Mail.Ru Cloud Solutions وأتعامل بشكل أساسي مع جميع أنواع وحدات التخزين "حول وحول" التي توجد عليها الأجهزة الافتراضية لمستخدمينا - وبالتالي ، تنشأ حالات مثيرة للاهتمام غالبًا تتعلق بأداء واستقرار الأجهزة الافتراضية التي تعمل في التطبيقات - وخاصة قواعد البيانات.

وكقاعدة عامة ، في نصف الحالات تقريبًا أثناء "استخلاص المعلومات" ، نرى نفس الشيء - نظام ملفات مثبت مع خيار nobarrier. وعندما نسأل - "لماذا كتبت هذا الخيار" ، نحصل دائمًا على أحد خيارات الإجابة "لقد قيل لي أنه كان أسرع / قرأت أنه كان أسرع / لقد تم إعداده على هذا النحو" - وبعد ذلك نحاول بأدب وبعناية شرح ذلك لذلك لا تحتاج إلى. لماذا؟ لأن هذه هي الخطوة الأولى الواثقة على طريق فقدان البيانات.

رحلة قصيرة


نظام الملفات - هيكل معقد جدا وتحميلها للغاية. لضمان أقصى قدر من الأداء ، يتم استخدام التخزين المؤقت والتسجيل المتوازي بنشاط في هذه العملية. وفقًا لذلك ، يتم نقل جزء من البيانات إلى ذاكرة التخزين المؤقت ويتم التخلص منها كلما كان ذلك ممكنًا / ضروريًا أو "عند الطلب". الحاجز عبارة عن عملية خاصة لإجبار جميع مخابئ التخزين على القرص.

عندما يتعلق الأمر بقواعد البيانات ، يجب أن نكون على يقين من أن المعاملة التي تم تأكيدها للعميل (تطبيق العميل) كانت مستمرة ولن تختفي ، من ناحية ، ومن ناحية أخرى ، تستخدم قواعد بيانات إدارة قواعد البيانات بنشاط التخزين المؤقت الخاص بها لتحقيق أقصى قدر من الأداء - ولضمان الاتساق ، استخدام دفتر اليومية - يتم كتابة التغيير في السجل ، تتم "مزامنة" السجل ثم يتم كتابة التغيير على البيانات (وعندما يتم كتابته ، يتم إدخاله في ذاكرة التخزين المؤقت). عندما يكون السجل ممتلئًا ، يتم إجراء مزامنة إجبارية لجميع البيانات الموجودة في ذاكرة التخزين المؤقت ويبدأ السجل في الانتشار مرة أخرى.

عملية المزامنة


عند تنفيذ المزامنة ، لا يقوم نظام التشغيل فقط بمسح ذاكرة التخزين المؤقت للصفحة ، ولكن بشكل افتراضي يرسل أمرًا لمسح كافة ذاكرة التخزين المؤقت للقرص (وربما يفعل ذلك بشكل متكرر) - ​​ما يسمى بـ تدفق . تعتبر عملية تشغيل مخازن التخزين المؤقت "باهظة الثمن" وتستغرق وقتًا كبيرًا - ولكنها ضرورية ، لأنه في أنظمة الملفات يكون ترتيب الكتابة مهمًا - إذا تم انتهاكه ، فعندئذ (على سبيل المثال) قد يتضح أنه عند حدوث إعادة تشغيل مفاجئة ، سيحتوي الملف على بيانات غير مقبولة بدلاً من البيانات - لأن الجهاز قررت إعادة ترتيب السجل. وعندما يتدفق فلوش بالقوة جميع المخابئ - وهذا يضمن أن يتم أولاً كتابة ما قبل التدفق ، وعندها فقط ما يحدث بعد ذلك - أي ، يتم إنشاء "حاجز" يقسم الإدخالات إلى "قبل الحاجز" و "بعد الحاجز" (من هنا واسم "حاجز الكتابة") - وهذا يجعل من الممكن ضمان أن السجلات بعد الحاجز لن يتم تطبيقها في وقت أبكر من السجلات قبل الحاجز.

تأثير نوبارير


يعطل خيار nobarrier إرسال تدفق الإجبار أثناء تشغيل نظام الملفات. يؤدي هذا إلى حقيقة أنه يمكن إعادة ترتيب السجلات - وإذا حدث فشل ، فقد لا يكون نظام الملفات (وعمومًا البيانات الموجودة في الحالة العامة) متسقًا - دعنا نتذكر ما ذكر في الفقرة السابقة حول ترتيب التسجيل.

لماذا هذا الخيار مدرج؟ بالنسبة لمحركات أقراص الحالة الصلبة منخفضة التكلفة ، فإن تشغيل عملية التدفق يكون مكلفًا للغاية - على سبيل المثال ، تقوم محركات أقراص الحالة الصلبة منخفضة التكلفة (والعديد من الأجهزة ذات التكلفة المنخفضة التي تم وضعها كأجهزة "خادم") بإجراء ما بين 10 إلى 20 ألف عملية كتابة في الثانية بدون تدفق ، ومع انخفاض التدفق ، تنخفض إلى 1-2 آلاف. في مثل هذه الحالات ، يوفر nobarrier زيادة كبيرة في الأداء ، مما يخلق مخاطر على سلامة البيانات الموضحة أعلاه.

بيئة افتراضية


في حالة وجود جهاز ظاهري - على سبيل المثال ، إذا كنا نتحدث عن التكوين الكلاسيكي للأجهزة الافتراضية على برنامج Linux hypervisor ، فلدينا QEMU - وهي عملية مسؤولة فعلاً عن محاكاة I / O لنظام التشغيل الضيف. والأهم من ذلك ، إذا استخدمنا أقراصًا غير مدعومة بالملفات في جهاز ظاهري ، فإن ذاكرة التخزين المؤقت لهذا القرص الظاهري (فجأة!؟) تكمن في مساحة المستخدم - في مساحة العنوان لعملية QEMU المقابلة. وإذا تعطلت هذه العملية - على سبيل المثال ، وفقًا لـ SEGFAULT / SIGSEGV - فسوف تموت كل ذاكراتها. مثال على برنامج تشغيل جهاز كتلة مثل برنامج تشغيل RBD (Ceph).

وحتى إذا كنت لا تستخدم Ceph ولكن iSCSI / FC ، على سبيل المثال ، لا يختفي مستوى الفشل - إنه ينتقل ببساطة من QEMU إلى نظام التشغيل المضيف (برنامج Hypervisor). سقط برنامج Hypervisor - ماتت ذاكرة التخزين المؤقت لصفحته (وهذا ينطبق على io = 'مؤشرات الترابط' بالاقتران مع cache = 'Writeback' أو cache = 'غير آمن'). عفوا.

s / Cloud / Alien computer / g


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

ملخص


استخدام nobarrier في السحابة يعني أنك من المحتمل أن تعرض بياناتك للخطر. هل أنت متأكد من رغبتك في زيادة الإنتاجية على حساب هذه المخاطر؟

Source: https://habr.com/ru/post/ar471906/


All Articles