netstat
確立された接続のPIDを使用または検索するのは簡単ですlsof
。ただし、60秒ごとにデータベースへの接続を作成し、最大接続試行失敗制限にロックするプロセスがあります。データベースの接続障害の制限を非常に高く増やしたり、接続が発生した原因を追跡したりできましたが、私は後者を選択しました。
tcpdump / wiresharkに基づいて接続が確立された後、サーバーが応答する前に接続サーバーがすぐに接続を閉じることがわかります。私が知らないのは理由です。
最初のステップは、接続を開いたPIDを見つけることです。残念ながら、これは言葉のように簡単ではないようです。問題は、接続がTIME_WAIT状態に入ると、PIDに接続されなくなることです。接続時間が10分の1秒未満なので、この情報を記録する方法はありますか?
netstat
毎秒ポーリングできるようですが、lsof
私が扱っている接続試行に比べて速度が十分に速くはありません。この情報をログにダンプするために接続できるフックはありますか?それとも、ループといくつかのコーディングを介して無差別代入を実行する唯一のオプションですか?
CentOS 6を使用しています。
答え1
使用を検討してくださいシステムクリック。これは、ソケットを開くなどのカーネル内のイベントを追跡できるように、即座にカーネルにパッチを適用できる動的計測エンジンです。 RedHatで積極的に開発されたため、CentOSでサポートされています。
インストール
CentOS 6にSystemTapをインストールするには:
デバッグ情報ストアを有効にします。
sed -i 's/^enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Debuginfo.repo
システムタブの取り付け:
yum install systemtap
カーネルの debuginfo パッケージをインストールします。手動で実行することもできますが、自動的に実行するツールがあります。
stap-prep
道
SystemTapにはTCP接続用のTapsetプローブはありませんが、カーネル機能に直接バインドできます。ソケットレベルでもこれを行うことができます。
つまり、次のようなファイルを作成しますconn.stp
。
probe kernel.function("tcp_v4_connect") {
printf("connect [%s:%d] -> %s:%d\n", execname(), pid(),
ip_ntop(@cast($uaddr, "struct sockaddr_in")->sin_addr->s_addr),
ntohs(@cast($uaddr, "struct sockaddr_in")->sin_port));
}
すると、次のような結果が出力されます。
# stap conn.stp
connect [nc:2552] -> 192.168.24.18:50000
connect [nc:2554] -> 192.168.24.18:50000
connect [nc:2556] -> 192.168.24.18:50000
しかし、リンク解除イベントを追跡する方が難しいようです。