NUMACTL(8) Linux Administrator's Manual NUMACTL(8)

numactl - کنترل و تنظیم خط‌مشی‌های تخصیص حافظه و اجرای فرآیندها در معماری NUMA

numactl [ --all ] [ --balancing ] [ --interleave nodes ] [ --weighted-interleave nodes ] [ --preferred node ] [ --preferred-many nodes ] [ --membind nodes ] [ --cpunodebind nodes ] [ --physcpubind cpus ] [ --localalloc ] [--] command {arguments ...}
numactl --show
numactl --hardware [--cpu-compress]
numactl --version
numactl [ --huge ] [ --offset offset ] [ --shmmode shmmode ] [ --length length ] [ --strict ]
[ --shmid id ] --shm shmkeyfile | --file tmpfsfile
[ --touch ] [ --dump ] [ --dump-nodes ] memory policy

دستور numactl فرآیندها را با یک خط‌مشی مشخص زمان‌بندی یا تخصیص حافظه در معماری NUMA اجرا می‌کند. این خط‌مشی برای دستور تعیین شده و به تمامی فرزندان آن به ارث می‌رسد. علاوه بر این، می‌تواند خط‌مشی ماندگاری را برای بخش‌های حافظه اشتراکی یا فایل‌ها تنظیم کند.

اگر از گزینه‌هایی در دستور استفاده می‌کنید که ممکن است با گزینه‌های numactl اشتباه گرفته شوند، قبل از دستور از -- استفاده نمایید.

شناسه nodes را می‌توان به صورت N,N,N یا N-N یا N,N-N یا N-N,N-N و به همین ترتیب مشخص کرد. گره‌های نسبی (relative nodes) را می‌توان به صورت +N,N,N یا +N-N یا +N,N-N و غیره مشخص نمود. علامت + نشان می‌دهد که شماره گره‌ها نسبت به مجموعه گره‌های مجاز فرآیند در cpuset فعلی آن هستند. نماد !N-N نشان‌دهنده معکوس N-N است، به عبارت دیگر تمام گره‌ها به جز N-N. در صورت استفاده همراه با نماد +، باید به صورت !+N-N مشخص شود. هنگامی که same مشخص شود، از ماسک گره (nodemask) قبلی مشخص‌شده در خط فرمان استفاده می‌شود. مقدار all به معنی تمام گره‌های موجود در cpuset فعلی است.

به جای عدد، یک گره می‌تواند به صورت زیر نیز مشخص شود:

netdev:DEV گره متصل به دستگاه شبکه DEV.
file:PATH گره مربوط به دستگاه بلوکی PATH.
ip:HOST گره مربوط به دستگاه شبکه HOST.
block:PATH گره مربوط به دستگاه بلوکی PATH.
pci:[seg:]bus:dev[:func] گره مربوط به یک دستگاه PCI.

توجه داشته باشید که block نام دستگاه‌های بلوکی هسته را تحلیل می‌کند؛ برای نام‌های udev در /dev از file: استفاده کنید.

تنظیمات خط‌مشی عبارتند از:
غیرفعال کردن آگاهی پیش‌فرض از cpuset، به طوری که کاربر بتواند از تمام پردازنده‌ها/گره‌های ممکن برای تنظیمات خط‌مشی بعدی استفاده کند.
تنظیم خط‌مشی درهم‌بافی (interleave) حافظه. حافظه با استفاده از روش نوبت‌گردشی (round robin) روی nodes تخصیص داده می‌شود. هنگامی که نتوان حافظه را روی هدف درهم‌بافی فعلی تخصیص داد، به گره‌های دیگر رجوع می‌شود. می‌توان چندین گره را در --interleave، --membind و --cpunodebind مشخص کرد.
تنظیم یک خط‌مشی درهم‌بافی وزن‌دار حافظه. حافظه با استفاده از نسبت وزن‌دار برای هر گره تخصیص می‌یابد، که می‌توان آن را از /sys/kernel/mm/mempolicy/weighted_interleave/node* خواند. هنگامی که امکان تخصیص حافظه روی هدف درهم‌بافی فعلی وجود نداشته باشد، به گره‌های دیگر رجوع می‌شود.
تخصیص حافظه تنها از گره‌های مشخص‌شده. در صورتی که حافظه کافی روی این گره‌ها موجود نباشد، تخصیص حافظه با شکست مواجه می‌شود. شناسه nodes را می‌توان همان‌طور که در بالا ذکر شد مشخص کرد.
تنها اجرای command روی پردازنده‌های nodes. توجه داشته باشید که گره‌ها ممکن است شامل چندین پردازنده باشند. شناسه nodes را می‌توان همان‌طور که در بالا ذکر شد مشخص کرد.
تنها اجرای process روی cpus. این گزینه شماره‌های پردازنده را همان‌طور که در فیلدهای processor فایل /proc/cpuinfo نشان داده شده است، یا پردازنده‌های نسبی نسبت به cpuset فعلی را می‌پذیرد. می‌توانید "all" را مشخص کنید که به معنی تمام پردازنده‌ها در cpuset فعلی است. پردازنده‌های فیزیکی (cpus) را می‌توان به صورت N,N,N یا N-N یا N,N-N یا N-N,N-N و غیره مشخص کرد. پردازنده‌های نسبی (relative cpus) را می‌توان به صورت +N,N,N یا +N-N یا +N,N-N و غیره مشخص کرد. علامت + نشان می‌دهد که شماره پردازنده‌ها نسبت به مجموعه پردازنده‌های مجاز فرآیند در cpuset فعلی آن سنجیده می‌شوند. نماد !N-N نشان‌دهنده معکوس N-N است، به عبارت دیگر تمام پردازنده‌ها به جز N-N. در صورت استفاده با نماد +، باید به صورت !+N-N مشخص شود.
تلاش برای تخصیص حافظه روی گره فعلی فرآیند، اما اگر حافظه در آنجا قابل تخصیص نباشد، به گره‌های دیگر رجوع می‌شود.
ترجیحاً تخصیص حافظه روی node، اما در صورتی که امکان تخصیص حافظه در آنجا وجود نداشته باشد، به گره‌های دیگر رجوع می‌شود. این گزینه تنها یک شماره گره دریافت می‌کند. می‌توان از نشانه‌گذاری نسبی نیز استفاده کرد.
فعال‌سازی تعادل‌بخشی NUMA در هسته لینوکس برای فرآیند، در صورتی که توسط هسته پشتیبانی شود. این گزینه فقط باید همراه با --membind, -m استفاده شود، در غیر این صورت نادیده گرفته می‌شود.
ترجیحاً تخصیص حافظه روی nodes، اما در صورتی که امکان تخصیص حافظه در آنجا وجود نداشته باشد، به گره‌های دیگر رجوع می‌شود. این گزینه ماسکی از گره‌های ترجیحی را می‌پذیرد که در آن نزدیک‌ترین گره به حالت محلی به عنوان دارای بالاترین اولویت در نظر گرفته می‌شود. می‌توان از نشانه‌گذاری نسبی استفاده کرد.
نمایش تنظیمات خط‌مشی NUMA فرآیند فعلی.
نمایش فهرست گره‌های موجود در سیستم. هنگامی که گزینه --cpu-compress تنظیم شده باشد، محدوده‌های پردازنده را نمایش می‌دهد. این حالت پیش‌فرض نیست تا اسکریپت‌های موجود دچار اختلال نشوند.
ابزار numactl می‌تواند خط‌مشی را برای یک بخش حافظه اشتراکی SYSV یا فایلی در shmfs/hugetlbfs تنظیم کند.
چاپ نسخه بسته numactl و خروج.
تنظیمات خط‌مشی زیر ماندگار هستند و توسط تمام نگاشت‌های حاصل از آن حافظه اشتراکی استفاده خواهند شد. ترتیب گزینه‌ها در اینجا اهمیت دارد.
مشخصات باید حداقل شامل یکی از گزینه‌های --shm، --shmid یا --file برای مشخص کردن بخش حافظه اشتراکی یا فایل، و یک خط‌مشی حافظه همان‌طور که در بالا توضیح داده شد باشد (مانند --interleave، --localalloc، --preferred، --preferred-many یا --membind).
هنگام ایجاد یک بخش حافظه اشتراکی SYSV، از صفحات بزرگ (huge pages) استفاده می‌کند. تنها قبل از --shmid یا --shm معتبر است.
مشخص کردن آفست در بخش حافظه اشتراکی. پیش‌فرض 0 است. واحدهای معتبر عبارتند از m (برای مگابایت)، g (برای گیگابایت)، k (برای کیلوبایت)، در غیر این صورت بر حسب بایت مشخص می‌شود.
در صورتی که صفحه‌ای در ناحیه دارای خط‌مشی در بخش حافظه اشتراکی قبلاً با یک خط‌مشی متناقض واکشی (faulted in) شده باشد، خطا صادر می‌کند. رفتار پیش‌فرض نادیده گرفتن خاموش این مورد است.
تنها قبل از --shmid یا --shm معتبر است. هنگام ایجاد یک بخش حافظه اشتراکی، حالت دسترسی عددی آن را روی shmmode تنظیم می‌کند.
اعمال خط‌مشی به محدوده length در بخش حافظه اشتراکی یا تنظیم طول بخش برابر با این مقدار. پیش‌فرض استفاده از طول باقی‌مانده است. هنگام ایجاد یک بخش حافظه اشتراکی الزامی است و در این حالت طول بخش جدید را مشخص می‌کند. واحدهای معتبر عبارتند از m (برای مگابایت)، g (برای گیگابایت)، k (برای کیلوبایت)، در غیر این صورت بر حسب بایت مشخص می‌شود.
ایجاد یا استفاده از یک بخش حافظه اشتراکی با شناسه عددی id.
ایجاد یا استفاده از یک بخش حافظه اشتراکی، با شناسه‌ای که با استفاده از ftok(3) از shmkeyfile تولید شده است.
تنظیم خط‌مشی برای یک فایل در tmpfs یا hugetlbfs.
لمس کردن صفحات برای اعمال زودهنگام خط‌مشی. حالت پیش‌فرض عدم لمس آن‌هاست؛ خط‌مشی زمانی اعمال می‌شود که برنامه‌ای صفحه را نگاشت کرده و به آن دسترسی پیدا کند.
تخلیه و نمایش (dump) خط‌مشی در محدوده مشخص‌شده.
نمایش تمام گره‌های محدوده مشخص‌شده (بسیار پرجزئیات!).
مشخص‌کننده‌های معتبر گره:
all همه گره‌ها
number شماره گره
number1{,number2} گره number1 و گره number2
number1-number2 گره‌ها از number1 تا number2
! nodes معکوس کردن انتخاب مشخصات بعدی

numactl --physcpubind=+0-4,8-12 myapplic arguments

اجرای myapplic روی پردازنده‌های 0-4 و 8-12 از cpuset فعلی.

numactl --interleave=all bigdatabase arguments
اجرای bigdatabase با حافظه درهم‌بافته‌شده روی تمام پردازنده‌ها.
numactl --weighted-interleave=all bigdatabase arguments
اجرای bigdatabase با حافظه درهم‌بافته‌شده با نسبت وزن‌دار روی تمام پردازنده‌ها.
numactl --cpunodebind=0 --membind=0,1 process
اجرای process روی گره 0 همراه با تخصیص حافظه روی گره‌های 0 و 1.
numactl --cpunodebind=0 --membind=0,1 -- process -l
اجرای فرآیند مانند بالا، اما با گزینه‌ای (-l) که ممکن است با گزینه‌های numactl اشتباه گرفته شود.
numactl --cpunodebind=0 --balancing --membind=0,1 process
اجرای process روی گره 0 با تخصیص حافظه روی گره‌های 0 و 1. بهینه‌سازی جای‌گذاری صفحات با مکانیزم تعادل‌بخشی NUMA هسته لینوکس در صورت امکان.
numactl --cpunodebind=netdev:eth0 --membind=netdev:eth0 network-server
اجرای network-server روی گره دستگاه شبکه eth0 به طوری که حافظه آن نیز در همان گره باشد.
numactl --preferred=1 numactl --show
تنظیم گره ترجیحی 1 و نمایش وضعیت حاصل.
numactl --preferred-many=0x3 numactl --show
تنظیم گره‌های ترجیحی 1 و 2، و نمایش وضعیت حاصل.
numactl --length 1g --shm /tmp/shmkey --interleave=all
درهم‌بافی کل ناحیه حافظه اشتراکی sysv به اندازه 1g که توسط /tmp/shmkey مشخص شده است بر روی تمام گره‌ها.

قرار دادن یک فایل tmpfs روی ۲ گره:

numactl --membind=2 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
numactl --membind=3 dd if=/dev/zero of=/dev/shm/A seek=1024 bs=1M count=1024
numactl --localalloc /dev/shm/file
بازنشانی خط‌مشی برای فایل حافظه اشتراکی file به خط‌مشی پیش‌فرض localalloc.

نیازمند هسته‌ای است که از خط‌مشی NUMA پشتیبانی کند (NUMA policy aware).

دستور با استفاده از یک شل اجرا نمی‌شود. اگر می‌خواهید از نویسه‌های کنترلی (metacharacters) شل در فرزند استفاده کنید، از sh -c به عنوان بسته‌بندی‌کننده (wrapper) استفاده نمایید.

تنظیم خط‌مشی برای یک فایل hugetlbfs در حال حاضر کار نمی‌کند، زیرا نمی‌توان آن را با truncate گسترش داد.

بخش‌های حافظه اشتراکی که بزرگتر از فضای آدرس numactl باشند را نمی‌توان به طور کامل تحت پوشش خط‌مشی قرار داد. این موضوع ممکن است در معماری‌های ۳۲ بیتی مشکل‌ساز باشد. تغییر دادن آن به صورت تکه‌تکه ممکن است کارساز باشد.

گزینه قدیمی --cpubind که شماره‌های گره (و نه شماره‌های پردازنده) را می‌پذیرفت منسوخ شده و با گزینه‌های جدید --cpunodebind و --physcpubind جایگزین شده است.

/proc/cpuinfo برای فهرست پردازنده‌های فعال. برای جزئیات بیشتر به proc(5) مراجعه کنید.

/sys/devices/system/node/node*/numastat برای آمار اصابت حافظه (memory hit) در معماری NUMA.

Copyright 2002,2004 Andi Kleen, SuSE Labs. ابزار numactl و برنامه‌های نمایشی تحت مجوز عمومی همگانی گنو، نسخه ۲ (GNU GPL v.2) منتشر شده‌اند.

set_mempolicy(2) , get_mempolicy(2) , mbind(2) , sched_setaffinity(2) , sched_getaffinity(2) , proc(5) , ftok(3) , shmat(2) , migratepages(8)

Mar 2004 SuSE Labs