基于32核高性能服务器的Nginx SSL与性能优化方案及流程咨询
基于32核高性能服务器的Nginx SSL与性能优化方案及流程咨询
嗨,看了你的测试数据和问题,先给你拆解下核心矛盾:不带-k(KeepAlive)时性能暴跌到2348 RPS,本质是SSL/TLS握手的开销在无连接复用的情况下被彻底放大了——每次请求都要重新完成TCP三次握手+SSL/TLS握手,这两步的延迟和CPU开销远大于Health Check请求本身,而你的服务器CPU还有大量空闲(vmstat显示id始终在95%以上),说明瓶颈根本不在计算能力,而是连接建立的效率和Nginx的连接处理配置没跟上。
下面给你分模块讲具体优化方案和系统化调优流程:
一、针对无KeepAlive场景的SSL核心优化
这是解决你当前低RPS的关键,毕竟不是所有客户端都会用KeepAlive:
- 启用SSL会话复用:让重复客户端不用每次都重新握手,直接复用之前的会话。在Nginx的
http块里加:ssl_session_cache shared:SSL:10m; # 10M缓存大概能存40万会话 ssl_session_timeout 1d; # 会话有效期设长一点 - 强制启用TLS 1.3:TLS1.3比TLS1.2握手快太多(1-RTT甚至0-RTT),大幅降低握手延迟。配置:
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; - 选高效的加密套件:优先选AMD CPU友好的低开销套件,比如CHACHA20(比AES更适合ARM/AMD架构),配置:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256; - 启用SSL会话票据(Session Tickets):比会话缓存更灵活,适合分布式场景,也能减少客户端重新握手的概率:
ssl_session_tickets on;
二、Nginx核心连接配置优化(适配32核服务器)
充分利用你的硬件资源,让Nginx能处理更多连接:
- Worker进程数:你现在设为24,建议直接拉满到CPU线程数(32),或者让Nginx自动适配:
7950X3D是16物理核32线程,用32个worker能最大化利用每个线程的算力。worker_processes auto; # 或者手动写32 - Worker连接数:提高每个worker能处理的最大连接数,同时要配合系统文件句柄限制:
然后修改系统文件句柄限制:events { use epoll; # 用Linux高效的epoll事件模型 multi_accept on; # 让worker一次性接受多个连接,提高效率 worker_connections 10240; # 每个worker最多处理10240个连接 }
在/etc/security/limits.conf加:
在nginx soft nofile 65535 nginx hard nofile 65535/etc/sysctl.conf加:fs.file-max = 1000000 - 短连接优化:针对无KeepAlive的场景,及时释放连接资源:
reset_timedout_connection on; # 主动关闭超时连接 keepalive_timeout 65; # KeepAlive超时时间(默认75,可调短) keepalive_requests 1000; # 每个KeepAlive连接最多处理1000个请求(适合带-k场景)
三、系统内核TCP参数优化(解决短连接瓶颈)
短连接场景下,TIME_WAIT状态的连接堆积会占满端口,导致新连不进来,必须调内核参数:
在/etc/sysctl.conf加以下配置,然后执行sysctl -p生效:
net.core.somaxconn = 65535 # 提高TCP监听队列长度,避免连接被拒绝 net.ipv4.tcp_syncookies = 1 # 防止SYN洪水攻击,不影响正常连接 net.ipv4.tcp_tw_reuse = 1 # 允许复用TIME_WAIT状态的连接,对短连接极其有用 net.ipv4.tcp_fin_timeout = 30 # 缩短TIME_WAIT超时时间,更快释放端口 net.ipv4.tcp_max_tw_buckets = 5000 # 限制TIME_WAIT连接的最大数量
四、系统化性能调优流程
给你一套可落地的流程,确保你能逐步找到最优配置:
- 基准测试:先固定当前配置,用
ab或更专业的wrk做压测,记录RPS、延迟、CPU/内存/网络使用率,作为基准线。 - 瓶颈定位:
- 用
vmstat、mpstat看CPU:你的数据显示不带-k时sy(系统CPU)只有1-2%,说明CPU没跑满,瓶颈在连接建立; - 用
ss -s看连接状态:如果TIME_WAIT数量很多,就是短连接的端口堆积问题; - 抓包验证:用
tcpdump抓SSL握手包,看每次请求是否都要重新握手。
- 用
- 分步优化:每次只改一个配置,改完就压测,对比结果:
- 先改SSL配置(会话缓存、TLS1.3),测不带-k的RPS变化;
- 再调Nginx worker参数;
- 最后改内核TCP参数。
- 持续监控:上线后用工具监控Nginx的连接数、RPS、延迟,还有服务器的CPU、内存、网络,及时发现新瓶颈。
针对你的测试数据的额外建议
- 你带-k时能到50k RPS,但CPU还是有空闲,说明还能往上冲,可以试试提高
keepalive_requests到10000,或者用wrk模拟更多并发; - 不带-k时的核心问题是SSL握手,先启用SSL会话缓存和TLS1.3,应该能把RPS提升到几万级别;
- 测试工具可以换
wrk,比ab更准确,支持多线程和自定义脚本,能模拟更真实的负载:wrk -t 10 -c 1000 -d 30s https://***.com/TestHealth
备注:内容来源于stack exchange,提问作者0xPwn
相关产品推荐
相关产品推荐

