Java在CentOS上的性能优化配置
小樊
33
2025-12-21 09:49:01
Java在CentOS上的性能优化配置
一 系统层优化
- 资源与I/O
- 将应用数据盘格式化为XFS/ext4,挂载时使用noatime减少元数据写入;为日志与临时目录使用独立磁盘或分区,降低I/O争用。
- 适度调低vm.swappiness(如10–30),减少换页;确保物理内存为应用预留**20–30%**余量,避免系统OOM-killer误杀JVM。
- 文件句柄与进程数
- 提升运行Java进程的用户级限制(/etc/security/limits.conf 或 systemd service 的 LimitNOFILE/LimitNPROC),建议将nofile ≥ 65536、nproc ≥ 65536,防止“Too many open files”和线程创建失败。
- 网络栈
- 提升连接处理能力:net.core.somaxconn、net.core.netdev_max_backlog 调至4096–16384;扩大本地端口范围 net.ipv4.ip_local_port_range 为1024 65535。
- 启用快速回收与保活:net.ipv4.tcp_tw_reuse=1;net.ipv4.tcp_fin_timeout=30;net.ipv4.tcp_keepalive_time=1200、tcp_keepalive_intvl=15、tcp_keepalive_probes=5;net.ipv4.tcp_max_syn_backlog=8192。
- 高并发短连接服务可启用SO_REUSEPORT或使用多个worker进程/实例做端口复用与负载分摊。
- 透明大页(可选)
- 对于大堆(≥8GB)且GC停顿敏感的场景,可启用透明大页(THP)或配置HugePages;需结合负载压测评估,部分延迟敏感应用更适合关闭THP以避免运行时抖动。
二 JVM层优化
- 基础内存与GC选择
- 将**-Xms 与 -Xmx 设为等值**(如**-Xms8g -Xmx8g**),避免运行期扩缩堆带来的停顿;堆占可用内存的**60–75%**更稳妥(为堆外内存、元空间、容器/系统预留)。
- 优先选用G1 GC(JDK 8u40+),低延迟/大堆场景表现稳定;JDK 11+ 可考虑 ZGC(极低停顿,需较新内核与JDK)。
- 常用G1参数模板(按负载微调)
- -XX:+UseG1GC -XX:MaxGCPauseMillis=200–500 -XX:G1HeapRegionSize=16–32m
- -XX:InitiatingHeapOccupancyPercent=35–45 -XX:ConcGCThreads=≈CPU/4 -XX:ParallelGCThreads=≈CPU
- -XX:+G1UseAdaptiveIHOP -XX:G1MixedGCCountTarget=8 -XX:G1MixedGCLiveThresholdPercent=85
- 元空间:-XX:MaxMetaspaceSize=512m–1g(避免无界增长)
- GC日志与诊断
- 开启统一GC日志(JDK 9+):-Xlog:gc*,gc+age=trace,safepoint:file=gc.log:time,tags,level=info
- 或使用经典参数:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100m
- 容器与平台
- 在容器/虚拟化环境显式设置**-XX:+UseContainerSupport**(JDK 8u191+),并优先以容器内存限制为基准设置堆,而非宿主机内存。
- 启动加速(可选)
- 对启动敏感的服务,可阶段性使用CDS(Class Data Sharing):-Xshare:on;或使用jlink定制运行时镜像减少类加载与JIT预热成本。
三 常见中间件与网络服务配置
- Tomcat(NIO/NIO2)
- 连接器采用NIO/NIO2,合理设置 maxThreads(如200–500)、acceptCount(如100–300)、connectionTimeout;按需开启 keepAliveTimeout、maxKeepAliveRequests(如100);不需要时关闭AJP;将 access/error日志切分与异步写入,降低I/O阻塞。
- Spring Boot内嵌容器
- server.tomcat.max-threads、server.tomcat.accept-count、server.tomcat.protocol=org.apache.coyote.http11.Http11Nio2Protocol;静态资源启用缓存与压缩;数据库连接池使用HikariCP并合理设置 minimumIdle≈maximumPoolSize、connectionTimeout、idleTimeout、maxLifetime。
- 通用网络服务
- 长连接服务适当增大SO_SNDBUF/SO_RCVBUF与backlog;启用TCP_NODELAY降低Nagle延迟;对外部依赖(DB/Redis)使用连接池与超时/重试策略,避免级联雪崩。
四 监控与容量规划
- 系统监控
- 持续观察CPU利用率、负载、上下文切换、内存与Swap、磁盘IOPS/延迟、网络pps/带宽与丢包;工具建议:top/vmstat、htop、iostat -x 1、sar -n DEV、nload/iftop、dstat。
- JVM监控与诊断
- 开启JMX远程监控(生产慎用认证与加密);定期采集与分析GC日志(停顿分布、晋升速率、并发标记耗时);按需抓取jstack(线程争用/阻塞)、jmap -histo/ -dump(对象热点/泄漏)、Async Profiler或JFR(低开销采样/飞行记录)。
- 容量与压测
- 以峰值QPS×平均RT估算并发连接与I/O能力;结合JMeter/Gatling做渐进式压测,验证线程数、连接池、GC停顿与系统资源瓶颈;遵循“一次只变更一个变量”的迭代法,固化有效配置并纳入发布回滚预案。
五 一键落地示例
- 系统内核参数(/etc/sysctl.conf,执行 sysctl -p 生效)
- net.core.somaxconn = 16384
- net.core.netdev_max_backlog = 16384
- net.ipv4.ip_local_port_range = 1024 65535
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 1200
- net.ipv4.tcp_keepalive_intvl = 15
- net.ipv4.tcp_keepalive_probes = 5
- net.ipv4.tcp_max_syn_backlog = 8192
- vm.swappiness = 10
- systemd服务示例(/etc/systemd/system/java-app.service)
- [Service]
- User=app
- ExecStart=/usr/bin/java -Xms8g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=40 -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/app/gc.log:time,tags,level=info -jar /opt/app/app.jar
- LimitNOFILE=65536
- LimitNPROC=65536
- Restart=on-failure
- 说明
- 上述参数为通用起点,需结合实例规格(CPU/内存/磁盘/网络)、应用特征(短/长连接、对象生命周期、I/O占比)与压测结果逐步微调;变更前务必在预发/灰度环境验证,并做好回滚与备份。