在云原生架构中,Ingress Nginx作为Kubernetes的入口网关,其性能直接影响整个系统的吞吐能力。当业务流量达到万级QPS时,默认配置往往会出现CPU利用率飙升、响应延迟增大甚至连接丢弃等问题。本文基于某电商大促期间的实际调优案例,分享如何通过系统层、Nginx层和应用层的三重优化,在16核32G的标准计算节点上实现稳定支撑10万QPS的配置方案。
内核参数优化是高性能网络服务的基石。以下是必须调整的/etc/sysctl.conf配置项:
bash复制# 增大TCP连接队列
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 16384
# 启用TCP快速打开
net.ipv4.tcp_fastopen = 3
# 减少TIME_WAIT状态连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 内存分配策略
vm.overcommit_memory = 1
vm.swappiness = 10
关键提示:调整somaxconn时必须同步修改Nginx的listen backlog参数,否则不生效。大流量场景建议配合使用TCP_BPF进行拥塞控制优化。
编辑/etc/security/limits.conf文件:
bash复制* soft nofile 1048576
* hard nofile 1048576
nginx soft nproc unlimited
验证方式:
bash复制ulimit -n # 应显示1048576
在nginx.conf的events和http块中添加:
nginx复制worker_processes auto; # 与CPU核心数一致
worker_rlimit_nofile 100000;
events {
worker_connections 50000;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30s;
keepalive_requests 10000;
# 缓冲区优化
client_body_buffer_size 16k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
output_buffers 4 32k;
}
在ConfigMap中添加:
yaml复制data:
upstream-keepalive-connections: "1000"
upstream-keepalive-requests: "10000"
upstream-keepalive-timeout: "60s"
worker-shutdown-timeout: "240s"
max-worker-connections: "50000"
检查队列数量:
bash复制ethtool -l eth0
设置CPU亲和性(以8核为例):
bash复制for i in $(seq 0 7); do
echo $(($i*2)) > /proc/irq/$i/smp_affinity_list
done
bash复制# 增大TCP读写缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
使用wrk进行基准测试:
bash复制wrk -t16 -c5000 -d60s --latency http://service:80/
关键参数说明:
bash复制# 实时连接状态
watch -n 1 'ss -s | grep -i "total"'
# Nginx状态
curl http://localhost:10254/metrics | grep "nginx_ingress_controller_connections"
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502错误增多 | 后端连接耗尽 | 增大upstream-keepalive-connections |
| 延迟波动大 | CPU竞争 | 绑定中断到独立核心 |
| QPS上不去 | 文件描述符限制 | 检查ulimit和worker_rlimit_nofile |
安装perf工具:
bash复制apt install linux-perf
采集数据:
bash复制perf record -F 99 -p $(pgrep nginx) -g -- sleep 30
perf script > out.perf
在某电商平台的实际部署中,经过上述优化后:
关键经验:
对于超大规模集群(QPS>50万)建议:
调优是一个持续过程,建议每季度重新评估配置参数,特别是当业务流量增长50%以上时,需要重新进行压力测试验证。