温馨提示×

CentOS Swap优化技巧

小樊
40
2025-11-01 11:31:23
栏目: 智能运维

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空间,减少对磁盘的依赖。

  • Zram:将内存的一部分划分为压缩块设备,作为Swap使用。安装并配置Zram:
    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
    
  • Zswap:在内存中创建压缩的Swap缓存,当内存不足时,将数据压缩后存入Zswap,而非直接写入磁盘Swap。需修改内核参数启用:
    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使用情况,有助于及时发现内存瓶颈并调整策略。常用工具及命令:

  • free -h:查看内存和Swap的总使用量及剩余量(直观了解Swap占用比例);
  • vmstat 1:实时监控系统内存、Swap、I/O等状态(重点关注si(Swap In)和so(Swap Out)列,数值过高表示Swap使用频繁);
  • swapon --show:查看当前启用的Swap设备及使用情况(如大小、已用空间);
  • top/htop:查看进程的内存使用情况(找出占用内存过多的进程,优化或终止异常进程)。

6. 优化内核内存管理参数
除Swappiness外,还可调整以下内核参数,进一步提升Swap性能:

  • vm.vfs_cache_pressure:控制内核回收用于目录和inode缓存的频率(默认值100,数值越大,回收越积极)。降低该值可保留更多文件系统缓存,减少Swap使用。示例如下:
    echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
    
  • vm.dirty_ratio/dirty_background_ratio:控制脏页(未写入磁盘的内存页)的刷新策略。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使用

  • 优化应用程序:检查应用程序的内存使用情况,修复内存泄漏或优化代码,减少内存占用(如使用更高效的数据结构、减少缓存大小);
  • 清理无用进程:定期使用tophtop查看进程,终止占用内存过高且无用的进程(如僵尸进程、闲置的服务);
  • 调整内存回收策略:通过vm.min_free_kbytes参数控制内存回收的触发点(默认值根据内存大小自动计算,可根据需求适当增加,避免内存耗尽时才回收)。示例如下:
    # 假设内存为8GB,设置为2GB(单位:KB)
    echo 'vm.min_free_kbytes=2097152' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
    

0