Hello!
2015-02-04 18:40 GMT-08:00 rong zhongjian:
>
> 谢谢春哥,你帮我们解决了一个瓶颈问题。之前我们以为是 http 协议代理带来了性能的损失,一直想要把 http 协议替换成另外一种协议之类的来提高传输速度。
所以说不进行 profile 就着手优化很容易误入歧途 :)
> 我按照你说的配置了:
>
> proxy_buffer_size 32k;
> proxy_buffers 4 32k;
> proxy_busy_buffers_size 32k;
> proxy_buffering off;
不明白为什么你要禁用 proxy_buffering.
你究竟配置了多少个 nginx worker 进程?连接池的大小合理不?
>
> 现在火焰图就没有了 connect 和 close 两块:
>
很好。不过建议提供 SVG 格式的火焰图。你这个 PNG 图片里损失了很多信息,不便于我“看图说话”,呵呵。
[...]
> Failed requests: 832
> (Connect: 0, Receive: 0, Length: 832, Exceptions: 0)
> Non-2xx responses: 832
这些失败的请求是怎么回事?后端服务器的 bug?
建议进行 ab 压测时尽量启用 -k 选项,毕竟把 TCP 握手的开销算在内并没什么意义。
另外,我注意到你的 ab、nginx 代理和后端服务器都运行在同一台机器上。这种配置很容易犯一个错误,即让 CPU 时间不够用。必须确保
ab、nginx 代理以及后端服务器都有充足的 CPU 时间,而不至于相互争抢 CPU 资源,影响压测结果。最简单的做法是给 nginx
只配置较少数目的 worker 进程。
次外我不清楚你是否恰当配置了 worker_cpu_affinity 指令,这应当会很有帮助(如果正确配置了了的话)。
值得一提的,从火焰图上看,配置 lingering_close off 对于你这个 benchmark 来说或许也可以提升一些性能。
还有,你貌似并没有回答我先前提的那个问题:“在满载时,nginx 的 CPU 使用率在 Linux 和 FreeBSD 上分别是怎样的?”
如果每个 nginx worker 进程的 CPU 压不满 100%,则可以考虑使用 off-CPU 火焰图再行分析:
https://github.com/openresty/nginx-systemtap-toolkit#sample-bt-off-cpu
Regards,
-agentzh