cgroupで、お手軽CPU使用率制限
先日無償公開されたSoftetherをAmazon EC2のmicroインスタンスへ入れてみた。
しかしCPU性能がしょぼいのか、暗号化処理に結構負荷がかかるのか、CPUを使い果たしてしまう事態に。
さらには仮想環境ということでstealが多発し、輪をかけて使い物にならない。
※これはEC2/microインスタンスの特性らしい。
http://qiita.com/items/8248ec4654cb809504c9
http://memo-off.blogspot.jp/2011/08/ec2-t1microcpu-steal.html
そこで今回はcroup/cgroupsを用いて当該プロセスのCPU使用率を制限、さらにはstealも発生しないようにする。
※croupは、Redhat系ならRHEL6/CentOS6から利用可能。
まずは、何もしない時のSoftetherプロセス(vpnserver)
# top top - 15:12:18 up 98 days, 11:08, 1 user, load average: 0.47, 0.21, 0.28 Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie Cpu(s): 4.3%us, 8.4%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 87.3%st Mem: 608732k total, 590452k used, 18280k free, 115108k buffers Swap: 0k total, 0k used, 0k free, 269748k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25549 root 0 -20 651m 87m 2452 S 99.9 14.6 0:24.00 vpnserver 25632 root 20 0 15052 1160 896 R 0.3 0.2 0:00.36 top 1 root 20 0 19400 1320 1016 S 0.0 0.2 0:01.14 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:02.63 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0 5 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 ~以下略~
stealも発生しまくり。
[root@mail local]# vmstat 1 100000 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 37176 110844 252856 0 0 0 33 1 3 0 0 99 1 0 3 0 0 37504 110844 252860 0 0 0 0 76 505 3 10 0 0 88 1 0 0 37528 110844 252876 0 0 0 0 97 1355 5 7 0 0 87 1 0 0 37528 110844 252892 0 0 0 0 114 865 8 10 0 0 82 1 0 0 37528 110852 252896 0 0 0 12 62 633 3 7 0 0 90 2 0 0 37528 110852 252912 0 0 0 0 69 559 4 9 0 0 87 2 0 0 37528 110852 252920 0 0 0 0 77 516 4 9 0 0 87 2 0 0 37528 110852 252932 0 0 0 0 73 472 3 10 0 0 87 2 0 0 37528 110852 252940 0 0 0 0 65 427 5 10 0 0 85 2 0 0 37544 110860 252944 0 0 0 16 55 403 3 11 0 0 86 1 0 0 37592 110860 252948 0 0 0 0 60 391 3 8 0 0 89 1 0 0 37648 110860 252956 0 0 0 192 66 366 2 10 0 0 88 ~以下略~
そこで、cgroupの導入、設定
# yum install libcgroup # vi /etc/cgconfig.conf ※下記を追記 --- group vpnserver { cpu { cpu.cfs_quota_us = 250000; cpu.cfs_period_us = 1000000; } cpuacct { } } --- ※1秒あたり0.25秒間、単一のCPUを使用するように指定 (この環境が1コアCPUなので、アクセス頻度を1/4に抑えることで、結果25%までの使用率とする)
# chkconfig cgconfig on # /etc/init.d/cgconfig start
cgroup経由でSofteterを起動
# cgexec -g cpu:vpnserver /usr/local/vpnserver/vpnserver start
適用後のcpu使用率
# top top - 15:26:20 up 98 days, 11:22, 1 user, load average: 0.64, 0.76, 0.68 Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie Cpu(s): 8.4%us, 16.4%sy, 0.0%ni, 74.9%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Mem: 608732k total, 541124k used, 67608k free, 111492k buffers Swap: 0k total, 0k used, 0k free, 257740k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 26003 root 0 -20 651m 58m 2456 S 25.3 9.9 0:09.09 vpnserver 1 root 20 0 19400 1320 1016 S 0.0 0.2 0:01.14 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:02.63 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0 5 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 ~以下略~
さらには、stealも発生しなくなり快適になった。
以上
■参照
・Product Documentation > Red Hat Enterprise Linux > Resource Management Guide > 3.2. cpu
https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpu.html