性能调优
调优说明
以下为核心调优参数说明,可通过调优参数最大可能压榨服务器性能,但仅建议根据实际情况调整参数,若盲目配置容易起到反作用哦。
一、Linux 操作系统参数
系统全局允许分配的最大文件句柄数:
# 2 millions system-wide
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open
允许当前会话/进程打开文件句柄数:
ulimit -n 1048576
1. /etc/sysctl.conf
持久化 fs.file-max
设置到 /etc/sysctl.conf 文件:
fs.file-max = 1048576
/etc/systemd/system.conf 设置服务最大文件句柄数:
DefaultLimitNOFILE=1048576
2. /etc/security/limits.conf
/etc/security/limits.conf
持久化设置允许用户/进程打开文件句柄数:
* soft nofile 1048576
* hard nofile 1048576
二、TCP 协议栈网络参数
1. 并发连接 backlog 设置:
sysctl -w net.core.somaxconn=32768
sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sysctl -w net.core.netdev_max_backlog=16384
2. 可用知名端口范围:
sysctl -w net.ipv4.ip_local_port_range='1000 65535'
3. TCP Socket 读写 Buffer 设置:
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.optmem_max=16777216
#sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
sysctl -w net.ipv4.tcp_rmem='1024 4096 16777216'
sysctl -w net.ipv4.tcp_wmem='1024 4096 16777216'
4. TCP 连接追踪设置:
sysctl -w net.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
5. TIME-WAIT Socket 最大数量、回收与重用设置:
sysctl -w net.ipv4.tcp_max_tw_buckets=1048576
# 注意: 不建议开启該设置,NAT模式下可能引起连接RST
# sysctl -w net.ipv4.tcp_tw_recycle=1
# sysctl -w net.ipv4.tcp_tw_reuse=1
6. FIN-WAIT-2 Socket 超时设置:
sysctl -w net.ipv4.tcp_fin_timeout=15
三、Spring Boot 工程 JVM 调优
JVM调优说明
针对BladeX AI平台的特点,以下JVM参数调优可以显著提升AI应用的性能,特别是在处理大模型推理、向量计算和工作流执行时。
1. 基础内存参数
内存配置建议
根据服务器配置和AI应用负载,合理配置JVM堆内存大小。建议初始堆内存和最大堆内存设置为相同值,避免动态扩容带来的性能损耗。
# 基础内存配置 (8GB内存服务器示例)
-Xms4g # 初始堆内存大小
-Xmx4g # 最大堆内存大小
-Xmn1g # 新生代内存大小
-Xss512k # 线程栈大小
# 元数据区配置
-XX:MetaspaceSize=256m # 初始元数据空间大小
-XX:MaxMetaspaceSize=512m # 最大元数据空间大小
# 直接内存配置 (用于向量计算优化)
-XX:MaxDirectMemorySize=2g
2. 垃圾收集器优化
GC选择建议
针对AI应用的特点,推荐使用G1GC或ZGC,可以有效减少大内存场景下的停顿时间,提升响应性能。
G1GC配置 (推荐用于8GB-32GB内存)
-XX:+UseG1GC # 使用G1垃圾收集器
-XX:G1HeapRegionSize=16m # G1区域大小
-XX:MaxGCPauseMillis=100 # 最大GC停顿时间
-XX:G1NewSizePercent=20 # 新生代最小占比
-XX:G1MaxNewSizePercent=40 # 新生代最大占比
-XX:InitiatingHeapOccupancyPercent=40 # 启动并发GC的堆占用阈值
-XX:ConcGCThreads=4 # 并发GC线程数
-XX:ParallelGCThreads=8 # 并行GC线程数
ZGC配置 (推荐用于32GB+内存,Java 17+)
-XX:+UseZGC # 使用ZGC垃圾收集器
-XX:+UnlockExperimentalVMOptions # 解锁实验性选项
-XX:ZCollectionInterval=5 # ZGC收集间隔(秒)
-XX:ZUncommitDelay=300 # 内存释放延迟(秒)
3. 性能优化参数
性能调优重点
以下参数针对AI计算密集型场景进行优化,可以显著提升大模型推理和向量计算的性能。
# 编译优化
-XX:+TieredCompilation # 启用分层编译
-XX:TieredStopAtLevel=4 # 编译优化级别
-XX:CompileThreshold=1000 # 热点方法编译阈值
# 内联优化
-XX:MaxInlineLevel=9 # 最大内联层级
-XX:FreqInlineSize=325 # 频繁调用方法内联大小
# NUMA优化 (多CPU场景)
-XX:+UseNUMA # 启用NUMA感知
# 大页内存优化 (需系统支持)
-XX:+UseLargePages # 使用大页内存
-XX:LargePageSizeInBytes=2m # 大页大小
# 字符串优化
-XX:+UseStringDeduplication # 启用字符串去重 (G1GC)
4. AI应用专用优化
AI场景优化
针对大模型推理、向量计算等AI场景的特殊优化参数。
# 向量化操作优化
-XX:+UseSuperWord # 启用向量化优化
-XX:+EnableVectorSupport # 启用向量支持 (Java 17+)
# 异步I/O优化 (文档处理场景)
-XX:+UseAsyncGCLog # 异步GC日志
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider
# 反射优化 (AI框架大量使用反射)
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
5. 监控和诊断参数
生产环境监控
生产环境建议开启详细的监控和诊断参数,便于问题排查和性能分析。
# 内存溢出自动转储
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/heapdump.hprof
# GC日志记录
-Xlog:gc*:gc.log:time,tags
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=100M
# JFR性能记录 (Java 17+)
-XX:+FlightRecorder
-XX:StartFlightRecording=duration=60s,filename=app-profile.jfr
# JMX监控
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
6. 线程池优化配置
线程调优说明
针对AI应用中大量的异步处理场景,合理配置线程池参数可以显著提升并发处理能力。
Spring Boot异步配置
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Bean("aiTaskExecutor")
public TaskExecutor aiTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数 = CPU核心数 * 2
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2);
// 最大线程数 = CPU核心数 * 4
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 4);
// 队列容量
executor.setQueueCapacity(1000);
// 线程名前缀
executor.setThreadNamePrefix("AI-Task-");
// 空闲线程存活时间
executor.setKeepAliveSeconds(60);
// 拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
虚拟线程配置 (Java 21+)
@Configuration
public class VirtualThreadConfig {
@Bean("virtualThreadExecutor")
public Executor virtualThreadExecutor() {
// 使用虚拟线程处理AI计算任务
return Executors.newVirtualThreadPerTaskExecutor();
}
}
四、问题定位
性能问题诊断
为了提高Java应用的性能监控和故障排查效率,建议在启动Java虚拟机时配置自动内存溢出转储选项。
1. 检查日志异常:
- 查看应用日志,确认是否存在大量异常输出。如果发现异常,根据日志内容进行问题分析和定位。
- 特别关注AI推理过程中的超时异常和内存不足异常。
2. 进程和线程分析:
- 使用
jps
命令获取Java进程的pid
。 - 执行
jstack -l [pid]
命令,检查是否有线程状态为BLOCKED
或存在调用栈过深的情况。 - 重点关注AI任务执行线程的状态,检查是否存在线程池饱和问题。
3. 性能分析工具应用:
- 利用
jprofiler
(jprofiler 快速分析内存泄露实战)或Arthas工具收集火焰图,深入分析调用栈的耗时情况。 - 在本地开发环境中,可以利用IDE(如IntelliJ IDEA)内置的 Profiler 进行实时性能监控。
- 使用
jstat -gc [pid] 1s
监控GC情况,关注GC频率和停顿时间。
4. AI应用特有问题排查:
- 监控向量数据库连接状态和响应时间
- 检查大模型API调用的并发数和响应延迟
- 分析工作流执行过程中的节点耗时分布
- 观察知识库检索的性能指标
5. 网络性能调优:
- 如果发现网络连接问题,如连接数少或释放时间长,可以参考上文的TCP协议栈网络参数章节进行针对性的调优。
- 特别关注AI模型API调用的网络配置优化。
通过上述步骤,可以更有效地诊断和解决AI应用中的性能问题,确保BladeX AI平台在高负载场景下的稳定运行。