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 را میگیرد.