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

在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张。为了确保系统稳定、避免频繁的内存交换(swap)和 OOM(Out of Memory)错误,必须进行精细的内存优化。以下是针对 TomcatMySQL 的具体优化建议:


🔧 一、系统层面优化

1. 禁用不必要的服务

  • 关闭不需要的服务(如 Apache、Redis、Nginx 等),只保留 Tomcat 和 MySQL。
  • 使用 systemctl list-units --type=service --state=running 查看正在运行的服务。

2. 合理配置 Swap

  • 虽然 swap 会降低性能,但在内存不足时可防止崩溃。
  • 建议设置 1–2GB 的 swap(例如使用 fallocate 创建 swap 文件):
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
  • 添加到 /etc/fstab 永久生效。

3. 调整 swappiness

减少系统过早使用 swap:

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

🐘 二、MySQL 内存优化(重点)

目标:将 MySQL 内存控制在 800MB–1.2GB 左右。

编辑 MySQL 配置文件(通常是 /etc/mysql/my.cnf/etc/my.cnf.d/server.cnf):

[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# 内存相关关键参数
key_buffer_size = 32M           # MyISAM 索引缓存(若主要用 InnoDB 可小)
max_allowed_packet = 16M
table_open_cache = 256          # 打开表缓存,避免过高
sort_buffer_size = 512K         # 每连接排序缓冲
net_buffer_length = 8K
read_buffer_size = 256K         # 每连接读取缓冲
read_rnd_buffer_size = 256K     # 随机读缓冲
join_buffer_size = 256K         # JOIN 缓冲(不要设太大)

# InnoDB 核心参数(重点)
innodb_buffer_pool_size = 512M  # 最重要!缓存数据和索引(占总内存 40-50%)
innodb_log_file_size = 64M      # 日志文件大小(可适当调小)
innodb_log_buffer_size = 8M     # 日志缓冲
innodb_flush_log_at_trx_commit = 2  # 提高性能,牺牲一点持久性
innodb_file_per_table = 1

# 连接相关
max_connections = 50            # 控制最大连接数(默认151太高)
thread_cache_size = 8
query_cache_type = 0            # 禁用查询缓存(MySQL 8+ 已移除,5.7 可禁用)
query_cache_size = 0

# 其他
tmp_table_size = 32M
max_heap_table_size = 32M

说明

  • innodb_buffer_pool_size = 512M 是关键,太大可能导致系统内存耗尽。
  • 若应用并发不高,max_connections = 50 足够。
  • 禁用 query cache(反而可能造成锁争用)。

☕ 三、Tomcat 内存优化

目标:JVM 堆内存控制在 768MB–1024MB

1. 设置 JVM 参数(通过 setenv.sh

$CATALINA_HOME/bin/setenv.sh 中添加:

export JAVA_OPTS="-server 
  -Xms512m 
  -Xmx768m 
  -XX:MetaspaceSize=96m 
  -XX:MaxMetaspaceSize=128m 
  -XX:+UseG1GC 
  -XX:MaxGCPauseMillis=200 
  -XX:+DisableExplicitGC 
  -Djava.awt.headless=true 
  -Dfile.encoding=UTF-8"

解释

  • -Xms512m -Xmx768m:初始堆 512MB,最大 768MB,避免频繁扩容。
  • 使用 G1GC 垃圾回收器,适合中等堆内存。
  • Metaspace 控制类元数据内存,避免无限增长。
  • 显式 GC 禁用(某些框架会触发,影响性能)。

2. 优化 web 应用本身

  • 减少静态资源加载,压缩 JS/CSS。
  • 避免在内存中缓存大量数据(如用 Redis 外部缓存)。
  • 及时关闭数据库连接、流等资源。
  • 使用连接池(如 HikariCP),并限制最大连接数(如 10–20)。

📊 四、监控与调优

1. 实时监控内存使用

free -h
top
htop

2. 查看 Tomcat 和 MySQL 内存占用

ps aux | grep tomcat
ps aux | grep mysql

3. 使用 jstat 监控 JVM

jstat -gc <tomcat_pid> 1s

🎯 五、推荐资源配置总结(2G 内存)

组件 内存分配 说明
MySQL 800 – 1024 MB 主要用于 innodb_buffer_pool
Tomcat (JVM) 768 – 1024 MB 堆 + Metaspace + Native
系统及其他 ~300 – 500 MB OS、Swap、临时缓冲等

⚠️ 总内存使用应控制在 1.8GB 以内,避免频繁 swap。


✅ 六、额外建议

  1. 升级硬件:长期来看,建议升级到至少 4GB 内存。
  2. 分离服务:若流量较大,建议将 MySQL 和 Tomcat 部署在不同服务器。
  3. 使用轻量级替代
    • 用 MariaDB 替代 MySQL(更省内存)。
    • 用 Undertow 或 Jetty 替代 Tomcat(更轻量)。
  4. 定期清理日志:防止日志文件占用过多磁盘和内存。

通过以上优化,可以在 2GB 内存服务器上较为稳定地运行 Tomcat + MySQL,适用于低并发、中小型应用或测试环境。关键是 合理分配内存、禁用冗余功能、持续监控

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