对于内存较小的云服务器运行MySQL,设置Swap是必要的临时解决方案。以下是详细步骤和优化建议:
一、创建Swap文件
1. 检查现有Swap
sudo swapon --show
free -h
2. 创建Swap文件(推荐大小)
# 对于2-4GB内存的服务器,建议Swap大小为内存的1-2倍
sudo fallocate -l 2G /swapfile # 创建2GB Swap文件
# 如果fallocate不可用,使用dd命令
sudo dd if=/dev/zero of=/swapfile bs=1024 count=2097152 # 2GB
3. 设置权限
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
4. 永久生效
# 编辑/etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
二、优化Swap使用策略
1. 调整swappiness(控制内存到Swap的倾向)
# 查看当前值(默认60)
cat /proc/sys/vm/swappiness
# 临时设置(推荐MySQL服务器设为10-30)
sudo sysctl vm.swappiness=20
# 永久生效
echo 'vm.swappiness=20' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
2. 调整缓存压力
# 减少缓存回收压力
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
三、MySQL专用优化
1. 关键配置调整(my.cnf)
[mysqld]
# 减少内存使用
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# 查询缓存(MySQL 8.0已移除)
# query_cache_type = 0
# query_cache_size = 0
# InnoDB优化(核心)
innodb_buffer_pool_size = 64M # 根据可用内存调整
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2 # 平衡性能和数据安全
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
# 连接限制
max_connections = 50 # 减少并发连接数
table_open_cache = 256
2. 监控Swap使用
# 实时监控
watch -n 1 'free -h; sudo swapon --show'
# 查看进程Swap使用
sudo smem -s swap -r
四、替代和补充方案
1. 使用zram(压缩内存)
# Ubuntu/Debian
sudo apt install zram-config
# CentOS/RHEL
sudo yum install zram-generator
2. MySQL内存优化工具
# 使用MySQL调优脚本
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
perl mysqltuner.pl
3. 配置OOM Killer保护MySQL
# 编辑/etc/sysctl.conf
echo 'vm.oom_kill_allocating_task = 1' | sudo tee -a /etc/sysctl.conf
五、重要注意事项
- Swap不是银弹:频繁使用Swap会导致性能严重下降
- 监控是关键:定期检查Swap使用率
- 升级内存:长期解决方案是升级服务器配置
- MySQL版本:MySQL 8.0比5.7有更好的内存管理
- 定期重启:小内存服务器建议定期重启MySQL释放内存
六、应急处理
如果Swap使用率持续过高:
# 1. 重启MySQL释放内存
sudo systemctl restart mysql
# 2. 清理内存缓存
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
# 3. 临时增加Swap
sudo dd if=/dev/zero of=/swapfile2 bs=1M count=1024
sudo mkswap /swapfile2
sudo swapon /swapfile2
建议:对于生产环境,如果经常需要Swap,应考虑升级内存或优化数据库设计(如分表、归档历史数据)。
CLOUD技术笔记