奋斗
努力

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

云计算

在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,需要精细调优以避免内存溢出(OOM)或系统频繁使用 Swap 导致性能急剧下降。以下是针对 TomcatMySQL 的内存优化建议:


一、总体策略

  1. 合理分配内存

    • 建议分配:
      • MySQL:约 800MB ~ 1GB
      • Tomcat (JVM):约 512MB ~ 768MB
      • 操作系统及其他进程:预留 300MB ~ 500MB
  2. 关闭不必要的服务

    • 关闭不需要的服务(如 Apache、Postfix、蓝牙等),释放内存。
  3. 监控内存使用

    • 使用 free -htophtopvmstat 等工具监控内存和 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)


五、应用与部署建议

  1. 避免部署大型 Java 应用

    • 不要部署 Spring Boot 大型项目,优先选择轻量级框架(如 Javalin、SparkJava)。
    • 减少 WAR 包体积,移除无用依赖。
  2. 静态资源交给 Nginx

    • 使用 Nginx 托管 JS/CSS/图片等静态资源,减轻 Tomcat 负担。
  3. 数据库瘦身

    • 定期清理日志表、历史数据。
    • 避免大查询、全表扫描,加索引优化 SQL。
  4. 使用连接池并限制大小

    • 如 HikariCP,设置 maximumPoolSize=10 左右。

六、监控与告警

  • 使用 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 后台),可进一步定制优化方案。

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