tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

そもそも高負荷のMySQLでパケットを完全にキャプチャできるのか?

tcpdumpMySQLの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発生することはあって、それはお手上げ状態。 こういうのちゃんと説明できるくらいになりたい、、、