海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

cgroupで、お手軽CPU使用率制限

先日無償公開されたSoftetherAmazon 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