اموزش محدود کردن مصرف cpu در اوبونتو

محدود کردن مصرف cpu در اوبونتو

چگونه مصرف cpu را با استفاده از cpulimit در اوبونتو محدود کنیم ؟

این مقاله به شما نشان می دهد که چگونه می توانید مصرف cpuدر اوبونتو 14.04 را محدود کنید . من از cpulimit برای این کار استفاده خواهم کرد .Cpulimit ابزاری است که مصرف cpu ,پردازش ها را محدود می سازد ( که معمولا نیز به صورت درصد نشان داده می شود ). این ابزار برای کنترل کارهای دسته ای (batch job ) در زمانی که شما نمی خواهید این کارها چرخه ی cpu زیادی مصرف کنند ، بسیار مفید است . هدف Cpulimit جلوگیری از اجرای فرآیندها بیشتر از نسبت به زمان مشخص شده است . این ابزار مقادیر و سایر اولویتهای زمانبندی شده را تغییر نمی دهد اما می تواند مصرف واقعی cpuرا تحت تاثیر قرار دهد . همچنین این ابزار قادر است خود را با بار کل سیستم به صورت پویا و سریع منطبق و سازگار کند . کنترل مقدار cpu مصرفی با استفاده از فرستادن سیگنالهای SIGSTOP و SIGCONT POSIX به پردازشها و فرآیندها انجام می شود . تمامی فرآیندهای فرزند و رشته های یک پردازش مشخص ، درصد cpu یکسانی را به اشتراک خواهند گذاشت .

نکات مقدماتی :

این آموزش بر اساس سرور اوبونتوی 14.04 است ، بنابراین شما باید یک سرور اوبونتوی 14.04 اصلی را قبل از شروع کار نصب کرده باشید . سیستم باید آی پی آدرس استاتیک داشته باشد . من از آی پی 192.168.0.100 به عنوان آی پی آدرس خود و hostname ( نام میزبان ) server1.example.com استفاده خواهم کرد .

نصب :

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

apt-get update
apt-get install cpulimit

محدود کردن مصرف cpu :

خوب حالا باید سودمندی ابزار را برای محدودسازی مصرفcpu بررسی کنیم . برای اینکار ابتدا مصرف cpu را بدون استفاده از cpulimit بررسی کرده و سپس cpulimit را برای ارزیابی به کارخواهیم گرفت . اجازه دهید این موضوع را با یک مثال روشن تر کنیم :

1- اینجا مثالی را می بینید که چگونه می توانید cpu خود را با یک برنامه در تک پردازنده ی هسته ای به کار گیرید :

& dd if=/dev/zero of=/dev/null
& root@server1:~# dd if=/dev/zero of=/dev/null
 1850 [1]
#~:root@server1

حالا مصرف cpuرا با استفاده از دستور زیر بررسی کنید:

top
top – 11:24:18 up 49 min, 1 user, load average: 0.94, 1.02, 1.79
Tasks: 249 total, 2 running, 247 sleeping, 0 stopped, 0 zombie
%Cpu(s): 13.4 us, 11.6 sy, 0.0 ni, 74.9 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
KiBMem: 1010540 total, 271652 used, 738888 free, 21760 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 158204 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1850 root 20 0 7224 616 520 R 100.0 0.1 1:20.33 dd
1851 root 20 0 24952 1756 1180 R 0.3 0.2 0:00.03 top
  1root 20 0 33480 2776 1456 S 0.0 0.3 0:05.31 init
  2root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd

همانطور که می بینید ، مصرفcpu 100 درصد است . حالا از cpulimit برای محدود کردن مصرفcpu استفاده میکنیم تا اثر آن را ببینیم . می توانید این فرآیند را با استفاده از fgبه پیش زمینه آورده و یا با استفاده از دستور ctrl+C کنسل کنید .

fg
root@server1:~# fg
dd if=/dev/zero of=/dev/null
^C222182151+0 records in
222182150+0 records out
113757260800 bytes (114 GB) copied, 259.084 s, 439 MB/s

#~:root@server1

حالا می توانیم نحوه ی عملکرد cpulimit را بررسی کنیم . این تست را می توانید همانند دستورات زیر انجام دهید :

& cpulimit -l 30 dd if=/dev/zero of=/dev/null
& root@server1:~# cpulimit -l 30 dd if=/dev/zero of=/dev/null
    1852[1]
root@server1:~# Process 1853 detected

[1]+ Done cpulimit -l 30 dd if=/dev/zero of=/dev/null
#~:root@server1

حالا مصرف cpu را با استفاده از دستور top بررسی کنید :

top
top – 11:30:54 up 55 min, 1 user, load average: 0.20, 0.58, 1.34
Tasks: 250 total, 2 running, 247 sleeping, 1 stopped, 0 zombie
%Cpu(s): 4.5 us, 4.1 sy, 0.0 ni, 91.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiBMem: 1010540 total, 271944 used, 738596 free, 21816 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 158212 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1853 root 20 0 7224 612 520 T 33.8 0.1 0:35.53 dd
  1root 20 0 33480 2776 1456 S 0.0 0.3 0:05.37 init
  2root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
  3root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
  4root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0

همانطور که می بینید ، مصرفcpu از 100 به 33.88 درصد کاهش یافته است . خوب ما با موفقیت عملکرد cpulimit را بررسی کردیم .
2- در اینجا مثالی را می بینید که چگونه cpu با یک برنامه در پردازنده های چند هسته ای به کار گرفته می شود :
برای بررسی هسته ی cpu از دستورات زیر استفاده کنید :

nproc

حالا باید مصرف پردازنده را بدون استفاده از cpulimit در هر 4 هسته بررسی کنیم :

for j in seq 1 4; do dd if=/dev/zero of=/dev/null & done

دستورات در تمامی هسته اجرا شده و نتیجه خروجی به صورت زیر خواهد بود:

root@server1:~# for j in seq 1 4; do dd if=/dev/zero of=/dev/null &done
[1] 1263
[2] 1264
[3] 1265
[4] 1266
#~:root@server1

حالا مصرف پردازنده را با top بررسی کنید :

top
top – 11:47:45 up 4 min, 1 user, load average: 3.63, 1.53, 0.57
Tasks: 290 total, 5 running, 285 sleeping, 0 stopped, 0 zombie
%Cpu0 : 48.3 us, 51.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu1 : 47.8 us, 52.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 53.3 us, 46.4 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu3 : 52.0 us, 48.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiBMem: 1010540 total, 209712 used, 800828 free, 20276 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 93632 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1263 root 20 0 7224 612 520 R 100.0 0.1 2:21.40 dd
1264 root 20 0 7224 616 520 R 100.0 0.1 2:21.41 dd
1265 root 20 0 7224 612 520 R 99.0 0.1 2:21.03 dd
1266 root 20 0 7224 616 520 R 98.0 0.1 2:20.82 dd
1281 root 20 0 104416 3992 2920 S 1.0 0.4 0:00.03 sshd
1283 root 20 0 104416 3988 2920 S 1.0 0.4 0:00.03 sshd
1279 root 20 0 104556 4008 2924 S 0.7 0.4 0:00.08 sshd

دستور dd تقریبا 100 درصد پردازنده از تمامی هسته ها را مصرف میکند . حالا این دستور را با به کارگیری cpulimit بررسی میکنیم . برای اینکار آثار قبلی برای dd را با دستورات زیر پاک کنید :

killalldd
root@server1:~# killalldd
[1] Terminated dd if=/dev/zero of=/dev/null
[3]- Terminated dd if=/dev/zero of=/dev/null
[2]- Terminated dd if=/dev/zero of=/dev/null
[4]+ Terminated dd if=/dev/zero of=/dev/null
#~:root@server1

حالا دستور cpulimit را با دستور یکسان به کار ببرید :

for j in seq 1 4; do cpulimit -l 20 dd if=/dev/zero of=/dev/null & done
root@server1:~# for j in seq 1 4; do cpulimit -l 20 dd if=/dev/zero of=/dev/null & done
[1] 1429
[2] 1430
[3] 1431
[4] 1432
root@server1:~# Process 1434 detected
Process 1433 detected
Process 1437 detected
Process 1439 detected

[1] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[2] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[3]- Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[4]+ Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
#~:root@server1

حالا مصرف پردازنده را با به کار گیری cpulimit بررسی کنید :

top
top – 11:59:10 up 16 min, 2 users, load average: 0.47, 0.71, 0.81
Tasks: 256 total, 2 running, 251 sleeping, 3 stopped, 0 zombie
%Cpu0 : 2.0 us, 2.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 26.2 us, 22.8 sy, 0.0 ni, 50.7 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu2 : 14.0 us, 12.3 sy, 0.0 ni, 73.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 13.3 us, 11.6 sy, 0.0 ni, 75.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiBMem: 1010540 total, 204064 used, 806476 free, 20408 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 98340 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1433 root 20 0 7224 612 520 T 28.2 0.1 0:12.00 dd
1439 root 20 0 7224 616 520 R 26.6 0.1 0:12.13 dd
1434 root 20 0 7224 612 520 T 25.3 0.1 0:11.97 dd
1437 root 20 0 7224 612 516 T 22.9 0.1 0:11.93 dd
7 root 20 0 0 0 0 S 0.3 0.0 0:00.22 rcu_sched
8 root 20 0 0 0 0 S 0.3 0.0 0:00.21 rcuos/0

همانطور که می بینید مصرف پردازنده از 100 به 20 برای پردازنده های چندهسته ای کاهش یافته است .
تبریک می گویم . شما با موفقیت، تاثیر cpulimit بر مصرف پردازنده در اوبونتو 14.04 را بررسی کردید .

09123781949