そもそも高負荷のMySQLでパケットを完全にキャプチャできるのか?
tcpdumpでMySQLのserevr/client間のパケットをとろうとしてもdropped by kernel
がちょいちょい出てしまう。
現状いろいろ工夫してもdropするときはdropするという状態で困っているが、ここまでやったことを整理しておく。
- 不要な名前解決をやめる
-n
,-nn
でホスト, ポートの名前解決をとめる
- file出力する
- 標準出力するより早いことが多い
- さらにtmpfsを出力することで大量のパケットをキャプチャする場合もレイテンシを減らす
- buffer sizeを調整する
-B
でバッファサイズを調整する。100Kパケット撮ろうとすると1024~4096あたりでdrop packetしない値がある気がする。大きすぎても小さすぎても良くない気がするけど、内部実装わかってない
- とにかくFilterする
-i <interface>
で絞る, allとかにしない- host, port, dstでできる限り絞る。これも最終的なパケットが減ることと条件が複雑になることのトレードオフがどれくらい発生するのかはわかっていない
結果、以下のようなオプションで実行している。 tmpfsのディレクトリに対してファイル出力し、繰り返し取る場合も上書きせず新しくしたほうが良さそう(体感)。
tcpdump -n -nn -s 0 -i <network-card> port 3306 -B 1024 -c 10000 -w <filename>.pcap
これでもdrop packet発生することはあって、それはお手上げ状態。 こういうのちゃんと説明できるくらいになりたい、、、