各接続試行のPIDを記録します。

各接続試行のPIDを記録します。

netstat確立された接続のPIDを使用または検索するのは簡単ですlsof。ただし、60秒ごとにデータベースへの接続を作成し、最大接続試行失敗制限にロックするプロセスがあります。データベースの接続障害の制限を非常に高く増やしたり、接続が発生した原因を追跡したりできましたが、私は後者を選択しました。

tcpdump / wiresharkに基づいて接続が確立された後、サーバーが応答する前に接続サーバーがすぐに接続を閉じることがわかります。私が知らないのは理由です。

最初のステップは、接続を開いたPIDを見つけることです。残念ながら、これは言葉のように簡単ではないようです。問題は、接続がTIME_WAIT状態に入ると、PIDに接続されなくなることです。接続時間が10分の1秒未満なので、この情報を記録する方法はありますか?

netstat毎秒ポーリングできるようですが、lsof私が扱っている接続試行に比べて速度が十分に速くはありません。この情報をログにダンプするために接続できるフックはありますか?それとも、ループといくつかのコーディングを介して無差別代入を実行する唯一のオプションですか?

CentOS 6を使用しています。

答え1

使用を検討してくださいシステムクリック。これは、ソケットを開くなどのカーネル内のイベントを追跡できるように、即座にカーネルにパッチを適用できる動的計測エンジンです。 RedHatで積極的に開発されたため、CentOSでサポートされています。

インストール

CentOS 6にSystemTapをインストールするには:

  1. デバッグ情報ストアを有効にします。

    sed -i 's/^enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Debuginfo.repo
    
  2. システムタブの取り付け:

    yum install systemtap
    
  3. カーネルの 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

しかし、リンク解除イベントを追跡する方が難しいようです。

関連情報