resource --- اطلاعات مصرف منابع¶
این ماژول سازوکارهای پایهای را برای اندازهگیری و کنترل منابع سیستمی که توسط یک برنامه استفاده میشوند، فراهم میکند.
دسترسپذیری: Unix, not WASI.
ثابتهای نمادین برای مشخص کردن منابع سیستمی خاص و درخواست اطلاعات استفاده دربارهی فرایند جاری یا فرزندان آن استفاده میشوند.
در صورت شکست فراخوانی سیستمی، استثنای OSError پرتاب میشود.
محدودیتهای منابع¶
مصرف منابع میتواند با استفاده از تابع setrlimit() که در ادامه توضیح داده شده است، محدود شود. هر منبع با یک جفت حد کنترل میشود: یک حد نرم و یک حد سخت. حد نرم، حد فعلی است و ممکن است در طول زمان توسط یک فرایند کاهش یا افزایش یابد. حد نرم هرگز نمیتواند از حد سخت فراتر رود. حد سخت میتواند به هر مقداری که بزرگتر از حد نرم باشد کاهش یابد، اما نمیتواند افزایش یابد. (تنها فرایندهایی که UID مؤثر ابرکاربر را دارند، میتوانند یک حد سخت را افزایش دهند.)
منابع خاصی که میتوانند محدود شوند، به سیستم وابستهاند. این منابع در صفحه راهنمای getrlimit(2) توضیح داده شدهاند. منابع فهرستشده در زیر زمانی پشتیبانی میشوند که سیستمعامل زیربنایی از آنها پشتیبانی کند؛ منابعی که سیستمعامل نمیتواند آنها را بررسی یا کنترل کند، در این ماژول برای آن پلتفرمها تعریف نشدهاند.
- resource.RLIM_INFINITY¶
ثابتی که برای نشان دادن محدودیت یک منبع نامحدود استفاده میشود.
- resource.getrlimit(resource)¶
یک تاپل
(soft, hard)شامل محدودیتهای نرم و سخت فعلی برای resource برمیگرداند. اگر منبع نامعتبری تعیین شده باشد،ValueErrorپرتاب میکند، یا اگر فراخوانی سیستمی زیربنایی بهطور غیرمنتظرهای شکست بخورد،errorپرتاب میکند.
- resource.setrlimit(resource, limits)¶
محدودیتهای جدید مصرف resource را تنظیم میکند. آرگومان limits باید یک تاپل
(soft, hard)شامل ۲ عدد صحیح باشد که محدودیتهای جدید را توصیف میکند. میتوان از مقدارRLIM_INFINITYبرای درخواست محدودیتی نامحدود استفاده کرد.اگر منبع نامعتبری مشخص شود، اگر محدودیت نرم جدید از محدودیت سخت فراتر رود، یا اگر فرایندی سعی کند محدودیت سخت خود را افزایش دهد،
ValueErrorپرتاب میشود. مشخص کردن محدودیت با مقدارRLIM_INFINITYدر حالی که محدودیت سخت یا محدودیت سیستم برای آن منبع نامحدود نباشد، باعث پرتابValueErrorمیشود. فرایندی با UID مؤثر ابرکاربر میتواند هر مقدار معتبری برای محدودیت، از جمله نامحدود، درخواست کند، اما اگر محدودیت درخواستی از محدودیت اعمالشده از سوی سیستم فراتر رود، همچنانValueErrorپرتاب میشود.همچنین ممکن است
setrlimitدر صورت شکست خوردن فراخوانی سیستمی زیربنایی،errorرا پرتاب کند.VxWorks فقط از تنظیم
RLIMIT_NOFILEپشتیبانی میکند.یک رویداد حسابرسی
resource.setrlimitرا با آرگومانهایresourceوlimitsپرتاب میکند.
- resource.prlimit(pid, resource[, limits])¶
setrlimit()وgetrlimit()را در یک تابع ترکیب میکند و امکان دریافت و تنظیم محدودیتهای منابع یک فرایند دلخواه را فراهم میسازد. اگر pid برابر ۰ باشد، این فراخوانی به فرایند جاری اعمال میشود. resource و limits همان معنایی را دارند که درsetrlimit()دارند، با این تفاوت که limits اختیاری است.هنگامی که limits داده نشود، تابع محدودیت منبع فرایند pid را برمیگرداند. هنگامی که limits داده شود، محدودیت منبع فرایند تنظیم میشود و محدودیت منبع پیشین برگردانده میشود.
ProcessLookupErrorرا هنگامی که pid یافت نشود وPermissionErrorرا هنگامی که کاربرCAP_SYS_RESOURCEبرای فرایند نداشته باشد، پرتاب میکند.یک رویداد حسابرسی
resource.prlimitرا با آرگومانهایpid،resourceوlimitsپرتاب میکند.دسترسپذیری: Linux >= 2.6.36 with glibc >= 2.13.
اضافه شده در نسخهی 3.4.
این نمادها منابعی را تعریف میکنند که مصرف آنها را میتوان با استفاده از توابع setrlimit() و getrlimit() که در ادامه توضیح داده شدهاند، کنترل کرد. مقادیر این نمادها دقیقاً همان ثابتهایی هستند که برنامههای C از آنها استفاده میکنند.
صفحه راهنمای یونیکس برای getrlimit(2) منابع موجود را فهرست میکند. توجه داشته باشید که تمام سیستمها از نماد یا مقدار یکسانی برای نشان دادن یک منبع یکسان استفاده نمیکنند. این ماژول تلاش نمیکند تفاوتهای سکو را بپوشاند --- نمادهایی که برای یک سکو تعریف نشدهاند، در آن سکو از این ماژول در دسترس نخواهند بود.
- resource.RLIMIT_CORE¶
حداکثر اندازهی پرونده core (بر حسب بایت) که فرایند جاری میتواند ایجاد کند. این موضوع ممکن است منجر به ایجاد یک پرونده core ناقص شود، در صورتی که برای دربرگرفتن کل تصویر فرایند به core بزرگتری نیاز باشد.
- resource.RLIMIT_CPU¶
حداکثر مقدار زمان پردازنده (بر حسب ثانیه) که یک فرایند میتواند از آن استفاده کند. در صورت عبور از این محدودیت، یک سیگنال
SIGXCPUبه فرایند ارسال میشود. (برای اطلاعات در مورد نحوهی دریافت این سیگنال و انجام کاری مفید، مثلاً تخلیهی پروندههای باز روی دیسک، مستندات ماژولsignalرا ببینید.)
- resource.RLIMIT_FSIZE¶
حداکثر اندازهی پروندهای که فرایند میتواند ایجاد کند.
- resource.RLIMIT_DATA¶
حداکثر اندازهی انباشت فرایند (به بایت)
- resource.RLIMIT_STACK¶
حداکثر اندازهی پشتهی فراخوانی برای فرایند جاری (بر حسب بایت). این فقط بر پشتهی نخ اصلی در یک فرایند چندنخی تأثیر میگذارد.
- resource.RLIMIT_RSS¶
حداکثر اندازهی مجموعه مقیم (resident set size) که باید در دسترس فرایند قرار گیرد.
- resource.RLIMIT_NPROC¶
حداکثر تعداد فرایندهایی که فرایند جاری میتواند ایجاد کند.
- resource.RLIMIT_NOFILE¶
حداکثر تعداد توصیفگرهای پرونده باز برای فرایند جاری.
- resource.RLIMIT_OFILE¶
نام BSD برای
RLIMIT_NOFILE.
- resource.RLIMIT_MEMLOCK¶
حداکثر فضای آدرسی که میتواند در حافظه قفل شود.
- resource.RLIMIT_VMEM¶
بزرگترین ناحیهی حافظهی نگاشتشده که فرایند ممکن است اشغال کند. معمولاً نام مستعاری از
RLIMIT_ASاست.دسترسپذیری: Solaris, FreeBSD, NetBSD.
- resource.RLIMIT_AS¶
حداکثر ناحیه (به بایت) از فضای آدرس که ممکن است توسط فرایند اشغال شود.
- resource.RLIMIT_MSGQUEUE¶
تعداد بایتهایی که میتوان برای صفهای پیام POSIX تخصیص داد.
دسترسپذیری: Linux >= 2.6.8.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_NICE¶
سقف سطح nice فرایند (که بهصورت 20 - rlim_cur محاسبه میشود).
دسترسپذیری: Linux >= 2.6.12.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_RTPRIO¶
سقف اولویت بیدرنگ.
دسترسپذیری: Linux >= 2.6.12.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_RTTIME¶
محدودیت زمانی (بر حسب میکروثانیه) برای زمان پردازندهای که یک فرایند میتواند تحت زمانبندی بلادرنگ بدون انجام یک فراخوانی سیستمی مسدودکننده صرف کند.
دسترسپذیری: Linux >= 2.6.25.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_SIGPENDING¶
تعداد سیگنالهایی که فرایند میتواند در صف قرار دهد.
دسترسپذیری: Linux >= 2.6.8.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_SBSIZE¶
حداکثر اندازهی مصرف بافر سوکت (به بایت) برای این کاربر. این میزان حافظه شبکه، و در نتیجه میزان mbufها (mbufs)، را که این کاربر ممکن است در هر زمان در اختیار داشته باشد محدود میکند.
دسترسپذیری: FreeBSD, NetBSD.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_SWAP¶
حداکثر اندازه (به بایت) فضای مبادلهای که ممکن است تمام فرآیندهای این شناسه کاربری آن را رزرو یا استفاده کنند. این محدودیت تنها در صورتی اعمال میشود که بیت ۱ از sysctlِ vm.overcommit تنظیم شده باشد. لطفاً برای توضیح کامل این sysctl، tuning(7) را ببینید.
دسترسپذیری: FreeBSD >= 8.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_NPTS¶
حداکثر تعداد شبهپایانهها (pseudo-terminals) که توسط این شناسه کاربری ایجاد شدهاند.
دسترسپذیری: FreeBSD >= 8.
اضافه شده در نسخهی 3.4.
- resource.RLIMIT_KQUEUES¶
حداکثر تعداد kqueueهایی که این شناسه کاربری مجاز به ایجاد آنها است.
دسترسپذیری: FreeBSD >= 11.
اضافه شده در نسخهی 3.10.
استفاده از منابع¶
این توابع برای بازیابی اطلاعات استفاده از منابع به کار میروند:
- resource.getrusage(who)¶
این تابع شیءای را برمیگرداند که منابع مصرفشده توسط فرایند جاری یا فرایندهای فرزند آن را توصیف میکند، همانطور که با پارامتر who مشخص شده است. پارامتر who باید با استفاده از یکی از ثابتهای
RUSAGE_*که در ادامه توضیح داده شدهاند، مشخص شود.یک مثال ساده:
from resource import * import time # a non CPU-bound task time.sleep(3) print(getrusage(RUSAGE_SELF)) # a CPU-bound task for i in range(10 ** 8): _ = 1 + 1 print(getrusage(RUSAGE_SELF))
هر یک از فیلدهای مقدار بازگشتی، نحوه استفاده از یک منبع سیستمی خاص را توصیف میکنند، برای مثال میزان زمانی که در حالت کاربر صرف اجرا شده یا تعداد دفعاتی که فرایند از حافظه اصلی خارجشده است. برخی مقادیر به بازه تیک ساعت وابستهاند، برای مثال میزان حافظهای که فرایند در حال استفاده از آن است.
برای سازگاری با نسخههای پیشین، مقدار بازگشتی همچنین بهصورت تاپلی از ۱۶ المان قابل دسترسی است.
فیلدهای
ru_utimeوru_stimeاز مقدار بازگشتی، مقادیر ممیز شناور هستند که بهترتیب نشاندهندهی میزان زمان صرفشده برای اجرا در حالت کاربر و میزان زمان صرفشده برای اجرا در حالت سیستم هستند. مقادیر باقیمانده، اعداد صحیح هستند. برای اطلاعات تفصیلی دربارهی این مقادیر به صفحه راهنمای getrusage(2) مراجعه کنید. خلاصهای کوتاه در اینجا ارائه شده است:اندیس
فیلد
منبع
0ru_utimeزمان در حالت کاربر (ثانیههای شناور)
1ru_stimeزمان در حالت سیستم (ثانیه بهصورت float)
2ru_maxrssحداکثر اندازه مجموعه مقیم
3ru_ixrssاندازهی حافظهی مشترک
4ru_idrssاندازهی حافظهی غیرمشترک
5ru_isrssاندازهی پشتهی اشتراکگذارینشده
6ru_minfltخطاهای صفحه بدون نیاز به ورودی/خروجی
7ru_majfltخطاهای صفحه نیازمند I/O
8ru_nswapتعداد خروجهای مبادله
9ru_inblockعملیاتهای ورودی بلوک
10ru_oublockعملیاتهای خروجی بلوک
11ru_msgsndپیامهای ارسالشده
12ru_msgrcvپیامهای دریافتی
13ru_nsignalsسیگنالهای دریافتشده
14ru_nvcswتعویضهای زمینه داوطلبانه
15ru_nivcswتعویضهای غیرارادی زمینه
این تابع در صورت مشخص شدن یک پارامتر who نامعتبر، یک
ValueErrorرا پرتاب میکند. همچنین ممکن است در شرایط غیرمعمول، استثنایerrorرا نیز پرتاب کند.
- resource.getpagesize()¶
تعداد بایتهای یک صفحهی سیستم را برمیگرداند. (این مقدار لزوماً برابر با اندازهی صفحهی سختافزاری نیست.)
نمادهای RUSAGE_* زیر به تابع getrusage() داده میشوند تا مشخص کنند اطلاعات کدام فرایندها باید ارائه شود.
- resource.RUSAGE_SELF¶
آن را به
getrusage()ارسال کنید تا منابع مصرفشده توسط فرایند فراخوان درخواست شود، که مجموع منابع استفادهشده توسط همه نخهای درون فرایند است.
- resource.RUSAGE_CHILDREN¶
به
getrusage()بفرستید تا منابع مصرفشده توسط فرایندهای فرزند فرایند فراخوان، که پایانیافتهاند و انتظارشان کشیده شده است، درخواست شود.
- resource.RUSAGE_BOTH¶
به
getrusage()ارسال کنید تا منابع مصرفشده توسط فرآیند فعلی و فرآیندهای فرزند درخواست شود. ممکن است در همهی سیستمها در دسترس نباشد.
- resource.RUSAGE_THREAD¶
برای درخواست منابع مصرفشده توسط نخ جاری، آن را به
getrusage()بدهید. ممکن است در همهی سیستمها در دسترس نباشد.اضافه شده در نسخهی 3.2.