根据并发量设置Spring Boot服务器的内存和CPU配置需要综合考虑多个因素。以下是一个系统的配置指南:
1. 并发量与资源关系
基础估算公式
# 内存需求估算
总内存 ≈ (单请求内存消耗 × 最大并发数) + JVM开销 + 系统预留
# CPU核心数估算
CPU核心数 ≈ 并发数 / 200 ~ 500(根据业务复杂度)
2. 不同并发级别的配置建议
低并发场景(100-500 QPS)
# application.yml
server:
tomcat:
max-threads: 200
min-spare-threads: 10
accept-count: 100
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
# JVM参数
-Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
硬件配置:
- CPU:2-4核
- 内存:4-8GB
- 磁盘:50GB SSD
中等并发场景(500-2000 QPS)
# application.yml
server:
tomcat:
max-threads: 500
min-spare-threads: 50
accept-count: 200
connection-timeout: 30000
spring:
datasource:
hikari:
maximum-pool-size: 50
minimum-idle: 10
connection-timeout: 20000
# 缓存配置
redis:
lettuce:
pool:
max-active: 100
max-idle: 50
JVM参数:
-Xms4g -Xmx8g
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
硬件配置:
- CPU:8-16核
- 内存:16-32GB
- 磁盘:100GB SSD
高并发场景(2000+ QPS)
# application.yml
server:
tomcat:
max-threads: 1000
min-spare-threads: 100
accept-count: 500
max-connections: 10000
connection-timeout: 15000
spring:
datasource:
hikari:
maximum-pool-size: 100
minimum-idle: 20
connection-timeout: 10000
validation-timeout: 3000
# 异步处理
task:
execution:
pool:
core-size: 20
max-size: 100
queue-capacity: 10000
JVM参数:
-Xms8g -Xmx16g
-XX:MetaspaceSize=1g -XX:MaxMetaspaceSize=2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=32m
-XX:+UnlockExperimentalVMOptions
-XX:+AlwaysPreTouch
硬件配置:
- CPU:16-32核
- 内存:32-64GB
- 磁盘:200GB+ NVMe SSD
3. 性能监控与调优
监控指标配置
@Configuration
@ConditionalOnClass(MeterRegistry.class)
public class MetricsConfig {
@Bean
public MeterBinder jvmMemoryMetrics() {
return registry -> {
// JVM内存监控
new JvmMemoryMetrics().bindTo(registry);
// Tomcat线程池监控
new TomcatMetrics().bindTo(registry);
};
}
}
关键监控点
# Actuator配置
management.endpoints.web.exposure.include=health,info,metrics,env,beans,threaddump
management.endpoint.metrics.enabled=true
management.metrics.export.prometheus.enabled=true
4. 动态调整策略
自适应线程池
@Component
public class AdaptiveThreadPoolConfig {
private final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
@PostConstruct
public void init() {
int availableProcessors = Runtime.getRuntime().availableProcessors();
// 根据CPU核心数动态设置
executor.setCorePoolSize(availableProcessors * 2);
executor.setMaxPoolSize(availableProcessors * 4);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("adaptive-");
executor.initialize();
}
}
内存使用监控
@Service
public class MemoryMonitorService {
private final Logger logger = LoggerFactory.getLogger(MemoryMonitorService.class);
public void checkMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
long maxMemory = runtime.maxMemory();
double usagePercent = (double) usedMemory / maxMemory * 100;
if (usagePercent > 80) {
logger.warn("Memory usage is high: {}%", usagePercent);
// 触发告警或清理操作
}
}
}
5. 容量规划步骤
1. 压力测试
# 使用JMeter进行压力测试
jmeter -n -t test-plan.jmx -l result.jtl -e -o report-dir
# 或使用wrk
wrk -t12 -c400 -d30s http://localhost:8080/api/endpoint
2. 资源评估流程
graph TD
A[确定业务峰值QPS] --> B[评估单请求资源消耗]
B --> C[计算理论资源需求]
C --> D[进行压力测试验证]
D --> E[监控实际资源使用]
E --> F[调整配置参数]
F --> G[生产环境部署]
6. 优化建议
JVM调优
# 生产环境推荐参数
-server
-Xms${INITIAL_HEAP_SIZE}
-Xmx${MAX_HEAP_SIZE}
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:+ParallelRefProcEnabled
-XX:+UnlockDiagnosticVMOptions
-XX:+G1SummarizeConcMark
-XX:InitiatingHeapOccupancyPercent=35
-Djava.security.egd=file:/dev/./urandom
数据库连接池优化
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.hikari")
public HikariDataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(calculatePoolSize());
config.setMinimumIdle(calculateMinIdle());
config.setConnectionTimeout(20000);
config.setIdleTimeout(300000);
config.setMaxLifetime(1800000);
return new HikariDataSource(config);
}
private int calculatePoolSize() {
// 根据CPU核心数和预期并发计算
int cores = Runtime.getRuntime().availableProcessors();
return Math.min(cores * 4, 100);
}
}
通过以上配置和监控,可以根据实际业务需求合理设置Spring Boot应用的资源,确保系统在高并发下的稳定性和性能。