irqbalance - ضبط توزيع المقاطعات (Cheatsheet)
irqbalance هو خيط معين يوزع المقاطعات الصلبة (IRQs) عبر نوى CPU. قد يوجه Linux معظم المقاطعات من NIC أو وحدة تحكم التخزين المشغول إلى CPU 0، مما يجعل هذه النواة اختناق بينما يخمل الآخرون. يراقب irqbalance حمل المقاطعة وإعادة توازن تقاربية IRQ لنشر العمل. بالمقابل، بالنسبة لأحمال العمل الحساسة للكمون مع وحدات المعالجة المركزية المثبتة باليد، فإنها غالباً ما يتم تعطيلها بقصد حتى لا تستطيع نقل المقاطعات إلى النوى المعزولة.
التثبيت
| النظام الأساسي | الأمر |
|---|
| Debian/Ubuntu | sudo apt install irqbalance |
| Fedora/RHEL | sudo dnf install irqbalance |
| Arch Linux | sudo pacman -S irqbalance |
| الخدمة | sudo systemctl enable --now irqbalance |
| التحقق | irqbalance --version |
فحص المقاطعات أولاً
| الأمر | يعرض |
|---|
cat /proc/interrupts | عد المقاطعات لكل CPU حسب الجهاز |
watch -n1 'cat /proc/interrupts' | النمو المباشر (اكتشف النواة الساخنة) |
mpstat -I SUM -P ALL 1 | المقاطعات لكل CPU في الثانية |
cat /proc/irq/<N>/smp_affinity | قناع التقارب للـ IRQ واحد |
cat /proc/irq/<N>/smp_affinity_list | نفس، كقائمة CPU |
# هل نواة واحدة تمتص جميع مقاطعات NIC؟
watch -n1 "grep -E 'eth0|mlx|ens' /proc/interrupts"
تشغيل الخيط
| الأمر | الوصف |
|---|
sudo systemctl status irqbalance | تحقق من أنه يعمل |
sudo irqbalance --foreground | تشغيل في المقدمة (تصحيح) |
sudo irqbalance --oneshot | توازن مرة واحدة، ثم خروج |
sudo irqbalance --debug | قرارات مطولة |
الخيارات الرئيسية / البيئة
| الإعداد | التأثير |
|---|
IRQBALANCE_BANNED_CPUS=<mask> | لا تعين IRQs لهذه وحدات المعالجة المركزية |
--banirq=N | استبعد IRQ محدد من التوازن |
--policyscript=PATH | السكريبت الذي يقرر السياسة لكل IRQ |
--interval=SECONDS | فترة إعادة التوازن |
| `—hintpolicy=exact | subset |
--powerthresh=N | عتبة توحيد حفظ الطاقة |
التكوين عادة ما يعيش في /etc/default/irqbalance أو /etc/sysconfig/irqbalance.
# احفظ IRQs معزولة تماماً عن الأنوية 8-15 (قناع للـ CPUs 8..15)
echo 'IRQBALANCE_BANNED_CPUS=0000ff00' | sudo tee -a /etc/default/irqbalance
sudo systemctl restart irqbalance
تقاربية IRQ اليدوية (عند تعطيل الخيط)
# دبوس IRQ 42 إلى CPU 2 (bitmask 0x4)
echo 4 | sudo tee /proc/irq/42/smp_affinity
# أو حسب قائمة CPU
echo 2 | sudo tee /proc/irq/42/smp_affinity_list
| النهج | الاستخدام |
|---|
| irqbalance قيد التشغيل | الخوادم العامة، تحميل متغير |
| irqbalance معطل + تدبيس يدوي | كمون منخفض، NUMA-pinned، أحمال عمل RT |
| وحدات المعالجة المركزية المحظورة | هجين: توازن، لكن حماية النوى المعزولة |
نمط حساس لكمون منخفض
# إعداد كمون منخفض نموذجي: توقف الموازن، دبوس NIC IRQs بالقرب من عقدة NUMA للتطبيق
sudo systemctl stop irqbalance
sudo systemctl disable irqbalance
# ثم اضبط smp_affinity لـ IRQs للـ NIC للنوى على نفس عقدة NUMA
الاقتران مع numactl بحيث يعيش ذاكرة التطبيق ومعالجة المقاطعة على نفس عقدة NUMA — معالجة المقاطعات عبر العقد هي مصدر كمون مخفي كلاسيكي.
التحقق من التغيير
| الفحص | الأمر |
|---|
| انتشار المقاطعات | mpstat -I SUM -P ALL 1 |
| تحميل softirq | top → %si لكل CPU |
| إنتاجية الشبكة | sar -n DEV 1 |
| عدادات IRQ | watch 'cat /proc/interrupts' |
النجاح يبدو مثل عد المقاطعات التي تنمو بشكل متساوي عبر الأنوية المقصودة (أو مركزة بالضبط على الأنوية التي اخترتها).
irqbalance مقابل ضبط ذي الصلة
| الأداة | الدور |
|---|
| irqbalance | توزيع IRQs عبر CPUs |
| numactl | ربط العملية CPU/memory إلى عقد NUMA |
| cpupower | التحكم في التردد/حالات الخمول |
| tuned | ملفات تعريف النظام بالكامل (قد تدير irqbalance) |
| RPS/RFS | توجيه الحزمة من جانب البرنامج |
الموارد