在2核2GB内存的服务器上同时运行MySQL和Tomcat确实容易出现内存不足的问题,主要原因如下:
一、内存需求分析
-
MySQL基础占用
- 默认配置下约占用400-600MB内存
- 包含:缓冲池、连接线程、排序缓存等
- 生产环境建议至少分配512MB-1GB
-
Tomcat基础占用
- 空载时约300-500MB
- 每个HTTP线程约占用1-2MB
- 部署应用后可能达800MB+
-
系统开销
- OS基础进程需要200-300MB
- 其他服务(SSH/监控等)约50-100MB
二、优化方案(按优先级排序)
1. MySQL优化
# /etc/my.cnf 关键配置
[mysqld]
innodb_buffer_pool_size = 256M # 原值通常128M
key_buffer_size = 32M # MyISAM表专用(如无使用可设8M)
max_connections = 30 # 默认151,根据实际调整
thread_cache_size = 4
query_cache_size = 0 # 8.0+版本已移除
innodb_flush_log_at_trx_commit = 2 # 非关键数据可牺牲安全性
2. Tomcat优化
<!-- conf/server.xml 连接器配置 -->
<Connector
port="8080"
maxThreads="50" <!-- 默认200 -->
minSpareThreads="10"
acceptCount="30"
compression="on" <!-- 启用压缩减少内存使用 -->
/>
3. 系统级优化
# 调整SWAP空间(至少1GB)
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 查看内存使用
free -h && vmstat 1
三、进阶方案
-
服务分离部署
- 将MySQL迁移到单独服务器
- 或使用云数据库服务(RDS)
-
容器化方案
# MySQL容器限制内存 docker run --name mysql -e MYSQL_ROOT_PASSWORD=xxx --memory="800m" mysql:5.7 # Tomcat容器限制内存 docker run --name tomcat -p 8080:8080 --memory="700m" tomcat:9 -
监控工具
# 安装轻量监控 sudo apt install htop htop -d 10 # 每10秒刷新
四、典型内存分配参考
| 组件 | 保守配置 | 激进配置 |
|---|---|---|
| MySQL | 600MB | 400MB |
| Tomcat | 500MB | 300MB |
| OS | 300MB | 200MB |
| 安全余量 | 600MB | 100MB |
注意:当可用内存低于100MB时系统会开始使用SWAP,性能急剧下降。建议长期运行保持至少200MB空闲内存。
如果经过优化仍频繁出现OOM错误,建议考虑升级到4GB内存或采用微服务架构分离部署。
云服务器