1. 调整Swap空间大小
Swap空间的大小需结合系统内存和使用场景确定。一般建议为物理内存的1.5-3倍(如8GB内存可设为12-24GB);若服务器内存≥64GB且运行内存密集型应用(如数据库),可适当减小Swap空间甚至禁用(需谨慎,避免内存溢出导致进程被杀)。创建Swap文件的方法:使用fallocate命令快速生成指定大小的文件(如4GB),格式化为Swap格式并启用,最后添加到/etc/fstab实现开机自动挂载。示例如下:
sudo fallocate -l 4G /swapfile # 创建4GB Swap文件
sudo chmod 600 /swapfile # 设置仅root可访问
sudo mkswap /swapfile # 格式化为Swap
sudo swapon /swapfile # 启用Swap
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 开机自动挂载
若需扩容Swap,可重复上述步骤创建新Swap文件并添加到fstab,或通过逻辑卷(LVM)扩展现有Swap分区。
2. 优化Swappiness参数
Swappiness(范围0-100)控制内核将内存数据移至Swap的倾向。默认值60表示积极使用Swap,可能导致频繁磁盘I/O(尤其是机械硬盘),影响性能。建议调整为10-30(数值越低,系统越倾向于保留内存中的数据)。操作步骤:
# 临时调整(立即生效)
sudo sysctl vm.swappiness=10
# 永久调整(修改配置文件)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # 重新加载配置
对于内存充足的服务器(如64GB以上),可进一步降低至5-10,减少Swap使用频率。
3. 使用高性能存储介质
Swap的性能高度依赖存储介质的读写速度。优先将Swap放在SSD上(尤其是NVMe SSD),其随机读写速度远高于机械硬盘(HDD),能显著降低Swap操作的延迟。若系统已有SSD,可将Swap文件或分区迁移至SSD;若使用HDD,建议升级至SSD以提升Swap性能。
4. 启用压缩内存技术(Zram/Zswap)
Zram和Zswap是Linux内核提供的压缩内存技术,可在内存中创建压缩的Swap空间,减少对磁盘的依赖。
sudo yum install zram-config -y # CentOS 7/8安装zram-config
sudo systemctl start zram-config # 启动服务
# 调整Zram大小(如4GB)
echo 'ZRAM_DEVICE_SIZE=4G' | sudo tee -a /etc/zram-config.conf
echo 'vm.zswap.enabled=1' | sudo tee -a /etc/sysctl.conf
echo 'vm.zswap.compression_ratio=5' | sudo tee -a /etc/sysctl.conf # 压缩比(5-9,越高压缩率越高,但CPU占用越多)
sudo sysctl -p
Zram适合内存较小的系统,Zswap适合内存较大的系统,两者均可有效减少Swap磁盘I/O。
5. 监控与调优Swap使用
定期监控Swap使用情况,有助于及时发现内存瓶颈并调整策略。常用工具及命令:
si(Swap In)和so(Swap Out)列,数值过高表示Swap使用频繁);6. 优化内核内存管理参数
除Swappiness外,还可调整以下内核参数,进一步提升Swap性能:
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
dirty_ratio(默认20)表示内存中脏页占比达到该值时,强制同步写入磁盘;dirty_background_ratio(默认10)表示后台异步刷新的阈值。降低这两个值可减少内存压力,避免因脏页过多导致Swap使用增加。示例如下:echo 'vm.dirty_ratio=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.dirty_background_ratio=5' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
7. 避免不必要的Swap使用
top或htop查看进程,终止占用内存过高且无用的进程(如僵尸进程、闲置的服务);vm.min_free_kbytes参数控制内存回收的触发点(默认值根据内存大小自动计算,可根据需求适当增加,避免内存耗尽时才回收)。示例如下:# 假设内存为8GB,设置为2GB(单位:KB)
echo 'vm.min_free_kbytes=2097152' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p