在 Linux 上运行 PHP 应用程序的 Apache prefork 服务器中,每个 HTTP 请求可能会从其他服务器(例如 Memcached)获取一些数据。假设我们想找出GET /blabla
占用 Memcached 最多带宽的前 10 个 HTTP 请求(例如)。有没有办法在不修改 PHP 应用程序的情况下监控每个 HTTP 请求占用了多少传出带宽?
我的方法是使用tcpdump
andnetstat
或/proc/net/tcp
。使用以下命令,它将收集传入的 HTTP 流量和传出的流量。但我无法轻易分辨出哪个特定的 HTTP 请求创建了哪些 Memcached 连接。虽然它是 Apache prefork,但可以记录每个 HTTP 请求的 PID,但tcpdump
不知道哪个进程创建了这些数据包。
tcpdump -i any src port 80 or port 11211 -w tcpdump.log
使用时netstat
,我经常发现其输出中缺少 PID 信息。
netstat -tpc >netstat.log
为了将 PID 映射到连接的套接字,我可以扫描/proc
并获取进程 ID 和本地端口。因此,我有一对 PID 和一个连接到 Memcached 的本地端口列表。通过在 tcpdump.log 中搜索这些端口号,我得到了数据包的长度。
我不确定每秒扫描整个目录或更频繁地扫描整个目录是否有效,因为 Apache 在我的例子中会生成 100 多个进程。我想可能有更好的方法。