في عالم إدارة البنية التحتية وDevOps عالي المخاطر، غالباً ما يكون زمن استجابة التطبيق مجرد عرض للمرض. تكمن المشكلة أعمق، مدفونة داخل تفاعل نواة لينكس مع موارد العتاد. بالنسبة للمطورين من المستوى المتوسط إلى المتقدم، يعد فهم كيفية ضبط بيئة لينكس ليس مجرد تقنية تحسين، بل ضرورة لضمان قابلية التوسع والاستقرار والكفاءة من حيث التكلفة.
ضبط الأداء ليس حلاً يناسب الجميع. فخادم قواعد البيانات له متطلبات تختلف تماماً عن واجهة الويب الأمامية أو عقدة التداول عالي التردد. ومع ذلك، تظل المبادئ الأساسية لإدارة الموارد ثابتة. يستكشف هذا الدليل الطبقات الحرجة لضبط أداء لينكس، بدءاً من إدارة الذاكرة وصولاً إلى استراتيجيات الإدخال/الإخراج وتحسينات طبقة الشبكة.
إدارة الذاكرة وسلوك التبديل (Swapping)
يُعد ضغط الذاكرة أحد أكثر الاختناقات شيوعاً في بيئات الإنتاج. بشكل افتراضي، تكون لينكس متحمسة لاستبدال الصفحات غير النشطة على القرص لتحرير ذاكرة الوصول العشوائي (RAM) للتخزين المؤقت. بينما يُعد هذا السلوك جيداً بشكل عام، إلا أن التبديل (Swapping) يمكن أن يؤدي إلى ارتفاعات كارثية في زمن الاستجابة في التطبيقات عالية الإنتاجية.
يجب أن يكون أحد التعديلات الأولى هو معامل vm.swappiness. تتراوح هذه القيمة من 0 إلى 100، وتخبر النواة بمدى عدوانيتها في التبديل. بالنسبة للتطبيقات الحساسة لزمن الاستجابة، تريد عادةً تقليل التبديل إلى الحد الأدنى.
# تقليل قيمة التبديل إلى 10 لتفضيل إبقاء البيانات في ذاكرة RAM
sudo sysctl -w vm.swappiness=10
# جعل التغيير دائماً عبر إعادة التشغيل
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
بالإضافة إلى ذلك، فكر في ضبط vm.vfs_cache_pressure. يتحكم هذا المعامل في التوازن بين استعادة الذاكرة المستخدمة في تخزين المؤقتات (caching) للمجلدات والعقد (inodes) مقابل تخزين المؤقت للصفحات (page cache). يؤدي خفض هذه القيمة إلى تشجيع النواة على الاحتفاظ بمخازن المؤقتات للمجلدات والعقد لفترة أطول، وهو أمر مفيد لأحمال العمل المكثفة في أنظمة الملفات.
# تقليل ضغط التخزين المؤقت لإبقاء مخازن المؤقتات للمجلدات/العقد في الذاكرة لفترة أطول
sudo sysctl -w vm.vfs_cache_pressure=50
تحسين جدولة الإدخال/الإخراج (I/O Schedulers)
توجد جدولة الإدخال/الإخراج بين التطبيق ونظام التخزين، وتقرر ترتيب معالجة طلبات الإدخال/الإخراج. تختلف الجدولة الافتراضية حسب التوزيع (Distribution) ولكنها غالباً ما تكون mq-deadline لأقراص NVMe الحديثة أو bfq للأقراص الدوارة. ومع ذلك، قد تستفيد أحمال العمل المحددة من جدولات مختلفة.
بالنسبة لأقراص SSD وأقراص NVMe، غالباً ما تكون جدولات none أو mq-deadline هي الأمثل لأن العتاد يتعامل مع الطابور بكفاءة أكبر من طبقة البرمجيات في النواة. يمكنك التحقق من الجدولة الحالية باستخدام:
cat /sys/block/sda/queue/scheduler
لتبديل الجدولة لجهاز كتلة (block device)، يمكنك الكتابة مباشرة في واجهة sysfs. لاحظ أن هذا التغيير مؤقت ويجب برمجته عبر قواعد udev لضمان الاستمرارية.
# التبديل إلى جدولة 'none' لقارص NVMe sda
echo "none" | sudo tee /sys/block/sda/queue/scheduler
ضبط طبقة الشبكة للتزامن العالي
عند خدمة آلاف الاتصالات المتزامنة، غالباً ما تصبح إعدادات طبقة TCP الافتراضية نقطة اختناق. معاملان حرجان هما net.core.somaxconn و net.ipv4.tcp_tw_reuse.
يحدد إعداد somaxconn الحد الأقصى لطول طابور اتصال المقبس (socket). إذا كان تطبيقك هو خادم ويب مثل Nginx أو Apache، ورأيت أخطاء "Connection refused" على الرغم من انخفاض استخدام وحدة المعالجة المركزية، فمن المرجح أن طابور الانتظار (backlog queue) ممتلئ.
# زيادة الحد الأقصى لطابور اتصال المقبس إلى 65535
sudo sysctl -w net.core.somaxconn=65535
علاوة على ذلك، يسمح tcp_tw_reuse بإعادة استخدام مقابس TIME-WAIT للاتصالات الخارجة الجديدة. هذا أمر بالغ الأهمية للتطبيقات التي تقوم بإجراء العديد من الاتصالات الخارجة، مثل بوابات API أو موازنات الحمل.
# تمكين إعادة استخدام مقابس TCP TIME-WAIT
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
المراقبة والتكرار
الضبط دون قياس هو مجرد تخمين. استخدم أدوات مثل vmstat و iostat و pidstat لإنشاء خط أساسي. ابحث عن قيمة عالية لـ wa (انتظار الإدخال/الإخراج) في vmstat، أو استخدام عالي للقرص في iostat، أو ارتفاعات في تبديل السياق في pidstat. قم بضبط معامل واحد في كل مرة، وقياس الأثر، وتكرار العملية.
الخاتمة
يعد ضبط أداء لينكس تخصصاً دقيقاً يتطلب فهماً عميقاً لكيفية إدارة نظام التشغيل لموارد العتاد. من خلال ضبط معاملات النواة المتعلقة بالذاكرة والإدخال/الإخراج والشبكة بعناية، يمكنك استخراج مكاسب أداء كبيرة من بنيتك التحتية. ومع ذلك، تذكر دائماً أن هذه التحسينات يجب أن تتماشى مع خصائص حمل العمل لتطبيقك المحدد. ابدأ بأساس مراقبة متين، وقم بتغييرات تدريجية، ودع البيانات تقود قراراتك في الضبط.