在4GB内存的服务器上同时运行Redis、MySQL和Java服务需要精细的资源分配和优化。以下是分步解决方案:
1. 内存分配建议
-
Redis: 限制为1GB
- 修改
redis.conf:maxmemory 1gb maxmemory-policy allkeys-lru # 启用LRU淘汰策略 - 关闭持久化(若允许数据丢失):
save "" # 禁用RDB appendonly no # 禁用AOF
- 修改
-
MySQL: 限制为1.5GB
- 修改
my.cnf:[mysqld] innodb_buffer_pool_size = 1G # 关键参数 key_buffer_size = 64M query_cache_size = 0 # 禁用查询缓存(MySQL 8.0+默认) tmp_table_size = 32M max_connections = 30 # 减少并发连接
- 修改
-
Java服务: 分配1GB
- 启动时设置JVM参数:
java -Xms512m -Xmx1g -XX:+UseG1GC -jar your_app.jar - 选择轻量级框架(如Spring Boot + Undertow替代Tomcat)。
- 启动时设置JVM参数:
2. 系统级优化
-
启用Swap空间(避免OOM):
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile在
/etc/fstab中添加持久化:/swapfile swap swap defaults 0 0 -
调整OOM Killer优先级:
echo 'echo 100 > /proc/$(pgrep mysqld)/oom_score_adj' | sudo bash -
限制进程资源(可选):
sudo systemd-run --scope -p MemoryLimit=1.5G mysqld
3. 服务配置技巧
-
Redis:
- 使用
ziplist编码优化小数据存储:hash-max-ziplist-entries 512 list-max-ziplist-size -2
- 使用
-
MySQL:
- 禁用非必要插件:
skip-performance-schema skip-innodb-doublewrite # 权衡数据安全性 - 使用
sysbench测试优化效果。
- 禁用非必要插件:
-
Java:
- 启用压缩指针(64位系统):
-XX:+UseCompressedOops - 监控工具:
jstat -gc <pid> 1000
- 启用压缩指针(64位系统):
4. 监控与维护
- 安装轻量监控:
sudo apt install htop sysstat - 关键命令:
- 内存使用:
free -h、top -o %MEM - MySQL内存:
SHOW ENGINE INNODB STATUS; - Redis内存:
INFO memory
- 内存使用:
5. 备选方案
-
容器化部署(更易控制资源):
docker run --memory 1g --name redis redis:alpine docker run --memory 1.5g --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7 --innodb_buffer_pool_size=1G -
服务错峰运行:通过
cron定时启停非关键服务。
预期问题与解决
- 内存不足:优先降低MySQL的
innodb_buffer_pool_size。 - 响应延迟:为Redis设置
maxmemory-policy volatile-lru保留热点数据。 - OOM崩溃:通过
dmesg | grep -i kill检查并调整服务优先级。
通过以上优化,4GB服务器可稳定运行三个服务,但需密切监控并在高负载时考虑垂直扩容。
云服务器