在 Ubuntu 上使用桥接网络运行时,docker / nginx 吞吐量较差

在 Ubuntu 上使用桥接网络运行时,docker / nginx 吞吐量较差

我的 nginx 配置似乎通过 docker 网络提供极差的性能,而主机(专用服务器)具有很好的规格(104 线程、245gb DDR4、SSD)。

当使用 wrk 从主机外部提供静态 HTML 文件(1mb)进行基准测试时,我得到了大约 10 个请求/秒。

Running 30s test @ http://x/static.html
  40 threads and 80 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     5.62s     2.37s   13.20s    67.02%
    Req/Sec     0.46      1.40    10.00     90.74%
  382 requests in 30.09s, 393.63MB read
Requests/sec:     12.69
Transfer/sec:     13.08MB

当从同一个docker网络中的容器连接时,我得到了每秒500个请求。

我在主机上和 docker 统计信息中均未看到任何明显的 CPU 负载。磁盘 IO 也不多,而且仍有大量可用内存。

我读到的一个解决方案是在主机网络上运行 nginx 实例,但由于我在同一台主机上运行了多个 nginx 实例(具有等量的 PHP FPM 实例),因此我不想在主机模式下运行它们,并且必须处理需要分配的所有端口。我还使用 docker 容器名称在同一个 docker(桥接)网络中访问 FPM。

Nginx 配置:

server {
    listen 80;
    server_name x;

    root /app/web;
    index app.php;

    location / {
        try_files $uri $uri/ /app.php?$args;
    }
}
user  nginx;

worker_processes auto;

worker_rlimit_nofile 100000;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections 4000;
    multi_accept        on;
    use                 epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$host" "$request" "$scheme" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" -- $request_time';

    access_log  /var/log/nginx/access.log  main;

    #gzip            on;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    server_tokens off;

    # allow long domain names
    server_names_hash_bucket_size 128;

    proxy_buffering                 off;
    proxy_buffer_size  128k;
    proxy_buffers 100  128k;

    include /etc/nginx/sites-enabled/*;

    keepalive_requests 100000;
}

我该怎么做才能发现/分析瓶颈? 是否有任何选项可以使用docker桥接网络获得不错的性能?

答案1

您需要 PHP 和 PHP-FPM 吗?您的问题涉及使用静态 HTML 文件进行分析。静态和动态 PHP 的响应显然会有所不同。
如果您只对静态 HTML 感兴趣 - 您可以在容器中运行 NGINX 并公开端口 80。这将提供与您的“在 docker 网络内连接”更好的比较。如果您不想复制静态文件,您可以将静态文件放在容器的 docker 卷上。
如果您需要 PHP - 那么将其与 nginx 一起加载到 docker 容器中仍会比接受主机的共同点提供更多的控制权。
让我们知道发生了什么……

相关内容