سوف نتعامل مع منظمي النظام الفرعي لتخزين البيانات ونرى ما يسمحون لك به بمعنى كتلة الإدخال / الإخراج.

الأمر المثير للاهتمام هنا بشكل خاص هو أننا ندخل منطقة حيث التغييرات على الإعدادات التي يتم إجراؤها بعد إطلاق النظام أقل أهمية بكثير من القرارات التي يتم اتخاذها حتى قبل نشره.
ألق نظرة على الصورة أدناه.
يقدم أربعة موارد رئيسية يحتاجها الكمبيوتر الحديث ليعمل بشكل صحيح. ضبط الأداء هو فن التوزيع الأمثل لهذه الموارد بين عمليات التطبيق. علاوة على ذلك ، كل هذه الموارد ليست غير محدودة وغير متكافئة من حيث التأثير على الإنتاجية.
يتم تقليل أداء نظام التخزين الفرعي إلى أداء تقنيات التخزين المستخدمة فيه: محركات الأقراص الثابتة ، SSD ، SAN ، NAS - يمكن أن تختلف اختلافًا كبيرًا في سرعة الوصول والإنتاجية. ومعالج قوي وكثير من الذاكرة لن يحفظ الوضع إذا لم تستوف أجهزة التخزين متطلبات المهام التي يتم حلها.
إذا كنت ، بصفتك متخصصًا في Linux ، يمكنك التأثير على قرارات الأجهزة ، فحاول التأكد من أن مؤسستك لديها نظام تخزين مناسب (أو متفوق). هذا سيوفر العديد من المشاكل في المستقبل.
الآن دعونا نرى ما يمكن القيام به بمساعدة ضوابط الإدخال / الإخراج (I / O).
كل شيء عن أجهزة التخزين
رسميًا ، يُطلق على وحدة تحكم الإدخال / الإخراج blkio ، ولكنها في حالة جيدة ، تستجيب لـ Blocky. مثل وحدة تحكم وحدة المعالجة المركزية ، فإن Blocky لديه وضعان للعمل:
- التعديل باستخدام كرات الإدخال / الإخراج النسبية (الحصص) ، مما يسمح لك بالتحكم في الأداء على مستوى جميع أو أجهزة تخزين البلوك المحددة عن طريق تعيين القيم في النطاق من 10 إلى 1000. بشكل افتراضي ، يتم استخدام 1000 ، وبالتالي فإن أي تغييرات تقلل من كرات الإدخال / الإخراج فقط المستخدم أو الخدمة المحددة. لماذا 1000 ، وليس 1024 ، كما هو الحال في وحدة المعالجة المركزية؟ سؤال جيد. يبدو أن هذا هو الحال عندما تكون الطبيعة المفتوحة لـ Linux غير جيدة بالنسبة له.
- تعديل عرض النطاق الترددي المطلق للحد من سرعة القراءة و / أو الكتابة لمستخدم أو خدمة معينة. بشكل افتراضي ، يتم تعطيل هذا الوضع.
توضح لقطة الشاشة أدناه المعلمات التي يمكن تعديلها باستخدام الأمر systemctl. استخدمنا هنا سحر المطالبات التلقائية على مفتاح Tab لعرض قائمة بالخيارات. وهذا ما يسمى بإكمال bash ، وإذا كنت لا تزال لا تستخدم هذه الوظيفة ، فقد حان الوقت لتثبيت PRM المناسب.
يتم التحكم في كرات الإدخال / الإخراج النسبية بواسطة معلمات BlockIODeviceWeight و BlockIOWeight. قبل اللعب باستخدام وحدات التحكم هذه ، تحتاج إلى فهم ذلك: فهي تعمل فقط إذا تم تمكين جدولة CFQ لجهاز التخزين.
ما هو جدولة I / O؟ لنبدأ من بعيد ونتذكر أن نواة Linux مسؤولة عن التأكد من أن جميع مكونات أجهزة الكمبيوتر تتواصل مع بعضها بشكل صحيح. وبما أن جميع هذه المكونات في نفس الوقت تريد أشياء مختلفة ، فلا يمكن للمرء الاستغناء عن الطلب. حسنًا ، كيف ننظم حياتنا ، على سبيل المثال ، وننظمها للعمل والراحة والنوم وما إلى ذلك.
إذا تحدثنا عن أجهزة التخزين ، فإن جدولة I / O مسؤولة عن تنظيم عملها داخل النواة. هذا مجرد رمز برنامج يحدد طريقة للتحكم في تدفق البيانات لأجهزة الحظر ، بدءًا من محركات أقراص USB المحمولة ومحركات الأقراص الثابتة إلى الأقراص الافتراضية ، والتي هي في الواقع ملفات في مكان ما على أجهزة ISCI في SAN.
وفوق كل هذه الأجهزة التي يمكن استخدامها على Linux ، هناك العديد من المهام التي يجب أن يقوم بها الكمبيوتر. بالإضافة إلى ذلك ، في الحياة الواقعية ، هناك ما نسميه في Red Hat "حالات الاستخدام". هذا هو السبب في وجود مخططين مختلفين يركزون على سيناريوهات مختلفة. تسمى هذه الجدولة noop ، الموعد النهائي و cfq. باختصار ، يمكن وصف كل منها على النحو التالي:
- Noop - مناسب تمامًا لأجهزة تخزين الكتل التي لا تحتوي على أجزاء دوارة (فلاش ، SSD ، إلخ).
- الموعد النهائي هو جدولة خفيفة الوزن تركز على تقليل التأخيرات. بشكل افتراضي ، يعطي أولوية للقراءة على حساب الكتابة ، لأن معظم التطبيقات تتعثر في القراءة.
- Cfq - تركز على التوزيع العادل لعرض النطاق الترددي I / O على مستوى النظام. وكما قلنا أعلاه ، هذا هو المجدول الوحيد الذي يدعم خيارات الإدخال / الإخراج النسبية للمجموعات.
لمزيد من المعلومات حول الجدولة ، راجع دليل ضبط أداء Red Hat Enterprise Linux 7.
ما كل هذا النقاش حول المخططين؟ إلى جانب ذلك ، في معظم أجهزة الكمبيوتر لا يتم استخدام cfq افتراضيًا إذا لم يكن لديهم محركات أقراص SATA. دون معرفة ذلك ، يمكنك تغيير BlockIOWeight حتى تتحول إلى اللون الأزرق بدون أي تأثير. لسوء الحظ ، لن يخبرك systemd: "عذرًا ، أنت تحاول عبثًا تغيير هذه المعلمة. لن يعمل هذا لأن الجهاز يستخدم المجدول الخاطئ. "
إذن كيف يمكنك معرفة هذه الميزة "المثيرة للاهتمام"؟ كالعادة ، من وثائق cgroups كتبنا عنها في منشور سابق. من المفيد دائمًا التعرف عليها قبل استخدام هذه الهيئات التنظيمية أو تلك.
ننتقل إلى حالة الاستخدام

مرة أخرى ننتقل من الكلمات العامة إلى التفاصيل: اسمحوا لي أن أقدم لكم السيد كريكين.
يعمل في مجال التموين ولديه قاعدتي بيانات على خادم التطبيقات لتتبع الطلبات. يصر السيد Kryakin على أن قاعدة بيانات الطلبات لأطباق البط هي أكثر أهمية بكثير من قاعدة أطباق الأوز ، لأن الأوز محتالون على عرش الطيور المائية.
يتم تكوين قاعدتي البيانات كخدمات ، وتبدو ملفات الوحدة الخاصة بها كما يلي:
في الواقع ، لا تقوم البرامج النصية التي تسمى بها (duck.sh و goose.sh) بأي عمل حقيقي في قاعدة البيانات ، ولكنها تحاكي فقط القراءة والكتابة باستخدام حلقات الأمر dd. يستخدم كلا البرنامجين نظام ملفات قاعدة البيانات ، الموجود على القرص الافتراضي الخاص به.
دعنا نركض البط والأوز ونرى أين يهبطون في التسلسل الهرمي لمجموعة cgroup:
والآن ، نظرًا لأننا نعرف PIDs للعمليات dd ، فلننتقل إلى الأمر iotop لمعرفة ما يحدث في نظام التخزين الفرعي:
حسنًا ، 12-14 ميجابايت / ثانية ... ليست سريعة. يبدو أن السيد كريكين لم يستثمر الكثير في نظام تخزين البيانات. على الرغم من أن لدينا بالفعل أسئلة حول كفاءتها ، لذلك ليس هناك الكثير من المفاجأة.
الآن نلقي نظرة على مهمتين: PID 3301 (أوزة) و PID 3300 (بطة). يستخدم كل I / O في مكان ما حول 6 ميغا بايت / ثانية. الشاشة أعلاه هي أرقام مختلفة قليلاً ، ولكنها في الواقع تقفز باستمرار ، وفي المتوسط ، تشترك هاتان المهمتان في نفس النطاق الترددي لجهاز التخزين.
يريد السيد Kryakin أن يكون للبط معدل نقل بيانات I / O أكثر من 5 أضعاف على الأقل مقارنة بالإوز ، لذلك تتم معالجة أوامر البط دائمًا أولاً. دعونا نحاول استخدام معلمة BlockIOWeight لهذا مع الأوامر التالية:
نحن ننظر إلى iotop ونرى أنه لم يعمل:
دعنا نتحقق من جدولة الإدخال / الإخراج للجهاز / dev / vdb:
مثيرة للاهتمام ... نحن نحاول تغيير المجدول إلى CFF ولا شيء يأتي منه. لماذا؟
الحقيقة هي أن نظامنا يعمل على جهاز ظاهري KVM ، وتبين أنه بدءًا من الإصدار 7.1 ، لم يعد من
الممكن تغيير المجدول في Red Hat Enterprise Linux. وهذا ليس خطأ ، ولكنه ميزة تتعلق بتحسين آليات العمل مع أجهزة الإدخال / الإخراج الافتراضية.
ولكن دعونا لا تيأس. لدينا معلمتان إضافيتان يمكن تغييرهما: BlockIOReadBandwidth و BlockIOWriteBandwidth تعملان على مستوى جهاز الحظر وتتجاهل جدولة الإدخال / الإخراج. نظرًا لأننا نعرف عرض النطاق الترددي للجهاز / dev / vdb (في مكان ما حوالي 14 ميغابايت / ثانية للاستقبال والإخراج) ، ويقتصر الإوز على 2 ميغابايت / ثانية ، يبدو أننا قادرون على تحقيق رغبة السيد كريكين. لنجرب:
ننظر: PID 3426 ، المعروف أيضًا باسم أوزة ، يستخدم الآن الإدخال / الإخراج في مكان ما حول 2 ميجابايت / ثانية ، و PID 3425 ، أي بطة ، لكل 14 تقريبًا!
حسنًا ، لقد فعلنا ما يريده العميل ، مما يعني أننا لم نحفظ فقط عددًا من الأوز ، ولكن أيضًا سمعتنا كمعلم لينكس.