DevOps and Infrastructure

تحرير أداء لينكس: دليل شامل لتحسين الأداء

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

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

فهم نظام الذاكرة

تعد إدارة الذاكرة غالباً عنق الزجاجة الأول في أنظمة لينكس. قد يؤدي قاتل الذاكرة (OOM) الخاص بالنواة وإدارة ذاكرة التخزين المؤقت للصفحات (page cache) العدوانية أحياناً إلى أداء دون المستوى الأمثل تحت الأحمال الثقيلة. الأداة الرئيسية للتفاعل مع سلوك الذاكرة في النواة هي /proc/sys/vm.

واحد من أكثر المعلمات تأثيراً التي يجب مراعاتها هو vm.swappiness. يتحكم هذا المعلمة في ميل النواة لنقل العمليات من الذاكرة الفيزيائية إلى قرص التبديل (swap). تشجع القيمة العالية (القريبة من 60، وهي القيمة الافتراضية) على التبديل، وهو أمر ضار بالتطبيقات الحساسة للأداء. بالنسبة لمعظم خوادم قواعد البيانات والتطبيقات، فإن تقليل هذه القيمة إلى 1 أو 10 يقلل بشكل كبير من أوقات انتظار الإدخال/الإخراج الناتجة عن تبديل القرص.

# تغيير قيمة swappiness مؤقتاً إلى 1
sudo sysctl vm.swappiness=1

# جعل التغيير دائماً عبر عمليات إعادة التشغيل
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf

معامل حاسم آخر هو vm.dirty_ratio و vm.dirty_background_ratio. تحدد هذه المعلمات نسبة ذاكرة النظام التي يمكن أن تحتفظ بالصفحات المتسخة (المعدلة ولكن لم يتم كتابتها على القرص بعد). إذا كانت هذه القيم عالية جداً، فإنك تخاطر بحدوث ارتفاع مفاجئ وهائل في الإدخال/الإخراج عندما تقرر النواة أخيراً مسح هذه الصفحات، مما يسبب ارتفاعاً في زمن الاستجابة. يضمن خفض vm.dirty_background_ratio إلى 5-10 نمط كتابة أكثر سلاسة واستمرارية.

تحسين أداء الشبكة

بالنسبة للخدمات المصغرة (Microservices) وبوابات API، يعد زمن استجابة الشبكة وإنتاجية الاتصال أمراً بالغ الأهمية. يمكن تكوين مجموعة بروتوكولات TCP في لينكس بشكل كبير عبر /proc/sys/net/. إحدى المشكلات الشائعة في بيئات عالية التزامن هي استنفاد المنافذ المؤقتة (ephemeral ports). يمكنك زيادة نطاق المنافذ المتاحة باستخدام:

# زيادة نطاق المنافذ المؤقتة إلى 65535
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"

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

sudo sysctl -w net.ipv4.tcp_window_scaling=1
sudo sysctl -w net.ipv4.tcp_sack=1
sudo sysctl -w net.ipv4.tcp_timestamps=1

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

يحدد مخطط إدخال/إخراج (I/O scheduler) كيفية تعامل طبقة الكتلة مع طلبات القراءة والكتابة. يختلف المخطط الافتراضي حسب التوزيع، وغالباً ما يتحول إلى mq-deadline أو bfs لأقراص NVMe الحديثة، ولكن من الضروري التحقق من أن المخطط الصحيح نشط. بالنسبة لأقراص SSD، يُفضل عادةً استخدام مخططات none أو mq-deadline بدلاً من المخططات التقليدية cfq أو deadline المصممة للأقراص الدوارة، لأنها تقلل من عبء البحث غير الضروري.

يمكنك التحقق من المخطط الحالي باستخدام:

cat /sys/block/sda/queue/scheduler

بالنسبة لقواعد البيانات مثل PostgreSQL أو MySQL، يضمن استخدام خيارات مناسبة مثل noatime عند تحميل نظام الملفات منع تحديثات البيانات الوصفية غير الضرورية في كل مرة يتم فيها قراءة ملف، مما يقلل من عبء الإدخال/الإخراج.

# مثال على أمر التحميل مع noatime
sudo mount -o remount,noatime /

جدولة العمليات والمعالج

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

# تعيين مستوى nice إلى -5 (أولوية أعلى) لعملية قاعدة البيانات
sudo renice -n -5 -p [PID]

علاوة على ذلك، يعد فهم إعدادات حاكم المعالج (CPU governor) أمراً حيوياً. بشكل افتراضي، تستخدم العديد من الأنظمة حاكم ondemand أو powersave، الذي يغير تردد المعالج بناءً على الحمل. بالنسبة للتطبيقات الحساسة لزمن الاستجابة، يضمن التبديل إلى حاكم performance تشغيل المعالج بتردد أقصى له، مما يلغي تأخير تغيير التردد.

# التحقق من الحاكم الحالي
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# تعيينه على performance
sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor <<< performance

الخاتمة

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

Share: