速卖通素材
努力

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

服务器

在仅有2GB内存的服务器上同时运行Tomcat和MySQL,资源非常紧张。如果不进行合理优化,很容易出现内存耗尽、系统频繁使用Swap导致性能急剧下降,甚至服务崩溃。以下是针对 Tomcat + MySQL 在 2G 内存服务器上的内存优化建议:


🧩 一、总体资源分配建议(推荐)

服务 建议最大内存占用
MySQL 800MB ~ 1GB
Tomcat 512MB ~ 768MB
系统+其他 256MB ~ 512MB

⚠️ 总内存使用控制在 1.5GB 以内,为系统缓存和突发情况留出缓冲。


🔧 二、MySQL 内存优化

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

[mysqld]
# 基础设置
skip-innodb                 # 如果不用InnoDB可关闭(不推荐生产环境)
# 或者优化 InnoDB
innodb_buffer_pool_size = 256M   # 核心:缓存表和索引,建议设为总内存的 25%~30%
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M

# 连接相关
max_connections = 50        # 减少并发连接数(默认151太高)
thread_cache_size = 4
table_open_cache = 64       # 减小打开表缓存
table_definition_cache = 400

# 查询缓存(MySQL 5.7 及以下)
query_cache_type = 1
query_cache_size = 32M      # 不要太大,避免锁争用

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

# 关闭不必要的功能
skip_name_resolve           # 避免DNS反查,提升连接速度
key_buffer_size = 32M       # MyISAM索引缓存,若无MyISAM可更小

重点调优参数

  • innodb_buffer_pool_size:最关键,不要超过 512M(2G 机器建议 256M~384M)
  • max_connections:限制连接数防止内存爆炸
  • tmp_table_size / max_heap_table_size:防止大临时表占满内存

📌 提示:使用 MySQLTuner 工具分析当前配置合理性。


☕ 三、Tomcat 内存优化

1. 设置 JVM 内存参数

修改 catalina.sh(Linux)或 setenv.sh,添加:

export JAVA_OPTS="-Xms256m -Xmx512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC"

解释:

  • -Xms256m:JVM 初始堆内存
  • -Xmx512m:最大堆内存(关键!不能过大)
  • -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m:元空间限制(替代永久代)
  • -XX:+UseG1GC:使用 G1 垃圾回收器,适合低暂停需求

❗ 避免使用 -Xss 过小值,可能导致线程栈溢出。

2. 优化 Tomcat 自身配置

conf/server.xml 中调整线程池:

<Executor name="tomcatThreadPool" 
          namePrefix="http-thread-" 
          maxThreads="100" 
          minSpareThreads="10" 
          maxIdleTime="60000" />

连接器使用线程池并限制并发:

<Connector executor="tomcatThreadPool"
           port="8080" 
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

3. 应用层面优化

  • 避免内存泄漏:检查 Session 是否过期、静态集合是否无限增长
  • 减少 WAR 包大小,移除无用依赖
  • 使用轻量级框架(如 Spring Boot 默认较重,注意裁剪)

🛠 四、系统级优化

1. 启用 Swap(必要时)

虽然 Swap 会降低性能,但在内存不足时能防止 OOM Kill。

# 创建 1GB Swap 文件
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

添加到 /etc/fstab 永久生效:

/swapfile none swap sw 0 0

2. 调整 Swappiness

减少系统过早使用 Swap:

echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

值范围 0~100,10 表示尽量用物理内存。

3. 监控工具

安装监控工具观察内存使用:

htop         # 实时查看进程内存
free -h      # 查看内存和 swap 使用
df -h        # 查看磁盘(包括 swap)
journalctl -u mysql --since "1 hour ago"  # 查看 MySQL 日志

✅ 五、其他建议

  1. 不要在同一台机器部署 Redis/Nginx 等额外服务,除非极轻量。
  2. 使用 Nginx 代替 Tomcat 处理静态资源(JS/CSS/图片),减轻 Tomcat 负担。
  3. 定期重启 Tomcat 和 MySQL,避免长期运行内存碎片或缓慢泄漏。
  4. 使用轻量 Linux 发行版(如 Alpine、Ubuntu Server 最小安装)。

📊 六、验证优化效果

运行一段时间后,检查:

  • free -h:剩余可用内存是否稳定
  • ps aux | grep mysql:MySQL 实际内存使用
  • jstat -gc <tomcat_pid>:查看 JVM GC 情况
  • 日志中是否有 OutOfMemoryErrorMySQL server has gone away

总结

项目 推荐配置
MySQL 内存 ≤ 512M ~ 768M
Tomcat JVM (-Xmx) 512M
Swap 1GB(强烈建议)
系统监控 htop, free, journalctl
关键参数 innodb_buffer_pool_size, -Xmx

💡 最终目标:确保系统在高负载下也不频繁使用 Swap,避免 OOM。


如果你的应用访问量较大,建议尽早考虑升级服务器至 4GB 内存,或拆分服务(MySQL 单独部署)。2G 服务器仅适合低并发测试或轻量级应用。

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