![我们有 nginx 代理到 apache w/mod wsgi,服务器负载非常高,如何追查原因?](https://linux22.com/image/491919/%E6%88%91%E4%BB%AC%E6%9C%89%20nginx%20%E4%BB%A3%E7%90%86%E5%88%B0%20apache%20w%2Fmod%20wsgi%EF%BC%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B4%9F%E8%BD%BD%E9%9D%9E%E5%B8%B8%E9%AB%98%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%BD%E6%9F%A5%E5%8E%9F%E5%9B%A0%EF%BC%9F.png)
我们在 apache 2 前面有一个 nginx 实例(nginx 处理静态资源,动态内容请求代理到 apache),它主要使用 mod_wsgi 来为各种 python/django 应用程序提供服务。
我们突然发现服务器负载很高(稳步攀升至 50 以上,通常低于 1),并且正在寻找查明原因的最佳方法。
有没有办法查看哪些虚拟主机负责 apache 进程?
我们也欢迎一些诊断服务器负载过高原因的一般技巧。
编辑:感谢大家的帮助,原来这是由代码错误引起的,不需要重新配置服务器。不过,提供的提示将来会很有用。
答案1
这mod_status
Apache 中的模块将显示特定进程正在处理哪个虚拟主机/请求,但这仅在请求持续时间较长时才有用。添加执行时间处理时间 (%D
)对您的 ApacheLogFormat
也很有用。
更重要的是追踪瓶颈。为此,您需要调查(通常默认安装)以及一个可爱的新工具,它将两者结合起来并添加了更多功能iostat
,vmstat
dstat
。
答案2
如果您在运行 vmstat 时看到“cpu”下的“wa”列中有很多操作(即花费大量时间等待输入/输出),那么我怀疑问题实际上是 nginx,而不是 Apache。它可能执行了太多 I/O,因为它的缓冲区不够大,无法处理代理内容。
尝试将其添加到 nginx.conf:
proxy_buffers 32 4k;
根据需要增加。