仮想マシンのSqueezeを256MBで快適にする

■仮想マシンの性能チューニング
 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                        # Git Version Control System
$ 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」の方を変更しても意味が無い。

# our configuration file
DEFAULT=/etc/default/sysstat

# default settings...
ENABLED="false"
SA1_OPTIONS=""

# ...overriden in the configuration file
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