numactl - ربط الذاكرة والمعالج NUMA
numactl تحكم سياسة NUMA (الوصول غير الموحد للذاكرة) للعمليات. على خوادم متعددة المقابس، الذاكرة المرفقة بمقبس وحدة المعالجة المركزية الواحدة (عقدة) أسرع لتلك المقابس للوصول من الذاكرة على عقدة أخرى؛ عملية ترتد بين العقد تدفع عقوبة زمن انتظار. يسمح لك numactl بـ ربط عملية بعقد NUMA محددة — تثبيت وحدات المعالجة المركزية والذاكرة إلى نفس العقدة — والذي يمكن أن يحسن بشكل كبير الأداء لأحمال العمل المرتبطة بالذاكرة مثل قواعس البيانات وأعمال HPC.
التثبيت
| النظام الأساسي | الأمر |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| التحقق | numactl --version |
فحص الطوبولوجيا
| الأمر | يظهر |
|---|
numactl --hardware (-H) | عقد NUMA وحدات المعالجة المركزية لكل عقدة والذاكرة والمسافات |
numactl --show (-s) | سياسة NUMA للعملية الحالية |
numastat | إحصائيات تخصيص الذاكرة لكل عقدة Hit/miss |
lscpu | تعيين CPU إلى عقدة (وحدات معالج NUMA) |
# اعرض عدد عقد NUMA ووحدات المعالجة المركزية/الذاكرة المتعلقة بكل واحد
numactl --hardware
ربط العملية
| الأمر | التأثير |
|---|
numactl --cpunodebind=0 --membind=0 ./app | تشغيل على وحدات المعالجة المركزية والذاكرة بالعقدة 0 |
numactl -N 1 -m 1 ./app | شكل قصير: وحدات المعالجة المركزية + الذاكرة للعقدة 1 |
numactl --physcpubind=0-7 ./app | الربط بنوى CPU محددة |
numactl --membind=0,1 ./app | السماح بالذاكرة من العقد 0 و 1 |
numactl --interleave=all ./app | انشر الذاكرة عبر جميع العقد (round-robin) |
سياسات الذاكرة
| السياسة | العلم | المعنى |
|---|
| الربط | --membind=NODES | تخصيص فقط من هذه العقد (فشل إذا كان ممتلئاً) |
| المفضل | --preferred=NODE | تفضيل عقدة والعودة إذا لزم الأمر |
| بين | --interleave=NODES | Round-robin عبر العقد (النطاق الترددي) |
| محلي | --localalloc | تخصيص على العقدة التي تعمل عليها الخيط |
متى تستخدم أيهما
| الهدف | السياسة |
|---|
| حساس الكمون وملاءم في عقدة واحدة | --cpunodebind=N --membind=N (co-locate) |
| مرتبط بالنطاق الترددي وبصمة كبيرة | --interleave=all |
| في الغالب عقدة واحدة ، انسكاب عرضي | --preferred=N |
| دع النواة تقرر محلياً | --localalloc |
سير العمل العام
# دبوس قاعدة البيانات إلى العقدة 0 لتجنب زمن انتظار الذاكرة عبر العقد
numactl --cpunodebind=0 --membind=0 postgres -D /data
# عملية تحليلات ثقيلة النطاق الترددي: بين الذاكرة عبر جميع العقد
numactl --interleave=all ./analytics-job
# احتياطي نوى محددة لعملية الوقت الفعلي
numactl --physcpubind=8-15 --membind=1 ./rt-app
# تحقق من سياسة الإعداد التشغيل
numactl --show
أدوات الضبط ذات الصلة
| الأداة | الدور |
|---|
| numactl | تعيين سياسة NUMA CPU/الذاكرة لكل عملية |
numastat | مراقبة كفاءة تخصيص لكل عقدة |
taskset | تقاربة CPU (بدون سياسة ذاكرة NUMA) |
cpupower | ضبط تردد المعالج/المحافظ |
نواة numa_balancing | موازنة NUMA التلقائية (/proc/sys/kernel) |
زوج numactl مع cpupower للتحكم في التردد؛ استخدم numastat للتأكد من أن الربط الخاص بك قلل بالفعل الأخطاء عبر العقد.
التحقق من الفوز
# قبل/بعد: مشاهدة numa_miss / numa_foreign انخفاض بعد الربط
numastat -p $(pgrep -n app)
ارتفاع numa_miss / numa_foreign يعني أن الذاكرة يتم تقديمها من عقدة بعيدة — بالضبط ما يصلحه الربط.
الموارد