我的 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 容器中仍会比接受主机的共同点提供更多的控制权。
让我们知道发生了什么……