مدیریت محدودیت منابع کاربران در لینوکس

در لینوکس هر کاربر می تواند تا سقف معینی از منابع را مصرف کند برای مثال، هر کاربر(در سطح پروسس) به طور پیش فرض حداکثر می تواند تعداد 1024 فایل باز در سیستم داشته باشد(ردهت) این محدودیتها در مورد تعداد پروسسها، اندازه فایلها، انداز core file و … هم برای کاربران مختلف وجود دارد.


برای مدیریت این محدودیتها، نیاز است تا با فایلها، مفاهیم و دستوراتی اشنا بود. ulimit یکی از این دستورات است که با سوییچ a، وضیعت فعلی محدودیتها را برای هر کاربر نشان می دهد(قسمتی از خروجی این دستور):

[usef@amd1 ~]$ ulimit -a
core file size (blocks, -c) 0
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 13700

برای تغییر هر کدام از این محدودیتها، می توانیم از دستور ulimit به همراه سوییچ مدنظر استفاده کنیم(سوییچ مربوط به هر کدام از محدودیتها، در خروجی دستور قبلی قابل مشاهده است).
برای مثال، کاهش “محدودیت تعداد فایلهای باز”(open files) کاربر usef از مقدار پیش فرض به عدد یک، با دستور زیر قابل انجام است:

[usef@amd1 ~]$ ulimit -n 1

با این دستور، کاربر usef(در سطح یک پروسس = PID) نمی تواند به طور همزمان بیش از یک فایل باز داشته باشد:

[usef@amd1 ~]$ vi a
-bash: start_pipeline: pgrp pipe: Too many open files

نکته 1: هر کاربر در بدو شروع کار، تعدادی فایل باز هم خواهد داشت(با اجرای هر برنامه حداقل سه فایل stdin – stdout – stderr باز خواهند شد) که با دستور lsof می توان این فایلهای باز را مشاهده کرد برای مثال، دستور زیر مشخصات فایلهای باز کاربر usef را نشان می دهد:

[root@amd1 ~]# lsof -u usef

همچنین برای مشاهده تعداد فایلهای باز در سطح یک پروسس(برای مثال 4943)، می توان از دستور زیر استفاده کرد:

lsof -p 4943|wc -l

نکته 2: با باز کردن یک فایل با دستوراتی چون tail -f، یک پروسس جدید هم ایجاد خواهد شد که مسئولیت این دستور با ان پروسس خواهد بود بنابرین این فایل را نباید به حساب فایلهای باز ترمینال جاری(پروسس پدر) گذاشت و به تعداد فایلهای باز ان، اضافه نخواهد شد.

همچنین این تنظیمات برای محدودیت تعداد پروسسها(max user processes) هم قابل اعمال است برای مثال با تنظیم این پارامتر به مقدار یک، با اجرای اولین دستور، با خطا مواجه خواهیم شد:

[usef@amd1 ~]$ ulimit -u 1
[usef@amd1 ~]$ df -h
-bash: fork: retry: No child processes

زمانی که این محدودیتها را با دستور ulimit تنظیم می کنیم، این تنظیمات با خروج کاربر(پروسس جاری) از سیستم از بین خواهد رفت، بعبارتی دیگر، با ورود مجدد کاربر و ایجاد پروسس جدید، تنظیمات هم به حالت اولیه برمی گردند!
برای تنظیم پایدار این محدودیتها، باید از فایل limit.conf و یا پوشه limit.d در مسیر /etc/security/ استفاده کرد(البته می توان از فایلهای چون .bashrc هم به این منظور استفاده کرد). در صورتی که قصد ایجاد فایل مجزا برای تنظیمات مدنظر داشته باشیم، می توانیم فایلی را در زیر پوشه limit.d ایجاد کنیم در غیر این صورت، می توان تنظیمات مدنظر را به فایل limit.conf اضافه کرد:

[root@amd1 ~]# vi /etc/security/limits.conf

برای افزودن خطوط به این فایل، باید با ساختار ان اشنا بود:

#<domain> <type> <item> <value>

مثال:

grid soft nofile 1000
grid hard nofile 65536

در این مثال grid همان نام کاربر است و ایتم nofile نماینگر تعداد فایلهای باز(open files) می باشد همچنین از دو نوع محدودیت در این مثال استفاده شده است که هر کدام معانی زیر را دارند:
محدودیت نوع soft: این نوع محدودیت مشخص می کند که به صورت پیش فرض سقف تعداد فایلهای باز(open files) برای کاربر grid چه عددی باشد؟!

[grid@amd1 ~]$ ulimit -n
1000

محدودیت نوع hard: کاربر grid حداکثر تا چه عددی می تواند این محدودیت(محدودیت نوع soft) را افزایش دهد؟

[grid@amad1 ~]$ ulimit -n 75000
-bash: ulimit: open files: cannot modify limit: Operation not permitted

[grid@amad1 ~]$ ulimit -n 65536
[grid@amad1 ~]$ ulimit -n
65536

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *