/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
است.