2

我正在负载测试一个 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 的反向代理
            }
        }
    }
4

1 回答 1

2

罪魁祸首是(默认)内核 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

于 2016-11-01T08:23:54.677 回答