DevOps and Infrastructure

إتقان ضبط أداء لينكس: دليل عملي

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

فهم مقاييس النظام والأساسيات

قبل تطبيق أي تعديلات، من الضروري وضع خط أساس. لا يمكنك تحسين ما لا يمكنك قياسه. توفر أدوات مثل top و vmstat و iostat> رؤى في الوقت الفعلي حول نشاط وحدة المعالجة المركزية والذاكرة والقرص. لتحليل أعمق، فكر في استخدام perf لمعدادات أداء العتاد أو dstat لمراقبة شاملة للموارد. سيحدد تحديد ما إذا كان الاختناق الخاص بك يعتمد على وحدة المعالجة المركزية، أو الإدخال/الإخراج، أو الذاكرة، المعاملات التي يجب عليك إعطاؤها الأولوية. على سبيل المثال، يشير معدل تبديل السياق العالي غالباً إلى تشبع وحدة المعالجة المركزية، بينما تشير أوقات الانتظار العالية في iostat إلى ازدحام القرص.

ضبط إدارة الذاكرة ومعاملة التبديل (Swappiness)

يستخدم لينكس خوارزمية ديناميكية لاستبدال الصفحات لإدارة الذاكرة الفعلية. يتحكم معامل vm.swappiness في ميل النواة لنقل العمليات خارج الذاكرة الفعلية إلى قرص التبديل (swap). بشكل افتراضي، يتم تعيين هذه القيمة على 60، وهو ما قد يكون دون المستوى الأمثل لخوادم قواعد البيانات أو التطبيقات التي تتطلب زمن استجابة منخفض. يشجع تعيين قيمة التبديل (swappiness) الأقرب إلى 0 النواة على استخدام التبديل كحل أخير فقط، مع الحفاظ على البيانات في ذاكرة الوصول العشوائي (RAM) للوصول الأسرع. يمكنك عرض القيمة الحالية باستخدام cat /proc/sys/vm/swappiness وتعديلها مؤقتاً باستخدام sysctl -w vm.swappiness=10. للاستمرارية عبر عمليات إعادة التشغيل، أضف vm.swappiness=10 إلى /etc/sysctl.conf.

# عرض قيمة التبديل الحالية
cat /proc/sys/vm/swappiness

# تعيين قيمة التبديل مؤقتاً على 10
sudo sysctl -w vm.swappiness=10

# جعل التغيير دائماً
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

تحسين جدولة إدخال/إخراج نظام الملفات

غالباً ما يكون إدخال/إخراج القرص هو الاختناق الرئيسي في بيئات خوادم قواعد البيانات وخوادم الويب. يدير مخطط إدخال/إخراج (I/O scheduler) كيفية طابرة ومعالجة طلبات القراءة والكتابة. على الأقراص الدوارة التقليدية، يُفضل عادةً استخدام مخططات deadline أو bfq لأنها تقلل من زمن الاستجابة. على محركات أقراص SSD NVMe الحديثة، تكون مخططات none أو noop أكثر ملاءمة لأن محركات أقراص SSD لا تحتوي على تأخير ميكانيكي، مما يجعل خوارزميات الجدولة المعقدة عبئاً غير ضروري. يمكنك التحقق من المخطط الحالي باستخدام cat /sys/block/sda/queue/scheduler. لتبديل المخطط لجهاز معين، استخدم echo none > /sys/block/sda/queue/scheduler. لاحظ أنه بالنسبة لأنظمة الإنتاج، يجب تكوين ذلك عبر قواعد udev لضمان استمراره وتطبيقه على الجهاز الصحيح بشكل ديناميكي.

تحسينات طبقة الشبكة

بالنسبة لخوادم الويب ذات حركة المرور العالية، يمكن أن تصبح طبقة الشبكة قيداً كبيراً. يسمح ضبط /proc/sys/net/core/rmem_max و wmem_max للنواة بمعالجة كميات أكبر من البيانات في مخازن الذاكرة المؤقتة، مما يحسن الإنتاجية للتطبيقات مثل Nginx أو Apache. بالإضافة إلى ذلك، يساعد تمكين توسيع نافذة TCP عبر net.core.rmem_max في استخدام شبكات النطاق الترددي العالي وزمن الاستجابة العالي بشكل أكثر فعالية. يجب أيضاً التحقق من حجم طابرة الانتظار لربطات TCP. إذا كنت تواجه أخطاء "تم رفض الاتصال" تحت الحمل، فإن زيادة net.core.somaxconn وتكوين خادم التطبيق الخاص بك (على سبيل المثال، تعيين listen.backlog في PHP-FPM) أمر بالغ الأهمية.

الخاتمة

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

Share: