2G内存服务器运行Tomcat和MySQL如何优化内存使用?

在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,必须进行精细的内存优化。以下是针对 TomcatMySQL 的具体调优建议,以确保系统稳定运行。


🔧 一、总体策略

  1. 避免内存溢出(OOM)
  2. 合理分配内存给两个服务
  3. 关闭不必要的服务和进程
  4. 监控内存使用情况

建议分配:

  • MySQL:800MB ~ 1GB
  • Tomcat(JVM):768MB ~ 1GB
  • 操作系统和其他进程:剩余部分(约 256~512MB)

🐬 二、MySQL 内存优化(my.cnf 配置)

编辑 /etc/mysql/my.cnf/etc/my.cnf,调整以下参数:

[mysqld]
# 基础设置
skip-name-resolve                 # 禁用DNS解析,加快连接
skip-networking=0                 # 如果需要远程访问则开启
innodb_buffer_pool_size = 512M    # 核心!缓存表和索引,建议设为物理内存的 25%~40%
innodb_log_file_size = 64M        # 日志文件大小,不宜过大
innodb_log_buffer_size = 8M       # 日志缓冲区
max_connections = 50              # 限制最大连接数(默认151太高)
table_open_cache = 200            # 打开表的缓存
tmp_table_size = 32M              # 内存临时表上限
max_heap_table_size = 32M         # 内存中HEAP表的最大大小
key_buffer_size = 32M             # MyISAM索引缓存(如果不用MyISAM可更小)
query_cache_type = 0              # 禁用查询缓存(MySQL 5.7+已过时且有锁竞争)
performance_schema = OFF          # 关闭性能监控(节省几十MB)

✅ 建议:如果只使用 InnoDB,可以禁用 MyISAM 相关组件。

检查当前内存使用

mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

☕ 三、Tomcat JVM 内存优化(setenv.sh)

创建或修改 tomcat/bin/setenv.sh 文件:

#!/bin/bash
export JAVA_OPTS="-server 
  -Xms256m 
  -Xmx768m 
  -XX:MetaspaceSize=64m 
  -XX:MaxMetaspaceSize=128m 
  -XX:+UseG1GC 
  -XX:MaxGCPauseMillis=200 
  -Djava.awt.headless=true 
  -Dfile.encoding=UTF-8"

参数说明:

  • -Xms256m:JVM 启动时分配最小堆内存
  • -Xmx768m:JVM 最大堆内存(不要超过 1G)
  • -XX:MetaspaceSize:元空间控制类加载内存
  • -XX:+UseG1GC:使用 G1 垃圾回收器,适合低延迟
  • 避免使用 CMS(已废弃),推荐 G1

✅ 提示:应用本身也应优化,避免内存泄漏。


🖥️ 四、系统级优化

1. 关闭不必要的服务

sudo systemctl stop apache2     # 如果没用
sudo systemctl disable snapd    # Snap 占用资源
sudo systemctl disable bluetooth # 如果不需要

2. 添加 Swap 分区(重要!)

2G 内存容易爆,建议添加 1~2GB swap:

# 创建 2GB swap 文件
sudo fallocate -l 2G /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

调整 swappiness(减少对 swap 的依赖):

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

📊 五、监控与诊断工具

实时监控命令:

htop                    # 查看进程内存占用
free -h                 # 查看内存和 swap 使用
df -h                   # 检查磁盘空间
journalctl -u mysql     # 查看 MySQL 日志
tail -f tomcat/logs/catalina.out  # 查看 Tomcat 日志

安装轻量监控:

sudo apt install htop iotop

🚫 六、其他建议

  1. 不要在同一台机器部署 Redis/Nginx 等额外服务,除非必要。
  2. 定期重启服务,防止内存缓慢增长。
  3. 使用 Nginx 反向X_X静态资源,减轻 Tomcat 负担(可选)。
  4. 数据库表要加索引,避免全表扫描导致内存飙升。
  5. 应用层面优化:减少大结果集查询,分页处理数据。

✅ 总结:关键配置速查

组件 推荐配置值
MySQL innodb_buffer_pool_size = 512M
Max Connections max_connections = 50
Tomcat Heap -Xmx768m
JVM GC -XX:+UseG1GC
Swap 至少 1~2GB
Swappiness vm.swappiness=10

通过以上优化,2G 内存服务器可以较稳定地运行小型业务的 Tomcat + MySQL 应用。但若流量增长,建议尽快升级到 4GB 或以上内存,或拆分服务部署。

未经允许不得转载:云计算HECS » 2G内存服务器运行Tomcat和MySQL如何优化内存使用?