我们有一个如下所示的设置:
nginx-> haproxy->应用程序服务器
我们正在用nginx终止SSL,它位于一切的前面。 在我们的高峰负载时间,我们正在经历大约2倍的性能影响。 通常需要400毫秒的请求需要800毫秒。 整个互联网需要更长的时间。
问题是,我的日志和图表中没有任何放缓的迹象。 New Relic显示所有应用程序服务器都正确响应,速度没有变化。 Nginx和haproxy在其日志中没有显示任何关于请求放缓的情况,但是我们正在放缓。 尽pipenginx显示我跟踪的一个特定的请求是在整个堆栈中花费17ms,但在上周的高峰负载中需要花费1.5秒钟。
所以,这给我留下了两个select:1)networking问题 – 根据路由器的graphics,我留下了足够多的pipe道。 我只使用1 Gbps端口中的400 Mbps,并且在ifconfig或交换机或路由器中没有错误。 然而,SoftLayerpipe理这个设备,所以我不能亲自validation。 它可能在我们这边,因为内核以及我想,所以我发布我的sysctl值如下:
2)nginx阻止了请求,要么不logging它,要么我没有logging正确的事情。 是否有可能要求排队,因为工人更忙,他们没有得到尽快的行动? 如果实际上发生了这种情况,除了$ request_time之外,我可以loginnginx什么,因为它没有显示任何减速。 而且,如果这可能实际上需要的时间超过了$ request_time指示的时间,那么我该如何去调整configuration来加快速度呢?
SYSCTL
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
适用于nginxconfiguration
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; }
您可以将队列时间添加到新的图表中:
在您的SSL终结者的nginxconfiguration添加到服务器块:
set $msecstart "${msec}000"; if ($msecstart ~ "^(.*)\.(.*)") {set $msecout "t=$1$2";} proxy_set_header X-Request-Start $msecout;
因此,X-Request-Start头将包含微秒的时间,并且当这个请求到达新的代理时,它将更新graphics。 确保平衡器和后端服务器的时间都很好地同步。
PS。 000技巧是必要的,因为nginx中的$ msec是MILLIseconds,而newrelic代理需要MICROseconds中的数据。
如果在高峰时段采用最高的并发连接并将此值乘以1.5,那么您是否可以确定负载均衡器和应用程序服务器的连接池未耗尽? 你是否监视app-server- / ha-proxy-response-time? 你可以确定你的应用服务器不是问题吗?