proc_sys_vm(5) File Formats Manual proc_sys_vm(5)

/proc/sys/vm/ - زیرسیستم حافظه مجازی

/proc/sys/vm/
این دایرکتوری شامل فایل‌هایی برای تنظیم و بهینه‌سازی مدیریت حافظه، بافر و مدیریت حافظه نهان (کش) است.
/proc/sys/vm/admin_reserve_kbytes (از لینوکس 3.10)
این فایل مقدار حافظه آزاد (به کیلوبایت، KiB) در سامانه را که باید برای کاربران دارای قابلیت CAP_SYS_ADMIN رزرو شود، مشخص می‌کند.
مقدار پیش‌فرض در این فایل، کمینهٔ [۳٪ از صفحه‌های آزاد، ۸ مبی‌بایت] است که به صورت KiB بیان می‌شود. این پیش‌فرض به گونه‌ای طراحی شده تا حافظه کافی برای کاربر ممتاز (superuser) فراهم کند تا در صورت لزوم بتواند وارد سیستم شده و فرآیندی را متوقف کند (kill کند)، تحت حالت پیش‌فرض حدس زدن overcommit (یعنی 0 در /proc/sys/vm/overcommit_memory).
سامانه‌هایی که در حالت «overcommit هرگز» (یعنی 2 در /proc/sys/vm/overcommit_memory) اجرا می‌شوند، باید مقدار این فایل را افزایش دهند تا کل اندازه حافظه مجازی برنامه‌های مورد استفاده برای بازیابی را در بر گیرد (مانند login(1)، ssh(1) و top(1)). در غیر این صورت، ممکن است کاربر ممتاز نتواند برای بازیابی سامانه وارد سیستم شود. برای نمونه، در معماری x86-64 یک مقدار مناسب 131072 (۱۲۸ مبی‌بایت رزرو شده) است.
تغییر مقدار این فایل هر بار که یک برنامه درخواست حافظه کند، اعمال می‌شود.
/proc/sys/vm/compact_memory (از لینوکس 2.6.35)
هنگامی که 1 در این فایل نوشته شود، تمام ناحیه‌ها (zoneها) فشرده‌سازی می‌شوند به‌طوری‌که حافظه آزاد در صورت امکان در بلوک‌های پیوسته در دسترس قرار گیرد. اثر این عمل را می‌توان با بررسی /proc/buddyinfo مشاهده کرد.
تنها در صورتی وجود دارد که هسته با CONFIG_COMPACTION پیکربندی شده باشد.
/proc/sys/vm/drop_caches (از لینوکس 2.6.16)
نوشتن در این فایل باعث می‌شود هسته حافظه‌های نهان پاک (clean caches)، مدخل‌های دایرکتوری (dentries) و اینودها (inodes) را از حافظه آزاد کند و موجب آزاد شدن آن حافظه شود. این کار می‌تواند برای آزمایش مدیریت حافظه و اجرای بنچمارک‌های تکرارپذیر سیستم‌فایل مفید باشد. از آنجا که نوشتن در این فایل باعث از دست رفتن مزایای حافظه نهان (کش) می‌شود، می‌تواند کارایی کلی سامانه را کاهش دهد.
برای آزاد کردن pagecache، استفاده کنید از:

echo 1 > /proc/sys/vm/drop_caches

برای آزاد کردن dentries و inodes، استفاده کنید از:

echo 2 > /proc/sys/vm/drop_caches

برای آزاد کردن pagecache، dentries و inodes، استفاده کنید از:

echo 3 > /proc/sys/vm/drop_caches

از آنجا که نوشتن در این فایل یک عملیات غیرمخرب است و اشیاء کثیف (dirty objects) قابل آزادسازی نیستند، کاربر ابتدا باید sync(1) را اجرا کند.
/proc/sys/vm/hugetlb_shm_group (از لینوکس 2.6.7)
این فایل قابل نوشتن، شامل شناسه گروهی (GID) است که اجازه دارد با استفاده از صفحه‌های بزرگ (huge pages) حافظه تخصیص دهد. اگر فرآیندی دارای شناسه گروه سیستم‌فایل یا هر شناسه گروه تکمیلی باشد که با این شناسه گروه مطابقت داشته باشد، می‌تواند بدون داشتن قابلیت CAP_IPC_LOCK تخصیص‌های huge-page را انجام دهد؛ ببینید: memfd_create(2)، mmap(2) و shmget(2).
/proc/sys/vm/legacy_va_layout (از لینوکس 2.6.9)
اگر غیرصفر باشد، چیدمان جدید نگاشت حافظه ۳۲ بیتی را غیرفعال می‌کند؛ هسته برای همه فرآیندها از چیدمان سنتی (2.4) استفاده خواهد کرد.
/proc/sys/vm/memory_failure_early_kill (از لینوکس 2.6.32)
کنترل نحوه کشتن فرآیندها در زمانی که یک خطای حافظه تصحیح‌نشده (معمولاً یک خطای ۲ بیتی در یک ماژول حافظه) که هسته قادر به مدیریت آن نیست، در پس‌زمینه توسط سخت‌افزار شناسایی شود. در برخی موارد (مانند زمانی که صفحه هنوز یک نسخه معتبر روی دیسک دارد)، هسته این خطا را به‌طور شفاف و بدون اثرگذاری بر هیچ برنامه‌ای مدیریت می‌کند. اما اگر هیچ نسخه به‌روز دیگری از داده‌ها وجود نداشته باشد، برای جلوگیری از انتشار خرابی داده‌ها، فرآیندها را خواهد کشت.
این فایل دارای یکی از مقادیر زیر است:
1
کشتن تمام فرآیندهایی که صفحهٔ خراب‌شده و غیرقابل‌بارگذاری‌مجدد را نگاشت کرده‌اند، به محض شناسایی خرابی. توجه داشته باشید که این مورد برای چند نوع صفحه، مانند داده‌های تخصیص‌یافته داخلی هسته یا swap cache پشتیبانی نمی‌شود، اما برای بیشتر صفحات کاربری کار می‌کند.
0
لغو نگاشت (unmap) صفحه خراب‌شده از تمام فرآیندها و کشتن فرآیند تنها در صورتی که تلاش کند به آن صفحه دسترسی پیدا کند.
عملیات kill با استفاده از سیگنال SIGBUS با si_code تنظیم‌شده روی BUS_MCEERR_AO انجام می‌شود. فرآیندها در صورت تمایل می‌توانند این سیگنال را مدیریت کنند؛ برای جزئیات بیشتر به sigaction(2) مراجعه کنید.
این ویژگی تنها در معماری‌ها/پلتفرم‌هایی با مدیریت پیشرفته بررسی ماشین (machine check handling) فعال است و به قابلیت‌های سخت‌افزار بستگی دارد.
برنامه‌ها می‌توانند تنظیم memory_failure_early_kill را به صورت جداگانه با عملیات PR_MCE_KILL در فراخوان prctl(2) بازنویسی کنند.
تنها در صورتی وجود دارد که هسته با CONFIG_MEMORY_FAILURE پیکربندی شده باشد.
/proc/sys/vm/memory_failure_recovery (از لینوکس 2.6.32)
فعال‌سازی بازیابی خطای حافظه (در صورت پشتیبانی پلتفرم).
1
تلاش برای بازیابی.
0
همیشه هنگام بروز خطای حافظه، وحشت هسته (panic) رخ دهد.
تنها در صورتی وجود دارد که هسته با CONFIG_MEMORY_FAILURE پیکربندی شده باشد.
/proc/sys/vm/oom_dump_tasks (از لینوکس 2.6.25)
تولید تخلیه اطلاعات وظایف در سراسر سامانه (به‌استثنای رشته‌های هسته) را در زمانی که هسته عملیات OOM-killing را انجام می‌دهد، فعال می‌کند. این اطلاعات خروجی برای هر وظیفه (رشته، فرآیند) شامل موارد زیر است: شناسه رشته، شناسه کاربر واقعی، شناسه گروه رشته (شناسه فرآیند)، اندازه حافظه مجازی، اندازه مجموعه مقیم (resident set size)، پردازنده‌ای (CPU) که وظیفه روی آن زمان‌بندی شده است، امتیاز oom_adj (توضیحات /proc/pid/oom_adj را ببینید)، و نام دستور. این اطلاعات برای تعیین اینکه چرا OOM-killer فعال شد و شناسایی وظیفه متخلفی که باعث آن شده، سودمند است.
اگر این فایل حاوی مقدار صفر باشد، از چاپ این اطلاعات جلوگیری می‌شود. در سامانه‌های بسیار بزرگ با هزاران وظیفه، ممکن است ثبت اطلاعات وضعیت حافظه برای هر یک از آن‌ها عملی نباشد. چنین سامانه‌هایی در شرایط OOM نباید ناچار به تحمل افت کارایی برای اطلاعاتی شوند که ممکن است مورد نیاز نباشد.
اگر روی مقداری غیرصفر تنظیم شود، هر زمان که OOM-killer فرآیند بلعنده‌ی حافظه‌ای را واقعاً بکشد، این اطلاعات نمایش داده می‌شوند.
مقدار پیش‌فرض 0 است.
/proc/sys/vm/oom_kill_allocating_task (از لینوکس 2.6.24)
کشتن وظیفه‌ای که در شرایط کمبود حافظه (out-of-memory) باعث تحریک OOM شده است را فعال یا غیرفعال می‌کند.
اگر این مقدار روی صفر تنظیم شود، OOM-killer کل فهرست وظایف (tasklist) را بررسی کرده و وظیفه‌ای را بر اساس روش‌های اکتشافی برای کشتن انتخاب می‌کند. این کار معمولاً یک وظیفه متخلف بلعنده‌ی حافظه را انتخاب می‌کند که با کشته شدنش مقدار زیادی حافظه آزاد می‌شود.
اگر این مقدار روی غیرصفر تنظیم شود، OOM-killer صرفاً وظیفه‌ای را می‌کشد که شرایط کمبود حافظه را تحریک کرده است. این کار از یک جستجوی احتمالاً پرهزینه در کل فهرست وظایف جلوگیری می‌کند.
اگر /proc/sys/vm/panic_on_oom غیرصفر باشد، بر هر مقداری که در /proc/sys/vm/oom_kill_allocating_task استفاده شده، اولویت خواهد داشت.
مقدار پیش‌فرض 0 است.
/proc/sys/vm/overcommit_kbytes (از لینوکس 3.14)
این فایل قابل نوشتن، جایگزینی برای /proc/sys/vm/overcommit_ratio جهت کنترل CommitLimit در زمانی است که /proc/sys/vm/overcommit_memory دارای مقدار 2 باشد. این فایل اجازه می‌دهد مقدار overcommitting حافظه به صورت یک مقدار مطلق (به kB) مشخص شود، به جای اینکه مانند overcommit_ratio به صورت درصدی باشد. این کار امکان کنترل دقیق‌تر CommitLimit را در سامانه‌هایی با حافظه بسیار زیاد فراهم می‌کند.
تنها یکی از overcommit_kbytes یا overcommit_ratio می‌تواند اثرگذار باشد: اگر overcommit_kbytes دارای مقدار غیرصفر باشد، برای محاسبه CommitLimit استفاده می‌شود، در غیر این صورت overcommit_ratio به کار گرفته می‌شود. نوشتن یک مقدار در هر یک از این فایل‌ها باعث می‌شود مقدار فایل دیگر روی صفر تنظیم شود.
/proc/sys/vm/overcommit_memory
این فایل شامل حالت حسابداری حافظه مجازی هسته است. مقادیر عبارتند از:
0: تخصیص بیش‌از‌حد اکتشافی (heuristic overcommit ‏- این حالت پیش‌فرض است)
1: همیشه overcommit انجام شود، هرگز بررسی نشود
2: همیشه بررسی شود، هرگز overcommit انجام نشود
در حالت 0، فراخوانی‌های mmap(2) با MAP_NORESERVE بررسی نمی‌شوند، و بررسی پیش‌فرض بسیار ضعیف است، که این امر منجر به خطر کشته شدن یک فرآیند توسط OOM-killer می‌شود.
در حالت 1، هسته وانمود می‌کند که همیشه حافظه کافی وجود دارد، تا زمانی که حافظه واقعاً تمام شود. یک کاربرد برای این حالت، برنامه‌های محاسبات علمی هستند که از آرایه‌های خلوت بزرگ (large sparse arrays) استفاده می‌کنند. پیش از لینوکس 2.6.0، هر مقدار غیرصفری به معنای حالت 1 بود.
در حالت 2 (در دسترس از لینوکس 2.6)، کل فضای آدرس مجازی که می‌توان تخصیص داد (CommitLimit در /proc/meminfo) به این صورت محاسبه می‌شود:

CommitLimit = (total_RAM - total_huge_TLB) *
	      overcommit_ratio / 100 + total_swap

که در آن:
•
total_RAM مقدار کل RAM در سامانه است؛
•
total_huge_TLB مقدار حافظه کنار گذاشته شده برای صفحه‌های بزرگ (huge pages) است؛
•
overcommit_ratio مقدار موجود در /proc/sys/vm/overcommit_ratio است؛ و
•
total_swap مقدار فضای مبادله (swap) است.
برای نمونه، در سامانه‌ای با ۱۶ گیگابایت RAM فیزیکی، ۱۶ گیگابایت swap، بدون اختصاص فضایی به صفحه‌های بزرگ، و overcommit_ratio برابر با ۵۰، این فرمول یک CommitLimit معادل ۲۴ گیگابایت تولید می‌کند.
از لینوکس 3.14، اگر مقدار /proc/sys/vm/overcommit_kbytes غیرصفر باشد، آنگاه CommitLimit به جای آن به این صورت محاسبه می‌شود:

CommitLimit = overcommit_kbytes + total_swap

همچنین توضیحات /proc/sys/vm/admin_reserve_kbytes و /proc/sys/vm/user_reserve_kbytes را ببینید.
/proc/sys/vm/overcommit_ratio (از لینوکس 2.6.0)
این فایل قابل نوشتن، درصدی را تعیین می‌کند که حافظه می‌تواند بر اساس آن به صورت بیش‌از‌حد تخصیص یابد (overcommitted شود). مقدار پیش‌فرض در این فایل 50 است. توضیحات /proc/sys/vm/overcommit_memory را ببینید.
/proc/sys/vm/panic_on_oom (از لینوکس 2.6.18)
این فایل بروز وحشت هسته (panic) در شرایط کمبود حافظه (out-of-memory) را فعال یا غیرفعال می‌کند.
اگر این فایل روی مقدار 0 تنظیم شود، OOM-killer هسته فرآیند متخلفی را خواهد کشت. معمولاً OOM-killer می‌تواند یک فرآیند متخلف را بکشد و سامانه زنده بماند.
اگر این فایل روی مقدار 1 تنظیم شود، هسته معمولاً هنگام وقوع شرایط کمبود حافظه دچار panic می‌شود. با این حال، اگر فرآیندی با استفاده از سیاست‌های حافظه (mbind(2) MPOL_BIND) یا cpusets (cpuset(7)) تخصیص‌ها را به گره‌های خاصی محدود کرده باشد و حافظه آن گره‌ها به اتمام برسد، ممکن است یک فرآیند توسط OOM-killer کشته شود. در این حالت وحشت هسته رخ نمی‌دهد: زیرا حافظه گره‌های دیگر ممکن است آزاد باشد، به این معنی که ممکن است کل سامانه هنوز به شرایط کمبود حافظه نرسیده باشد.
اگر این فایل روی مقدار 2 تنظیم شود، هسته در هنگام وقوع شرایط کمبود حافظه همیشه دچار وحشت (panic) می‌شود.
مقدار پیش‌فرض 0 است. مقادیر 1 و 2 برای شرایط تغییر وضعیت در صورت خرابی (failover) در خوشه‌بندی هستند. هر یک را با توجه به سیاست failover خود انتخاب کنید.
/proc/sys/vm/swappiness
مقدار موجود در این فایل کنترل می‌کند که هسته با چه شدتی صفحه‌های حافظه را مبادله (swap) کند. مقادیر بالاتر شدت را افزایش داده و مقادیر پایین‌تر شدت را کاهش می‌دهند. مقدار پیش‌فرض 60 است.
/proc/sys/vm/user_reserve_kbytes (از لینوکس 3.10)
مقدار حافظه‌ای (به KiB) را برای رزرو شدن به فرآیندهای کاربر مشخص می‌کند. این کار با هدف جلوگیری از راه‌اندازی یک فرآیند بلعنده‌ی حافظه توسط کاربر طراحی شده تا کاربر همچنان بتواند سامانه را بازیابی کند (فرآیند متخلف را بکشد). مقدار این فایل تنها زمانی اثر دارد که /proc/sys/vm/overcommit_memory بر روی 2 (حالت «overcommit هرگز») تنظیم شده باشد. در این حالت، سامانه مقداری از حافظه را رزرو می‌کند که کمینهٔ [۳٪ از اندازه فرآیند فعلی، user_reserve_kbytes] است.
مقدار پیش‌فرض در این فایل کمینهٔ [۳٪ از صفحه‌های آزاد، 128MiB] است که بر حسب KiB بیان می‌شود.
اگر مقدار این فایل روی صفر تنظیم شود، کاربر اجازه خواهد داشت تمام حافظه آزاد را با یک فرآیند اختصاص دهد (منهای مقداری که توسط /proc/sys/vm/admin_reserve_kbytes رزرو شده است). هرگونه تلاش بعدی برای اجرای یک دستور منجر به خطای "fork: Cannot allocate memory" خواهد شد.
تغییر مقدار این فایل هر بار که یک برنامه درخواست حافظه کند، اعمال می‌شود.
/proc/sys/vm/unprivileged_userfaultfd (از لینوکس 5.2)
این فایل (قابل نوشتن) پرچمی را در اختیار می‌گذارد که مشخص می‌کند آیا فرآیندهای فاقد امتیاز (unprivileged) اجازه دارند از userfaultfd(2) استفاده کنند یا خیر. اگر این فایل مقدار 1 داشته باشد، فرآیندهای بدون امتیاز می‌توانند از userfaultfd(2) استفاده کنند. اگر این فایل مقدار 0 داشته باشد، تنها فرآیندهایی که دارای قابلیت CAP_SYS_PTRACE هستند می‌توانند از userfaultfd(2) استفاده نمایند. مقدار پیش‌فرض در این فایل 1 است.

proc(5), proc_sys(5)

2026-02-08 Linux man-pages 6.19