2G内存云服务器如何优化Tomcat和MySQL配置以避免OOM?

在 2GB 内存的云服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,必须精细调优以避免 OOM(Out Of Memory)。以下是关键优化策略:

一、Tomcat 优化配置

1. JVM 内存设置

# /usr/local/tomcat/bin/setenv.sh (推荐) 或 CATALINA_OPTS
export CATALINA_OPTS="-Xms512m -Xmx768m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC"
  • 堆内存-Xmx 设为 768MB(预留空间给其他进程)
  • 元空间:限制 Metaspace 防止类加载泄漏
  • 垃圾回收器:使用 G1GC 更适合小内存场景

2. Tomcat 自身配置

<!-- server.xml -->
<Connector port="8080" 
           maxThreads="100" 
           minSpareThreads="10" 
           connectionTimeout="20000"
           URIEncoding="UTF-8" />

<!-- catalina.properties -->
org.apache.catalina.core.StandardContext.classLoaderDefaultHost=true
  • 降低 maxThreads 避免线程过多消耗内存
  • 禁用不必要的 Valve 和 Manager 应用

二、MySQL 优化配置

1. 核心参数调整(my.cnf)

[mysqld]
# 内存分配(总内存2GB,MySQL最多占600-700MB)
innodb_buffer_pool_size = 400M
key_buffer_size = 32M
max_connections = 50

# 查询缓存(MySQL 8.0+ 已移除,旧版本谨慎使用)
query_cache_type = 0
query_cache_size = 0

# 临时表限制
tmp_table_size = 32M
max_heap_table_size = 32M

# 连接相关
thread_cache_size = 10
table_open_cache = 200

# InnoDB 日志
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2

# 性能优化
skip-name-resolve
local-infile = 0
performance_schema = OFF

2. 关键原则

  • innodb_buffer_pool_size:设为物理内存的 40-50%(约400-500MB)
  • max_connections:控制在 50 以内,避免连接数过多
  • 关闭不必要功能:如 query_cache、performance_schema

三、系统级优化

1. 交换空间配置

# 创建 2GB swap 分区
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  • 设置 vm.swappiness=10 减少 swap 使用频率
    sudo sysctl vm.swappiness=10

2. 监控与告警

# 安装监控工具
apt install htop iotop net-tools

# 定期检查内存使用
free -h
vmstat 1 5

四、应用层优化建议

  1. 代码层面

    • 避免大对象一次性加载
    • 使用流式处理大数据集
    • 及时关闭数据库连接和文件句柄
  2. 架构优化

    • 考虑将静态资源分离到 CDN
    • 实现读写分离减轻主库压力
    • 添加 Redis 缓存热点数据
  3. 部署策略

    • 启用 Tomcat 的 session 共享(Redis存储)
    • 定期清理临时文件和日志
    • 使用轻量级框架替代重型应用

五、验证与测试

# 检查实际内存使用
ps aux | grep -E 'java|mysql' | awk '{print $6}' | sort -n

# 压测前准备
jmap -heap <pid>  # 查看JVM堆信息
mysqladmin variables | grep -E 'buffer|cache'

重要提醒

  • 首次调整后密切观察 24-48 小时
  • 生产环境先在小流量时段测试
  • 保留回滚方案,确保业务连续性
  • 考虑升级服务器配置作为长期解决方案

通过以上组合优化,2GB 内存服务器可以稳定运行 Tomcat + MySQL 的基础应用场景。如果业务增长,建议逐步迁移到更高配置或使用容器化部署。

未经允许不得转载:云知道CLOUD » 2G内存云服务器如何优化Tomcat和MySQL配置以避免OOM?