برنامه نویسی

cpulimit من را آزار داد بنابراین آن را بهبود دادم

قبلا | قبلا بیشتر

چند روز پیش کشف کردم cpulimit. این یک ابزار عالی است که به خوبی (هاها) مکمل است nice. جایی که nice معمولاً برای کاهش میزان استفاده از پردازنده با تغییر اولویت آن استفاده می شود niceروند d همچنان می تواند از CPU بیشتر از آنچه شما می خواهید استفاده کند، و البته اگر چیزی با اولویت بالاتر پیش نیاید، از تمام آنچه می خواهد استفاده می کند.

اما گاهی اوقات شما می خواهید یک فرآیند را به استفاده از بخش خاصی از زمان CPU بدون توجه به اولویت محدود کنید. یک مثال خوب زمانی است که نمی‌خواهید آن طرفداران پر سر و صدا PC وارد کار شوند و برایتان مهم نیست که یک کار چقدر طول می‌کشد، زیرا چه در 15 دقیقه یا 8 ساعت تمام شود، هنوز در حالی که شما خواب هستید تمام می‌شود.

cpulimit برای این کار عالی است و استفاده از آن ساده است. فراخوانی مانند این:

cpulimit -l 50 somecommand ...
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجرا خواهد شد somecommand اما آن را به استفاده از 50 درصد از یک CPU محدود کنید. این کار را با انجام یک فرآیند ناظر انجام می دهد که به طور دوره ای بررسی می کند که چقدر کار می کند somecommand در حال انجام است، و در صورت استفاده بیش از حد، با ارسال عبارت، آن را به طور خلاصه مکث می کند STOP علامت. پس از مدتی آن را با دکمه لغو مکث می کند CONT علامت. البته، چون بار روی دستگاه شما از فرآیندهای دیگر هرگز کاملاً ثابت نخواهد بود، cpulimit به ندرت دقیقاً به هدف می رسد، اما به اندازه کافی نزدیک می شود.

اما می خواستم کمی آن را تغییر دهم. می‌خواستم بتوانم به‌طور تعاملی دکمه صدا را بچرخانم تا بتوانم بدهم somecommand هر زمان که دلم می خواست کم و بیش CPU. نتیجه یک درخواست کششی است که متأسفانه بعید به نظر می رسد که هرگز ادغام شود، زیرا نویسنده اصلی چندین سال است که پروژه را لمس نکرده است، اما اگر هر یک از شما می خواهید ویژگی جدید و جذاب را اعمال کنید و سفارشی خود را بسازید. cpulimit بسیار آسان است

نحوه کار پچ ساده است. کنترل کننده های سیگنال را برای SIGUSR1 و SIGUSR2 که به ترتیب تخصیص CPU را 1% افزایش و کاهش می دهند. آیا می خواهید آن را 50٪ افزایش دهید؟ فقط یک حلقه پوسته کوچک بنویسید تا سیگنال را 50 بار ارسال کنید:

for i in $(seq 1 50); do kill -SIGUSR1 $pid; done
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که وجود دارد، تعیین فرآیند ارسال سیگنال کمی مشکل است دو cpulimit فرآیندهای در حال اجرا اولین مورد وجود دارد که فقط در پس زمینه منتظر است somecommand برای تمام کردن، پس از آن نگهبان است که از کار جدا شد. این نگهبانی است که می خواهید سیگنال ها را به آن بفرستید. شما می توانید بگویید که مراقب کدام است زیرا به طور کلی PID بالاتری دارد و از کمی CPU استفاده می کند. اگر شما cpulimitبا استفاده از چندین فرآیند، می‌توانید بگویید کدام داگ به کدام فرآیند مرتبط است، زیرا Watchdog فرمان و آرگومان‌های آن را در خط فرمان خود خواهد داشت. مثلا:

$ ps aux|grep ffmpeg|grep -v grep
david   90311 103.3  0.7 36105472 485448 s011  T     6:42pm   1:07.89 ffmpeg ...
david   90312   5.6  0.0 34221044    828 s011  S     6:42pm   0:02.82 cpulimit -l 100 ffmpeg ...
david   90310   0.0  0.0 34122740    796 s011  S     6:42pm   0:00.01 cpulimit -l 100 ffmpeg ...
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

می توانید اینجا ببینید که من پرسیدم cpulimit اجازه دادن ffmpeg فقط از 1 CPU از چندین پردازنده موجود در این دستگاه استفاده کنید (یعنی استفاده از 100٪ یک CPU – در ماشین های مدرن حداکثر مجاز تعداد هسته های CPU * 100٪ است). پوسته من بر این اساس فرآیند 90310 را شروع کرد که فورک و اجرا شد ffmpeg با pid 90311 و فرآیند Watchdog را به عنوان pid 90312 تغییر داد. Watchdog از کمی CPU استفاده می کند. بنابراین برای پردازش 90312 است که باید سیگنال ارسال کنم.

$ for i in $(seq 1 400); do kill -SIGUSR1 90312; done
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار 400 بار سیگنال “کمی روشن کن” ارسال می شود ffmpeg اکنون حداکثر به 500% یک CPU محدود شده است و چند لحظه بعد:

$ ps aux|grep ffmpeg|grep -v grep
david   90311 497.0  0.8 36105472 507160 s011  T     6:42pm  12:42.37 ffmpeg ...
...
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما می توانیم آن را ببینیم ffmpeg بسیار سخت‌تر کار می‌کند و اکنون کمتر از 500 درصد از CPU را می‌گیرد.

نوشته های مشابه

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

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

دکمه بازگشت به بالا