优化高并发 Java 应用服务器的操作系统参数是提升系统吞吐量和稳定性的关键步骤。以下从内核层面、文件描述符、网络栈、内存管理及 JVM 协同等维度,提供具体可落地的优化方案:
一、文件描述符与进程限制
高并发场景下大量连接会迅速耗尽默认的文件描述符(FD)限制。
# 查看当前限制
ulimit -n
# 临时生效(当前 shell)
ulimit -n 65535
# 永久生效(/etc/security/limits.conf)
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
# 同时修改 systemd 服务配置(若使用 systemd 启动)
sudo systemctl edit your-java-service
# 添加:
[Service]
LimitNOFILE=65535
✅ 建议:Java 应用中
sun.net.util.IPAddressUtil或 Netty 等框架需确保 FD 充足;可通过lsof -p <pid> | wc -l监控实际使用情况。
二、TCP 网络栈调优(核心)
1. 启用高效 TCP 拥塞控制算法
# 推荐:bbr(Google 提出,适合高带宽低延迟)或 cubic(默认兼容性好)
sysctl -w net.ipv4.tcp_congestion_control=bbr
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
2. 调整连接队列与端口范围
# 增大监听队列(backlog),避免 SYN Flood 导致丢包
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 扩大 ephemeral 端口范围(避免 TIME_WAIT 耗尽端口)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 缩短 TIME_WAIT 回收时间(谨慎使用,需结合业务)
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
3. 优化接收/发送缓冲区
# 自动调整缓冲区大小(推荐开启)
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.wmem_max=16777216
# 禁用 Nagle 算法(对实时性要求高的场景)
sysctl -w net.ipv4.tcp_no_metrics_save=1
sysctl -w net.ipv4.tcp_moderate_rcvbuf=1
4. 处理 FIN_WAIT 状态积压
# 启用 TCP keepalive 探测
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=3
三、内存与交换空间管理
1. 关闭 Swap(避免频繁换页导致抖动)
# 临时关闭
swapoff -a
# 永久关闭(注释掉 /etc/fstab 中 swap 行,或设为 never)
echo "vm.swappiness = 1" >> /etc/sysctl.conf
⚠️ 注意:仅在物理内存充足时关闭 Swap;否则可能 OOM Killer 误杀进程。
2. 调整透明大页(THP)
某些 JVM 版本(如 OpenJDK 8u292+)建议禁用 THP 以减少 GC 停顿:
# 检查状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时禁用
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 永久禁用(创建 systemd 服务或 rc.local)
cat <<EOF > /etc/systemd/system/thp-disable.service
[Unit]
Description=Disable Transparent Huge Pages
After=sys-fs-fuse-connections.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStop=/bin/bash -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable thp-disable.service
四、CPU 与调度优化
1. 设置 CPU 亲和性(Affinity)
将 Java 进程绑定到特定 CPU 核,减少上下文切换:
# 使用 taskset(需先获取 PID)
taskset -cp 0-3 $(pgrep -f YourMainClass)
✅ 建议:预留 1~2 核给 OS 和 GC 线程;NUMA 架构服务器需注意跨节点访问开销。
2. 调整调度策略(可选)
# 对关键进程设为 FIFO 实时调度(需 root + CAP_SYS_NICE)
chrt -f 10 java -jar app.jar &
⚠️ 慎用:普通应用无需实时调度,反而可能影响其他进程。
五、JVM 参数协同优化示例
java
-Xms8g -Xmx8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1ReservePercent=15
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/gc.hprof
-Djava.net.preferIPv4Stack=true
-Dio.netty.leakDetection.level=DISABLED
-Dsun.nio.ch.maxBufferArraySize=16384
-Djdk.attach.allowAttachSelf=true
-jar your-app.jar
🔗 关键点:
-XX:+AlwaysPreTouch预热堆内存,避免运行时缺页中断;- G1GC 适合大堆(>6GB),配合
MaxGCPauseMillis控制停顿;- 禁用 Netty 泄漏检测(生产环境)。
六、验证与监控
| 工具 | 用途 |
|---|---|
ss -tan |
查看 TCP 连接状态分布 |
netstat -s |
统计丢包、重传、SYN 错误 |
perf top -p <pid> |
分析 CPU 热点 |
jstat -gcutil <pid> 1000 |
实时监控 GC 情况 |
sar -n DEV 1 |
网卡流量与错误率 |
✅ 推荐部署 Prometheus + Grafana 监控指标:tcp_conn_established, tcp_listen_queue_overflow, context_switches 等。
七、注意事项
- 压测先行:所有参数调整必须在测试环境充分压测后上线;
- 渐进式变更:每次只改 1~2 项,观察效果再推进;
- 云厂商差异:阿里云 ECS、AWS EC2 等可能有默认限制(如安全组、ENI 数量),需额外确认;
- 容器化场景:K8s 中需通过
resources.limits和sysctl注解同步配置(如securityContext.sysctls)。
通过以上系统性调优,典型高并发 Java 服务(如网关、微服务集群)可将 QPS 提升 30%~200%,P99 延迟显著降低。如需针对具体场景(如秒杀、直播推流、RPC 框架)进一步定制,可提供更多信息深入分析。
云服务器