■仮想マシンの性能チューニング
CPU、メモリ、ディスク、ネットワーク、デーモン、プロセスを見れば良い。
■CPUのクロック数
いわゆるネットブックの貧弱なCPUですが、ほとんど使われていません。
$ cat /proc/cpuinfo | grep "^cpu MHz"
cpu MHz : 1596.001
■CPU使用率
$ vmstat 1 1 | cut -c 67-
----cpu----
us sy id wa
1 3 94 2
■ユーザ(us)、システム(sy)も正常
$ top -b -n 1 | grep ^Cpu
Cpu(s): 1.1%us, 2.6%sy, 0.0%ni, 94.4%id, 1.8%wa, 0.0%hi, 0.1%si, 0.0%st
■平均負荷も問題なし
$ iostat | grep -A 1 avg-cpu
avg-cpu: %user %nice %system %iowait %steal %idle
1.07 0.00 2.68 1.81 0.00 94.44
■メモリの搭載量(256MB)
$ grep "MemTotal\|SwapTotal" /proc/meminfo
MemTotal: 254504 kB
SwapTotal: 731128 kB
■だいぶキャッシュを持っているが使っていない。
※「使っていない」の判断はプロセスを確認する。
$ free
total used free shared buffers cached
Mem: 254504 234640 19864 0 13852 191696
-/+ buffers/cache: 29092 225412
Swap: 731128 40 731088
$ top -b -n 1 | grep "^Mem\|^Swap" | sed s/",\|:"/"\n"/g
Mem
254504k total
234956k used
19548k free
13868k buffers
Swap
731128k total
40k used
731088k free
191696k cached
■メモリキャッシュとバッファの開放
$ su root -c 'echo 1 > /proc/sys/vm/drop_caches'
■バッファ、キャッシュが開放された
$ free
total used free shared buffers cached
Mem: 254504 32016 222488 0 168 5916
-/+ buffers/cache: 25932 228572
Swap: 731128 40 731088
$ top -b -n 1 | grep "^Mem\|^Swap" | sed s/",\|:"/"\n"/g
Mem
254504k total
31972k used
222532k free
116k buffers
Swap
731128k total
40k used
731088k free
5644k cached
■スワップの確認
$ sudo swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 731128 40 -1
■上記の別の表示方法
$ sudo swapon -s | sed s/" * \|\t"/","/g | sed s/",*,"/","/g
Filename,Type,Size,Used,Priority
/dev/sda5,partition,731128,0,-1
$ sudo swapon -s | sed s/" * \|\t"/","/g | sed s/",*,"/","/g | \
awk -F\, '{print $3 "\t" $4}'
Size Used
731128 0
■スワップへのアクセスは無い
$ vmstat 1 1 | cut -c 35-44
---swap--
si so
0 0
■これは一度オフして、再度オンすれば開放される
$ sudo swapoff -a && sudo swapon -a
■スワップが開放された
$ free | grep "free\|^Swap"
total used free shared buffers cached
Swap: 731128 0 731128
■ディスクIOの確認
$ vmstat 1 1 | cut -c 45-56
-----io----
bi bo
16 35
■ディスクIOのサイズの確認
$ sudo fdisk -l /dev/sda | grep 'I/O'
I/O size (minimum/optimal): 512 bytes / 512 bytes
$ sudo fdisk -l /dev/sda | grep '^/dev' | awk '{print $1}'
/dev/sda1
/dev/sda2
/dev/sda5
■DMAにも対応していない仮想ディスクであることが分かる。
$ sudo apt-get install hdparm
$ sudo hdparm -I /dev/sda 2>&1 | grep -A 5 "^Capabilities"
Capabilities:
IORDY not likely
Cannot perform double-word IO
R/W multiple sector transfer: not supported
DMA: not supported
PIO: pio0
■ネットワーク
gitとpostfixとsshdだけがIPv4を使っている。
IPv6を使わないのであれば調整をしてもよさそうだ。
通信の遅延が発生していることが分かる。
※ホストOSが無線LANを使用しており、電波が届きにくい環境で使用しているため
$ env LANG=C netstat -s | \
grep "^[A-Z]\|error\|failed\|discard\|forward\|unknown\|delayed" | \
grep -v " 0 "
Ip:
Icmp:
IcmpMsg:
Tcp:
2 failed connection attempts
Udp:
UdpLite:
TcpExt:
2233 delayed acks sent
19 delayed acks further delayed because of locked socket
IpExt:
■IPv4を使用するサービスの確認
$ sudo lsof -i 4 | awk '{print $1}' | sort | uniq
COMMAND
git-daemo
master
sshd
■IPv6を使用するサービスの確認
$ sudo lsof -i 6 | awk '{print $1}' | sort | uniq
COMMAND
git-daemo
sshd
■sshdをIPv4のみにする
sshdを再起動後、一度ログアウトしてログオンしなおすと、IPv4を強制できる。
$ man sshd | grep "\-4 "
-4 Forces sshd to use IPv4 addresses only.
$ grep "\-4" /etc/default/ssh
SSHD_OPTS="-4"
$ sudo lsof -i 6 | awk '{print $1}' | sort | uniq
COMMAND
git-daemo
$ ps -ef | grep sshd | grep -v grep | grep sbin
root 9420 1 0 12:01 ? 00:00:00 /usr/sbin/sshd -4
■「git-daemon」をIPv4のみにする
マニュアルにあるとおり
$ man git-daemon | grep -A 3 "IPv4 address or"
either an IPv4 address or an IPv6 address if supported. If IPv6 is
not supported, then --listen=hostname is also not supported and
--listen must be given an IPv4 address. Incompatible with --inetd
option.
$ sudo cp -pi /etc/service/git-daemon/run /etc/service/git-daemon/run.bak
$ diff /etc/service/git-daemon/run /etc/service/git-daemon/run.bak
6c6
< --listen=192.168.0.0 --base-path=/var/cache /var/cache/git
---
> --base-path=/var/cache /var/cache/git
$ sudo sv stop git-daemon
ok: down: git-daemon: 0s, normally up
$ sudo sv start git-daemon
ok: run: git-daemon: (pid 10031) 0s
$ grep 9418 /etc/services
git 9418/tcp
$ netstat -an | grep 9418
tcp 0 0 192.168.132.0:9418 0.0.0.0:* LISTEN
$ sudo lsof -i 6 | awk '{print $1}'
■ネットワークの正常、エラーの確認
$ LANG=C netstat -i | sed s/" * "/","/g
Kernel,Interface,table
Iface,MTU,Met,RX-OK,RX-ERR,RX-DRP,RX-OVR,TX-OK,TX-ERR,TX-DRP,TX-OVR,Flg
eth0,1500,0,51469,0,0,0,41233,0,0,0,BMRU
lo,16436,0,18,0,0,0,18,0,0,0,LRU
■通常は以下で正常に表示される
$ LANG=C netstat -i | sed s/" * "/","/g | awk -F\, '{print $4 "\t" $8 "\t|\t" $5 "\t" $9}'
■以下でも、表示が崩れるようなら、崩れる表示設計をしている方が悪いということでw。
$ LANG=C netstat -i | sed s/" * "/","/g | \
awk -F\, '{printf "%5s\t%5s\t|\t%5s\t%5s\n",$4,$8,$5,$9 }'
|
RX-OK TX-OK | RX-ERR TX-ERR
53523 42643 | 0 0
18 18 | 0 0
■接続中のコネクション数の確認
$ netstat -an | grep "ESTABLISHED\|TIME_WAIT\|FIN_WAIT" | wc -l
2
■待ちうけポートの数の確認
$ netstat -ln | grep ^tcp | wc -l
5
■git-daemon(9418)、ssh(22)、postfix(25)以外のポートの確認
$ netstat -ln | grep ^tcp | awk '{print $4}' | awk -F\: '{print $2}' | column
9418 22 25 6010 6011
$ sudo lsof | grep "6010\|6011" | awk '{print $1 " " $5 " " $8 " " $9}'
sshd IPv4 TCP localhost:6010
sshd IPv4 TCP localhost:6011
■ネットワークトラフィックの確認。
トラフィックかトラヒックかはここでは議論しない。
また、待ちうけポートの数が少ないので特に行わないが、フィルタリングも可能。
$ man iftop | grep -A 1 -i "^see also"
SEE ALSO
tcpdump(8), pcap(3), driftnet(1).
$ sudo apt-get install -y iftop
1.56KB 3.12KB 4.69KB 6.25KB 7.81KB
mqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqq
192.168.132.169 => 192.168.132.1 126B 205B 205B
<= 20B 30B 30B
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
TX: cumm: 1.60KB peak: 348B rates: 126B 205B 205B
RX: 240B 40B 20B 30B 30B
TOTAL: 1.84KB 388B 146B 235B 235B
■サービス(デーモン)ごとのネットワークトラフィック
$ apt-cache search nethogs
nethogs - Net top tool grouping bandwidth per process
$ sudo apt-get install nethogs
NetHogs version 0.7.0
PID USER PROGRAM DEV SENT RECEIVED
10749 labunix sshd: labunix@pts/1 eth0 0.404 0.047 KB/sec
0 root unknown TCP 0.000 0.000 KB/sec
■システムの処理待ちプロセスの平均数のチェック
※1以下であれば問題無しとする
$ w | head -1 | sed s/",\|:"/"\n"/g | tail -4
load average
0.08
0.05
0.01
■Taskの状態、ゾンビが無いこと。
動いているのはtop自身「S」列の値がR(Run)。
$ top -b -n 1 | grep "PID\| R "
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8035 labunix 20 0 2332 1028 800 R 1.9 0.4 0:00.06 top
$ top -b -n 1 | grep Tasks | sed s/",\|:"/"\n"/g
Tasks
70 total
1 running
69 sleeping
0 stopped
0 zombie
■pstreeで現在の状況を確認
CUI環境(GUIのサービスが無い)、
ssh経由でログイン中、git-daemonが稼動していて、メールサーバはpostfix。
$ pstree
init─┬─acpid
├─atd
├─cron
├─7*[getty]
├─master─┬─pickup
│ └─qmgr
├─rsyslogd───3*[{rsyslogd}]
├─runsvdir───runsv─┬─git-daemon
│ └─svlogd
├─sshd───sshd───sshd───bash───pstree
└─udevd───2*[udevd]
■「sar」の導入
$ sudo apt-get install -y sysstat
$ sudo /etc/init.d/sysstat start
$ sudo /etc/init.d/sysstat status
sadc cron jobs are disabled ... failed!
■「true」であるか
$ grep -B 5 "sadc cron jobs are disabled" /etc/init.d/sysstat | grep if
if [ "$ENABLED" = "true" ] ; then
$ grep "ENABLED=" /etc/init.d/sysstat
ENABLED="false"
■上記は少々遠まわしだが、「/etc/default/sysstat」を編集すればよい。
一度「false」を設定、「/etc/default/sysstat」の設定で上書き。
つまり、「/etc/init.d/sysstat」の方を変更しても意味が無い。
DEFAULT=/etc/default/sysstat
ENABLED="false"
SA1_OPTIONS=""
test -r "$DEFAULT" && . "$DEFAULT"
■以下のように変更してデーモンを起動
$ sudo grep ^[A-Z] /etc/default/sysstat
ENABLED="true"
SA1_OPTIONS="-S DISK"
SA2_OPTIONS=""
$ sudo /etc/init.d/sysstat start
Starting the system activity data collector: sadc.
$ sudo /etc/init.d/sysstat status
sadc cron jobs are enabled.
■gnuplotの導入
$ sudo apt-get install -y gnuplot
■画像はこちら
全部が%になっていない事に気づいた。後日直す。
sysstatとgnuplot
http://labunix.hateblo.jp/entry/2012/04/01/034517
■スクリプトは以下
1st sysstat to gnuplot beta
https://github.com/labunix/sysstat2gnuplot
■CPUの性能情報
$ sudo LANG=C sar -p -f /var/log/sysstat/sa27 | \
grep '%' | sed s/" "/"\n"/g | grep -v ^\$
10:55:02
CPU
%user
%nice
%system
%iowait
%steal
%idle
■メモリの性能情報
$ sudo LANG=C sar -r -f /var/log/sysstat/sa27 | \
grep '%' | sed s/" "/"\n"/g | grep -v ^\$
10:55:02
kbmemfree
kbmemused
%memused
kbbuffers
kbcached
kbcommit
%commit
■スワップの性能情報
$ sudo LANG=C sar -S -f /var/log/sysstat/sa27 | \
grep '%' | sed s/" "/"\n"/g | grep -v ^\$
10:55:02
kbswpfree
kbswpused
%swpused
kbswpcad
%swpcad
■ディスクI/Oの情報取得
$ sudo LANG=C sar -b -f /var/log/sysstat/sa27 | \
grep 'read' | sed s/" "/"\n"/g | grep -v ^\$
10:55:02
tps
rtps
wtps
bread/s
bwrtn/s
■ネットワークの情報取得
$ sudo LANG=C sar -n DEV -f /var/log/sysstat/sa27 | \
grep 'tx' | sed s/" "/"\n"/g | grep -v ^\$
10:55:02
IFACE
rxpck/s
txpck/s
rxkB/s
txkB/s
rxcmp/s
txcmp/s
rxmcst/s
■その他使用可能なオプション
$ sar --help 2>&1 | grep "\[" | sed s/"\[\|\]\| "/"\n"/g | grep "^\-" | sort | uniq | column
-A -I -S -b -f -m -q -t -w
-B -P -V -d -h -o -r -u -y
-C -R -W -e -i -p -s -v
■以下のサイトで使われている解析ツールはすべてSqueezeでもパッケージ化されている。
これについては、また後日にします。
参考:実録「カーセンサーnet」リニューアル奮闘記
http://itpro.nikkeibp.co.jp/article/COLUMN/20120319/387030/
$ for list in "^oprofile" "jmeter" "^systemtap" "crash";do \
apt-cache search $list; \
done | awk '{print $1}' |column
oprofile-gui jmeter-jms systemtap-common
oprofile jmeter-junit systemtap-doc
jmeter-apidoc jmeter-ldap systemtap-grapher
jmeter-ftp jmeter-mail systemtap-runtime
jmeter-help jmeter-tcp systemtap-sdt-dev
jmeter-http jmeter systemtap-server
jmeter-java systemtap-client systemtap