ネットワークパケットを監視し、それらのパケットがメモリによってどのように処理され、LinuxプラットフォームのCPUに送られるかを監視するためのコマンドまたはツールはありますか?
たとえば、tcpdumpを使用すると、多くのApacheリクエストをキャプチャできますが、それらのパッケージがどのようにプロセスIDに割り当てられているのかわかりません。
サーバープロセスが起動すると、いくつかのシステムコール(socket()
およびlisten()
)が発行されます。次に、システムはポートを開き、プロセスが対話するためのソケットファイル記述子を作成します。あなたはこれを見ることができます:
ApacheマスタープロセスIDを見つけます。
root@frisbee:~# ps -ef | grep Apache | grep root
root 27440 1 0 16:06 ? 00:00:00 /usr/sbin/Apache2 -k start
/proc/$pid/fd
に移動し、ソケットを表示します。
root@frisbee:~# ls -l /proc/27440/fd | grep socket
lrwx------ 1 root root 64 apr 16 16:12 3 -> socket:[518486]
lrwx------ 1 root root 64 apr 16 16:12 4 -> socket:[518487]
ここでは、Apacheによって開かれた2つのソケットがあることがわかります。 Apacheプロセスは、内部的にファイル記述子3および4を使用して、ネットワーク接続を介してデータを読み取り/書き込みできます。
ソケットとリスニングポート間のマッピングは、lsof
で見つけることができます。
root@frisbee:~# lsof | egrep 'IPv6.*(518486|518487)'
Apache2 27440 root 4u IPv6 518487 0t0 TCP *:http (LISTEN)
Apache2 27445 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
Apache2 27446 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
Apache2 27447 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
Apache2 27448 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
Apache2 27449 www-data 4u IPv6 518487 0t0 TCP *:http (LISTEN)
同じファイル記述子を使用する複数のApacheプロセスがあります(特権ポートであるため、root
として実行されているプロセスによって開かれます)。これらはApacheワーカーです。
ポートとプロセス間のリンクを表示する簡単な方法は、netstat
コマンドを使用することです。
mtak@frisbee:~$ Sudo netstat -tulpn | grep Apache
tcp6 0 0 :::80 :::* LISTEN 4269/Apache2