Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2012-02-29 (Wed)

dstatの万能感がハンパない

サーバーのリソースを見るにはグラフ化は重要ですが、推移ではなくリアルタイムな状況、例えば秒単位のスパイキーな負荷を見るには、サーバー上でvmstatやiostatなどの*statファミリーを叩く必要があります。

さて、vmstatはメモリの状況やブロック数単位のI/O状況は見られますが、バイト単位のI/O状況やネットワークの送信、受信バイト数を見ることはできません。

# vmstat 1
procs -----------memory---------- ---swap--- -----io----- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi     bo   in    cs  us sy id wa st
 3  1      0 4724956 355452 726532    0    0    54    484    3     3  1  0 99  0  0
 2  0      0 4737428 355384 720420    0    0  9460  73808 6980 18667 10  1 87  2  0
 3  0      0 4718524 355452 731884    0    0  8832  80508 6639 13714  9  1 89  1  0
 2  0      0 4713248 355512 737528    0    0 11360 204772 9424 19438 10  1 85  4  0
 2  0      0 4710788 355516 739904    0    0  9352  58064 5688 13238  8  1 90  1  0

他方、iostat -dkxではIOPSやバイト単位の値など、I/Oに関する詳細は確認できますが、CPU使用率など他の統計値は同時に見ることができません。

# iostat -dkx /dev/sda 1

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.67   332.17 146.27 338.57  1295.64 11647.60    53.39     0.25    0.52   0.10   4.83

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              26.00  2901.00 964.00 338.00  9768.00 20560.00    46.59     0.78    0.60   0.17  22.70

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               4.00  2883.00 917.00 791.00  8900.00 41292.00    58.77     0.85    0.50   0.16  26.60

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda              22.00  4393.00 983.00 978.00  9236.00 59608.00    70.21     0.88    0.45   0.15  29.50

mpstat、ifstatもしかりです。


ターミナルを複数上げてvmstatとiostatをそれぞれ実行してもいいのですが、できれば一つのターミナルでいろいろな値を見たい。というわけで、dstatの出番です。

dstatで特徴的なのは、表示する統計情報をオプションで選択できる点です。

例えば、

  • CPUとメモリ関連なら-Tclm
  • ディスクI/O関連(バイト数とI/Oリクエスト数)なら-Tcldr
  • ネットワークI/Oも含めて全部入れなら-Tclmdrn

といった塩梅です。

自分はオプション覚えられないので、↓のようなaliasを当ててます。

alias dstat-full='dstat -Tclmdrn'
alias dstat-mem='dstat -Tclm'
alias dstat-cpu='dstat -Tclr'
alias dstat-net='dstat -Tclnd'
alias dstat-disk='dstat -Tcldr'

f:id:hirose31:20120229164539p:image


他にもユニークな統計情報を見ることができます。

MySQL

PythonのMySQLdbが必要です。

$ export DSTAT_MYSQL_USER=root
$ export DSTAT_MYSQL_PWD=pa55w0rd
$ export DSTAT_MYSQL_HOST=127.0.0.1
$ dstat -T --mysql5-cmds --mysql5-conn --mysql5-io --mysql5-keys
--epoch--- ------mysql5-cmds------ mysql5-co -mysql5-io- ---mysql5-key-status----
  epoch   | sel   ins   upd   del |ThCo %Con| recv  sent|used read writ rreq wreq
1330500331|    0     0     0     0|0.00 0.00|0.02  0.11 |  0    0    0    0    0 
1330500332|    8     0     0     0|4.00 1.60|9796B 59.8k|  0    0    0    0    0 
1330500333|    8     0     0     0|4.00 1.60|9.90k 61.1k|  0    0    0    0    0 
1330500334|    8     0     0     0|4.00 1.60|10.2k 62.5k|  0    0    0    0    0 

MySQL Innodb

mysqlコマンドが/usr/bin/mysqlにある必要があります。

$ export DSTAT_MYSQL='-uroot -ppa55w0rd -h127.0.0.1'
$ dstat -T --innodb-io --innodb-buffer --innodb-ops
--epoch--- innodb-io-o innodb-pool ---innodb-ops--
  epoch   |rea wri syn|crt rea wri|ins upd del rea
1330500814|  0   0   0|0.2 1.0  11|  0   0   0   0
1330500815|  0   0   0|3.0 1.0 139|  0   0   0   0
1330500816|  0   0   0|3.0 5.0 172|  0   0   0   0
1330500817|  0   0   0|5.0 5.0 133|  0   0   0   0

最も{CPUを使っている,I/Oしている}プロセス

top-cpu-adv, top-bio, top-ioは最近のkernel(vanilla kernelですと2.6.20以上)が必要です。

$ dstat --top-cpu --top-cputime
-most-expensive- --highest-total--
  cpu process   | cputime process 
X            0.0|X             910
bash          25|bash         1000
bash          25|bash         1000
bash          25|bash         1000

$ dstat --top-cpu-adv
-------most-expensive-cpu-process-------
process              pid  cpu read write
X                    128150.0%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
bash                 13522 25%   0    0 
$ dstat --top-io --top-bio
----most-expensive---- ----most-expensive----
     i/o process      |  block i/o process   
bash       6593B 6508B|bash          2B 6394B
dd          366M  366M|dd            0   366M
dd          360M  360M|dd            0   360M
dd          287M  287M|dd            0   287M
dd          237M  237M|dd            0   237M
$ dstat --top-io-adv --top-bio-adv
-------most-expensive-i/o-process------- ----most-expensive-block-i/o-process----
process              pid  read write cpu|process              pid  read write cpu
dd                   771    19k  19k0.0%|dd                   771     0   19k0.0%
dd                   771   214M 214M 16%|dd                   771     0  214M 16%
dd                   771   216M 216M 16%|dd                   771     0  216M 16%
dd                   771   211M 211M 16%|dd                   771     0  211M 16%


また、dstatはPythonで書かれているので、ぺろっと置くだけですぐに使えますし、先に見た--mysql5-cmdや--top-bioなどもそうなのですが、Pythonでプラグインを書けば好きな統計値をdstatで表示できるようにできる点もよいですね。

追記 2012-02-29

id:sh2 さんのブコメより、--output FILENAMEすると、通常通り画面には表示しつつ、CSV形式でファイルに落とすことができます。これは便利すね!!

2012-02-22 (Wed)

Apache 2.4.1 で気になった新機能などのメモ

2012-02-01 (Wed)

jwhoisでwhois.jprs.jpへの問い合わせが失敗する→IPv6がらみの問題?→解決

そういうや最近、jwhoisでjpドメインのwhoisが失敗するなー

$ jwhois --version
jwhois version 4.0, Copyright (C) 1999-2007  Free Software Foundation, Inc.
This program is free software with ABSOLUTELY NO WARRANTY; you may
redistribute it under the terms of the GNU General Public License.

$ jwhois -df -hwhois.jprs.jp kek.jp
[Querying whois.jprs.jp]
[Unable to connect to remote host]

と思ったのでちょっと見てみましたというお話です。


2012-02-01 追記

id:clicklog さんに教えていただいた

がビンゴでした!

Ubuntu 10.04用のアップデートはなかったのですが、

からjwhois_4.0-2_{i386,amd64}.debを持ってきて、dpkg -iでインストールして無事、解決しましたー


#  tcpdump -nlxX -i any -s 1600 port 43

で見つつjwhoisしてみると、「<JPRS WHOIS HELP> [To suppress Japanese output...」という応答が返ってきてる模様。これは期待した問い合わせ結果じゃないけど、whoisサーバーからの応答なのは間違いないと。


次にstraceでみてみると、

$ strace jwhois -df -hwhois.jprs.jp kek.jp
...
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.6.25.2")}, 16) = 0
gettimeofday({1328028532, 663221}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
send(4, "\274\350\1\0\0\1\0\0\0\0\0\0\5whois\4jprs\2jp\0\0\34\0\1", 31, MSG_NOSIGNAL) = 31
poll([{fd=4, events=POLLIN}], 1, 5000)  = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [59])                = 0
recvfrom(4, "\274\350\201\200\0\1\0\1\0\0\0\0\5whois\4jprs\2jp\0\0\34\0\1\300"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.6.25.2")}, [16]) = 59
close(4)                                = 0
stat64("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=77, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.6.25.2")}, 16) = 0
gettimeofday({1328028532, 665655}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
send(4, "\210P\1\0\0\1\0\0\0\0\0\0\5whois\4jprs\2jp\0\0\1\0\1", 31, MSG_NOSIGNAL) = 31
poll([{fd=4, events=POLLIN}], 1, 5000)  = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [47])                = 0
recvfrom(4, "\210P\201\200\0\1\0\1\0\0\0\0\5whois\4jprs\2jp\0\0\1\0\1\300"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.6.25.2")}, [16]) = 47
close(4)                                = 0
open("/etc/gai.conf", O_RDONLY)         = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2980, ...}) = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=2980, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76b1000
read(4, "# Configuration for getaddrinfo("..., 4096) = 2980
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0xb76b1000, 4096)                = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET6, sin6_port=htons(43), inet_pton(AF_INET6, "2001:df0:8:7::70", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
connect(4, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(43), sin_addr=inet_addr("202.11.16.169")}, 16) = 0
getsockname(4, {sa_family=AF_INET6, sin6_port=htons(37715), inet_pton(AF_INET6, "::ffff:10.6.25.39", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(4)                                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4
fcntl64(4, F_GETFL)                     = 0x2 (flags O_RDWR)
fcntl64(4, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
connect(4, {sa_family=AF_INET, sin_port=htons(43), sin_addr=inet_addr("202.11.16.169")}, 16) = -1 EINPROGRESS (Operation now in progress) ★怪しげポイント
select(1024, NULL, [4], NULL, {75, 0})  = 1 (out [4], left {74, 995234})
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = 5
fcntl64(5, F_GETFL)                     = 0x2 (flags O_RDWR)
fcntl64(5, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
connect(5, {sa_family=AF_INET6, sin6_port=htons(43), inet_pton(AF_INET6, "2001:df0:8:7::70", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
write(1, "[Querying whois.jprs.jp]\n[Unable"..., 60[Querying whois.jprs.jp]
[Unable to connect to remote host]
) = 60
exit_group(1)                           = ?

次に、うまく引けるjwhois 3.2.2のstrace(の後半のみ):

...
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET6, sin6_port=htons(43), inet_pton(AF_INET6, "2001:df0:8:7::70", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
connect(4, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(43), sin_addr=inet_addr("202.11.16.169")}, 16) = 0
getsockname(4, {sa_family=AF_INET6, sin6_port=htons(62221), inet_pton(AF_INET6, "::ffff:10.6.25.39", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(4)                                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(43), sin_addr=inet_addr("202.11.16.169")}, 16) = 0
write(4, "kek.jp\r\n", 8)               = 8
read(4, "[ JPRS database provides informa"..., 1023) = 1023
read(4, "                          \33$BJ8I"..., 1023) = 612
read(4, "", 1023)                       = 0
write(1, "[Querying whois.jprs.jp]\n[whois."..., 1676[Querying whois.jprs.jp]
[whois.jprs.jp]
[ JPRS database provides information on network administration. Its use is    ]
...

比べた感じだと、うまくいかない方は

connect(4, {sa_family=AF_INET, sin_port=htons(43), sin_addr=inet_addr("202.11.16.169")}, 16) = -1 EINPROGRESS (Operation now in progress)

というのが出てて、その後にIPv6で接続しようとして(IPv6では到達経路がないので)コネクションに失敗して、それをもってjwhoisさんは「[Unable to connect to remote host]」とエラー終了しているように見えます。


このマシンはこんな感じ。

  • Ubuntu 10.04
  • IPv6が有効になってる
  • kernelはこれ: unaem -r → 2.6.35-23-generic
  • glibcはこれ: GNU C Library (Ubuntu EGLIBC 2.11.1-0ubuntu7.8) stable release version 2.11.1

straceをみると、/etc/gai.confを読んでるんで、RFC 3484がらみかなーと思い、

$ grep -v ^# /etc/gai.conf 
scopev4 ::ffff:169.254.0.0/112  2
scopev4 ::ffff:127.0.0.0/104    2
scopev4 ::ffff:10.0.0.0/104     5
scopev4 ::ffff:172.16.0.0/108   5
scopev4 ::ffff:192.168.0.0/112  5
scopev4 ::ffff:0.0.0.0/96       14

としてみたものの、結果は変わらず。

IPv6を完全にオフればwhoisは引けるようになりそうな気がするけど、なんかちょっとそれはアレだなぁ。。と思ってるところです。

なにか情報お持ちの方は教えてください><

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
Connection: close