在2核4G的服务器上部署Java后端服务时,资源分配需要精细规划。以下是一个合理的资源配置建议:
内存分配(总计4GB)
1. Java应用(推荐 1.5-2GB)
# JVM参数示例
-Xms1g -Xmx1.5g
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
2. MySQL(推荐 1-1.5GB)
# my.cnf 配置
[mysqld]
# 缓冲池大小(占总内存30-40%)
innodb_buffer_pool_size = 800M
# 其他关键参数
key_buffer_size = 64M
query_cache_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 2M
read_buffer_size = 2M
3. Redis(推荐 512MB-1GB)
# redis.conf 配置
maxmemory 768mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
4. RabbitMQ(推荐 512MB)
# rabbitmq.conf
vm_memory_high_watermark.relative = 0.4
disk_free_limit.absolute = 500MB
CPU分配策略
进程优先级设置
# 设置Java应用高优先级
nice -n -5 java -jar your-app.jar
# MySQL适度优先级
nice -n 0 mysqld
# Redis和RabbitMQ默认优先级
服务启动脚本示例
启动顺序优化
#!/bin/bash
# 1. 先启动基础服务
systemctl start mysql
systemctl start redis-server
systemctl start rabbitmq-server
# 2. 等待服务就绪
sleep 10
# 3. 启动Java应用
java -Xms1g -Xmx1.5g
-XX:+UseG1GC
-Dspring.profiles.active=prod
-jar your-service.jar > /var/log/app.log 2>&1 &
监控与调优
资源监控脚本
# 监控脚本 check_resources.sh
#!/bin/bash
echo "=== 资源使用情况 ==="
echo "内存使用:"
free -h
echo -e "nCPU使用:"
top -bn1 | head -10
echo -e "n各服务内存占用:"
ps aux --sort=-%mem | head -10
echo -e "nMySQL连接数:"
mysqladmin processlist | wc -l
日志轮转配置
# /etc/logrotate.d/java-app
/var/log/your-app/*.log {
daily
rotate 7
compress
missingok
notifempty
}
性能优化建议
1. 连接池配置
# application.yml
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 20000
redis:
lettuce:
pool:
max-active: 8
max-idle: 4
rabbitmq:
listener:
simple:
concurrency: 3
max-concurrency: 5
2. 定期维护任务
# 每周清理脚本
0 2 * * 0 /usr/bin/mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 3 * * 0 /usr/bin/redis-cli flushall
备选方案
如果资源仍然紧张,考虑:
- 拆分部署:将数据库单独部署到其他机器
- 使用轻量级替代品:如SQLite替代MySQL(适用于小数据量)
- 云服务:使用云数据库和消息队列服务
关键原则
- 留有余地:保留500MB左右内存给系统进程
- 动态调整:根据实际负载监控结果调整配置
- 优先保障:确保Java应用有足够的内存运行
- 定期监控:建立完善的监控告警机制
这样的分配既能保证各服务正常运行,又为系统留出了必要的缓冲空间。
CLOUD云枢