在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,需要精细调优以避免内存溢出(OOM)或系统频繁使用 Swap 导致性能急剧下降。以下是针对 Tomcat 和 MySQL 的内存优化建议:
一、总体策略
-
合理分配内存:
- 建议分配:
- MySQL:约 800MB ~ 1GB
- Tomcat (JVM):约 512MB ~ 768MB
- 操作系统及其他进程:预留 300MB ~ 500MB
- 建议分配:
-
关闭不必要的服务:
- 关闭不需要的服务(如 Apache、Postfix、蓝牙等),释放内存。
-
监控内存使用:
- 使用
free -h、top、htop、vmstat等工具监控内存和 Swap 使用情况。
- 使用
二、MySQL 内存优化(配置 my.cnf)
编辑 /etc/mysql/my.cnf 或 /etc/my.cnf,在 [mysqld] 段添加以下配置:
[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 内存相关优化
key_buffer_size = 16M # MyISAM 索引缓存,小站点可设低
max_allowed_packet = 4M
table_open_cache = 64 # 减少表缓存
sort_buffer_size = 64K
net_buffer_length = 8K
read_buffer_size = 64K
read_rnd_buffer_size = 256K
join_buffer_size = 128K
tmp_table_size = 16M
max_heap_table_size = 16M # 防止内存表过大
# InnoDB 重点调优(如果使用 InnoDB)
innodb_buffer_pool_size = 256M # 最关键!通常设为物理内存的 25%~40%
innodb_log_file_size = 32M # 日志文件大小,可略小
innodb_log_buffer_size = 1M # 日志缓冲
innodb_flush_log_at_trx_commit = 2 # 提高性能,略有丢数据风险
innodb_file_per_table = 1
# 连接相关
max_connections = 50 # 减少连接数,每个连接消耗内存
thread_cache_size = 4
query_cache_type = 0 # 关闭查询缓存(MySQL 5.7+ 已废弃,但旧版可用)
query_cache_size = 0 # 节省内存
# 其他
skip-name-resolve # 禁用 DNS 解析,加快连接
⚠️ 注意:
innodb_buffer_pool_size是最大开销项,不要超过 1GB,否则会挤占其他服务内存。
三、Tomcat JVM 内存优化
编辑 bin/catalina.sh 或设置环境变量,调整 JVM 启动参数:
export JAVA_OPTS="-Xms256m -Xmx512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
参数说明:
-Xms256m:JVM 初始堆内存 256MB-Xmx512m:最大堆内存 512MB(防止内存无限增长)-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m:限制元空间(替代永久代)-XX:+UseG1GC:使用 G1 垃圾回收器,适合小内存、低延迟-XX:MaxGCPauseMillis=200:尽量控制 GC 停顿时间
✅ 建议将 Tomcat 应用本身也做轻量化处理(如减少加载的类、简化页面、禁用不必要的 Filter/Listener)。
四、操作系统级优化
1. 设置合理的 Swap
虽然不推荐依赖 Swap,但应保留一定空间以防 OOM。
# 查看 swap
sudo swapon --show
# 若无 swap,创建 1GB swap 文件
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效:写入 /etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
2. 调整 Swappiness
减少系统过早使用 Swap:
# 临时设置
echo 10 | sudo tee /proc/sys/vm/swappiness
# 永久设置(写入 /etc/sysctl.conf)
vm.swappiness=10
建议值:10(默认是 60)
五、应用与部署建议
-
避免部署大型 Java 应用:
- 不要部署 Spring Boot 大型项目,优先选择轻量级框架(如 Javalin、SparkJava)。
- 减少 WAR 包体积,移除无用依赖。
-
静态资源交给 Nginx:
- 使用 Nginx 托管 JS/CSS/图片等静态资源,减轻 Tomcat 负担。
-
数据库瘦身:
- 定期清理日志表、历史数据。
- 避免大查询、全表扫描,加索引优化 SQL。
-
使用连接池并限制大小:
- 如 HikariCP,设置
maximumPoolSize=10左右。
- 如 HikariCP,设置
六、监控与告警
- 使用
htop实时查看内存使用。 - 添加简单脚本监控内存,超限时报警或重启服务。
示例监控脚本片段:
free -m | awk 'NR==2{if($4<200) print "Warning: Low memory"}'
总结:推荐配置汇总
| 项目 | 推荐值 |
|---|---|
MySQL innodb_buffer_pool_size |
256M ~ 512M |
MySQL max_connections |
≤ 50 |
Tomcat -Xmx |
512M |
| JVM GC | G1GC |
| Swap | 1GB,swappiness=10 |
| 系统预留内存 | ≥ 300MB |
✅ 最终建议:
如果业务增长,强烈建议升级到 4GB 内存或以上,或拆分服务(MySQL 单独部署)。2GB 是极限运行,仅适用于低并发测试或小型内部系统。
如有具体应用类型(如 WordPress + Java 后台),可进一步定制优化方案。
云服务器