我们的设置如下:
nginx->haproxy->应用服务器
我们正在使用 nginx 终止 SSL,它位于一切的前面。在我们的高峰负载时间,我们的性能下降了大约 2 倍。通常需要 400 毫秒的请求现在需要 800 毫秒。整个互联网需要更长的时间。
问题是,我的日志和图表中完全没有出现任何减速迹象。New Relic 显示所有应用服务器都响应正常,速度没有变化。Nginx 和 haproxy 的日志中没有显示任何请求减速的信息,但我们的速度确实变慢了。尽管 nginx 显示我跟踪的某个请求在整个堆栈中花费了 17 毫秒,但在上周的峰值负载期间,curl 需要 1.5 秒。
因此,我有两个选择:1) 网络问题 - 根据路由器的图表,我剩余的管道绰绰有余。我只使用了 1 Gbps 端口中的 400 Mbps,并且 ifconfig 或交换机或路由器上没有错误。但是,SoftLayer 管理这个设备,所以我无法亲自验证这一点。我想也可能是因为内核的原因,所以问题出在我们这边,所以我在下面发布了我的 sysctl 值:
2) nginx 正在阻止请求,要么不记录请求,要么我记录的内容不正确。请求是否可能因为工作人员比较忙而排队,无法快速得到处理?如果确实发生了这种情况,除了 $request_time 之外,我还能记录 nginx 中的哪些内容,因为它根本没有显示任何减速。而且,如果请求实际花费的时间可能比 $request_time 指示的时间更长,我该如何调整配置以加快速度?
系统控制寄存器
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 3
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 16777216 16777216 16777216
net.ipv4.tcp_wmem = 16777216 16777216 16777216
net.ipv4.tcp_max_tw_buckets = 16777216
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 15000
net.core.netdev_budget = 8196
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_nonlocal_bind = 1
适用的 nginx 配置
user www-data;
worker_processes 20;
worker_rlimit_nofile 500000;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
use epoll;
multi_accept off;
accept_mutex off;
worker_connections 65536;
}
答案1
您可以将排队时间添加到您的 newrelic 图表中:
在 nginx 配置中的 SSL 终止符处添加到服务器块:
set $msecstart "${msec}000";
if ($msecstart ~ "^(.*)\.(.*)") {set $msecout "t=$1$2";}
proxy_set_header X-Request-Start $msecout;
因此 X-Request-Start 标头将包含微秒的时间,当此请求到达 newrelic 代理时,它将更新图表。确保平衡器和后端服务器上的时间同步良好。
ps. 需要 000 技巧,因为 nginx 中的 $msec 以毫秒为单位,而 newrelic 代理需要以微秒为单位的数据。
答案2
如果您在高峰时段采用最高并发连接数并将该值乘以 1.5,您能确保您的负载均衡器和应用服务器的连接池没有耗尽吗?您是否监控应用服务器/HA 代理响应时间?您能确保您的应用服务器不是问题吗?