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

在只有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源较为紧张,需要合理分配内存以避免频繁的内存交换(swap)导致性能下降。以下是针对 Tomcat 和 MySQL 的内存优化建议:


一、总体原则

  • 总内存分配:2GB 内存中,建议:
    • 操作系统保留:512MB
    • Tomcat 使用:768MB ~ 1GB
    • MySQL 使用:512MB ~ 768MB
  • 避免 swap 使用,确保服务稳定。
  • 关闭不必要的系统服务(如蓝牙、打印等),释放内存。

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

编辑 /etc/mysql/my.cnf/etc/my.cnf,配置如下(适用于小内存环境):

[mysqld]
# 基础设置
port = 3306
socket = /var/run/mysqld/mysqld.sock
skip-name-resolve          # 禁用 DNS 解析,提升连接速度
max_connections = 50       # 最大连接数,避免过多连接耗尽内存

# 缓冲区设置(关键)
key_buffer_size = 16M      # MyISAM 索引缓存,若不用 MyISAM 可更小
innodb_buffer_pool_size = 256M  # InnoDB 缓存,最重要!设为可用内存的 50%~70%
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
query_cache_type = 0       # 禁用查询缓存(MySQL 8.0+ 已移除,5.7 可关闭)
query_cache_size = 0       # 节省内存并避免锁争用

# 连接与线程
thread_cache_size = 4
table_open_cache = 64
tmp_table_size = 32M
max_heap_table_size = 32M

# 日志与安全
log-error = /var/log/mysql/error.log
slow_query_log = 0         # 关闭慢查询日志除非调试需要

📌 重点innodb_buffer_pool_size = 256M 是最关键的配置,不应超过物理内存的 70%。


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

在 Tomcat 的 bin/ 目录下创建或修改 setenv.sh 文件:

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

参数说明:

  • -Xms512m:JVM 初始堆大小
  • -Xmx768m:最大堆大小(不超过 1GB)
  • -XX:MetaspaceSize:元空间大小,替代永久代
  • -XX:+UseG1GC:使用 G1 垃圾回收器,适合低延迟场景
  • 避免使用 CMS(已弃用),G1 更适合小堆

✅ 注意:如果你部署的应用较轻(如一个简单 Web 应用),可将 -Xmx 设为 512m。


四、操作系统层面优化

  1. 关闭 swap 或限制使用

    sudo swapoff -a  # 临时关闭

    小内存服务器应尽量避免 swap,否则响应变慢。

  2. 监控内存使用

    free -h
    top
    htop
  3. 精简服务

    • 关闭 Apache/Nginx(如果只用 Tomcat 内置 Servlet 容器)
    • 关闭邮件、cron 外的非必要服务
  4. 使用轻量级 OS

    • 推荐使用 Ubuntu Server LTS、Alpine Linux 等轻量发行版

五、应用层优化建议

  • 减少部署 WAR 包数量:只运行必要的应用。
  • 启用 Tomcat 的压缩
    server.xml 中配置:

    <Connector ... compression="on" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
  • 静态资源交给 CDN 或 Nginx(如有条件)
  • 数据库连接池调优(如 HikariCP):
    maximumPoolSize=20

六、验证与监控

  • 启动后检查各服务内存占用:
    ps aux | grep mysql
    ps aux | grep tomcat
  • 使用 jstat 查看 JVM GC 情况:
    jstat -gc <tomcat_pid> 1s

总结:推荐内存分配方案

组件 内存分配 说明
操作系统 512MB 基础运行
MySQL 512–768MB 主要用于 innodb_buffer_pool_size
Tomcat (JVM) 512–768MB 根据应用复杂度调整
留余缓冲 128–256MB 防止 OOM

最终建议
如果业务增长,建议尽早升级到 4GB 内存以上,或拆分数据库和应用服务器。2GB 环境仅适合轻量级测试或低并发生产场景。

如有具体应用类型(如 Spring Boot、WordPress 等),可进一步针对性优化。

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