【问题标题】:Periodic drop in throughput of nginx reverse proxy, what can it be?nginx反向代理吞吐量周期性下降,会是什么情况?
【发布时间】:2017-03-13 09:08:18
【问题描述】:

我正在对一个 t2.micro 盒子进行负载测试,该盒子在 docker 容器中运行了 nginx 和 postgrest。 Nginx 在 postgrest 前充当代理。 如果我直接进入上游(postgrest),我会得到一个很好的图表(峰值约为 900/rps) 如果我通过nginx,我会得到这种图表

CPU 未达到最大值(仅约 50%)

这是使用的 nginx 配置。评论的所有内容都已尝试过,没有任何影响。我还玩过 worker_connections 的值和相关的东西。 这种周期性下降是由什么触发的?

worker_processes 2; #worker_rlimit_nofile 2048; 事件{ # multi_accept on; worker_connections 1024; 使用 epoll; } http { 解析器 127.0.0.11 ipv6=off; 包括 mime.types; #tcp_nodelay 关闭; #tcp_nopush 开启; 上游postgrest { 服务器postgrest:3000; 保活 64; } 服务器 { 听 80; server_name 本地主机; 字符集 utf-8; 位置/休息/ { default_type 应用程序/json; #proxy_buffering 关闭; proxy_pass http://postgrest/; # PostgREST 的反向代理 } } }

【问题讨论】:

  • 延迟图也很有趣,它保持在大约 10 毫秒直到第一次下降,然后跳到大约 1 秒并且大部分停留在那里,反映了一点吞吐量图,但它没有出现回到 10 毫秒。也没有错误,每个请求都是 200 OK
  • 一个新的发展。如果我让容器使用主机网络,性能会更差,下降几乎为 0。有人知道如何比较主机和桥接模式的网络设置,看看有什么不同的参数吗?

标签: performance nginx reverse-proxy throughput postgrest


【解决方案1】:

罪魁祸首是(默认)内核 tcp 设置。 当通过 nginx 代理时,系统正在使用所有本地端口,然后一切都停止(丢弃),直到旧的 tcp 连接可以完全关闭(它们在 time_wait 中持续了 60 秒) 调整这些设置可以解决问题

#tcp settings
net.core.somaxconn
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_tw_reuse
net.ipv4.ip_local_port_range

#nginx configs
proxy_set_header  Connection "";
proxy_http_version 1.1;

下面的文章更详细地介绍了到底发生了什么,要调整的参数。

https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2011-08-05
相关资源
最近更新 更多