在 2 核 2G 的服务器上同时运行 Tomcat 和轻量级数据库(如 H2、SQLite、HSQLDB,或 MySQL/PostgreSQL 的极简配置),资源非常紧张。优化核心在于减少内存占用、避免上下文切换、合理分配 CPU 时间片,并防止 OOM(内存溢出)。以下是具体可落地的优化方案:
一、数据库侧优化(以轻量级为主)
✅ 推荐选择
- H2(内存模式
mem:db或文件模式file:./data.db)+ 自动调优参数 - SQLite(单文件,无守护进程,适合读多写少场景)
- MariaDB/MySQL 5.7+(仅当需 SQL 标准支持时,必须严格限配)
⚙️ 关键配置示例(以 H2 为例)
# h2.properties 或 JVM 启动参数
-Dh2.options=MODE=PostgreSQL;CASE_INSENSITIVE_IDENTIFIERS=TRUE
-Xmx256m -Xms128m # 限制 DB 最大堆内存(留足给 Tomcat)
📉 若用 MySQL/MariaDB(不推荐但可行)
# /etc/my.cnf.d/server.cnf
[mysqld]
innodb_buffer_pool_size = 64M # ≤ 总内存 25%
max_connections = 10 # 严格限制连接数
query_cache_type = 0 # 禁用查询缓存(节省内存)
thread_stack = 192K
tmp_table_size = 32M
max_heap_table_size = 32M
skip-name-resolve # 提速 DNS 解析
💡 建议:启用
--log-error监控慢查询,避免全表扫描。
二、Tomcat 优化
1. JVM 参数(catalina.sh 或 setenv.sh)
export CATALINA_OPTS="-server
-Xms256m
-Xmx512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof
-Djava.security.egd=file:/dev/./urandom"
-Xmx512m:预留 ~1G 给 OS + 数据库(2G 总内存中,OS 约需 512M~1G)- G1GC 更适合小堆,降低停顿
urandom避免启动时阻塞等待熵值
2. Tomcat 自身配置(server.xml)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="50" <!-- 默认 200,严重过高 -->
minSpareThreads="10"
acceptCount="20" <!-- 队列长度,防 backlog 堆积 -->
enableLookups="false" <!-- 关闭 DNS 反向查找 -->
compression="on"
compressionMinSize="2048"/>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access." suffix=".log" pattern="%h %l %u %t "%r" %s %b"/>
</Host>
</Engine>
maxThreads=50:2 核 CPU 下线程过多会导致频繁上下文切换acceptCount=20:避免连接请求被直接拒绝
3. 应用层建议
- 禁用不必要的 Filter/Listener(如 debug 日志、热部署)
- 使用静态资源 CDN 或 Nginx 反向X_X缓存(见下文)
- 避免同步 I/O 阻塞操作(如大文件上传、长事务)
三、系统级优化
🔧 Linux 内核调优(/etc/sysctl.conf)
# 网络栈优化
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
# 内存管理
vm.swappiness = 10 # 尽量不用 Swap(2G 服务器慎用 swap)
vm.vfs_cache_pressure = 50
⚠️ 注意:若物理内存不足,开启少量 swap(如 512M)可防 OOM kill,但会降速。
🛡️ 安全与监控
- 安装
htop、glances实时监控内存/CPU - 配置
systemd限制服务资源(可选):# /etc/systemd/system/tomcat.service.d/override.conf [Service] MemoryLimit=1.5G CPUQuota=80%
四、架构建议(长期演进)
| 方案 | 适用场景 | 说明 |
|---|---|---|
| Nginx 反向X_X | 所有场景 | 静态资源缓存、SSL 卸载、限流(limit_req_zone) |
| 分离部署 | 高可用需求 | Tomcat → 独立机器;DB → 云托管(如 AWS RDS t3.micro) |
| 容器化 + cgroup | 运维能力较强 | Docker Compose 限制 memory: '1g' for tomcat, memory: '512m' for db |
✅ 快速验证清单
free -h→ 确认空闲内存 > 200MBtop -o %MEM→ 检查 Tomcat/DB 是否占满jstat -gc <pid> 1000→ 观察 GC 频率(应 < 1 次/分钟)curl -w "%{time_total}n" http://localhost:8080/health→ 响应时间 < 200ms
📌 最后提醒:2 核 2G 是极限环境。若业务增长(如并发 > 50 QPS、数据量 > 1GB),优先考虑升级至 4 核 4G 或使用云原生弹性伸缩。
需要我针对某类数据库(如 H2 vs SQLite)或特定框架(Spring Boot / Servlet)提供定制配置吗?
云服务器