作为一名长期在Linux环境下工作的开发者,我经常遇到内存不足导致程序崩溃的情况。特别是在运行大型机器学习模型(如Swin-Large)或处理大数据集时,系统默认的2GB Swap分区往往捉襟见肘。Swap分区本质上是一种"虚拟内存",当物理内存(RAM)耗尽时,系统会将部分内存数据暂时存储到硬盘的这个特殊区域。
重要提示:虽然Swap可以缓解内存压力,但它不能替代物理内存。硬盘的读写速度远低于RAM,过度依赖Swap会导致明显的性能下降。
在开始操作前,建议先确认当前的Swap配置:
bash复制free -h
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 8.7Gi 356Mi 2.1Gi 10Gi
Swap: 2.0Gi 1.5Gi 516Mi
传统经验法则建议:
但对于机器学习等特殊场景,我的实践经验是:
创建16GB Swap文件需要相应磁盘空间:
bash复制df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 467G 128G 316G 29% /
bash复制# 查看当前swap文件位置
swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 2G 1.5G -2
# 禁用swap(数据会迁移回内存)
sudo swapoff /swapfile
# 删除旧文件(建议先备份)
sudo cp /swapfile /swapfile.bak
sudo rm /swapfile
bash复制sudo fallocate -l 16G /swapfile
bash复制sudo dd if=/dev/zero of=/swapfile bs=1M count=16384
bash复制sudo truncate -s 16G /swapfile
性能对比:在NVMe SSD上测试,fallocate瞬时完成,dd耗时约8秒,truncate生成的文件实际不占用磁盘空间。
bash复制# 设置严格权限
sudo chmod 600 /swapfile
# 验证权限
ls -lh /swapfile
-rw------- 1 root root 16G Jun 15 10:00 /swapfile
# 格式化为swap
sudo mkswap /swapfile
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=5c1a8537-5a1e-4b3d-9c1a-85375a1e4b3d
bash复制# 启用swap
sudo swapon /swapfile
# 验证
free -h
total used free shared buff/cache available
Mem: 15Gi 4.2Gi 8.7Gi 356Mi 2.1Gi 10Gi
Swap: 16Gi 0B 16Gi
编辑/etc/fstab确保开机自动挂载:
bash复制sudo nano /etc/fstab
添加或修改以下行:
code复制/swapfile none swap sw 0 0
控制系统使用Swap的倾向(0-100):
bash复制# 查看当前值
cat /proc/sys/vm/swappiness
60
# 临时修改
sudo sysctl vm.swappiness=10
# 永久生效
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
对于特殊需求可以创建多个Swap文件:
bash复制sudo fallocate -l 8G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
问题1:fallocate: fallocate failed: Operation not supported
问题2:swapon: /swapfile: read swap header failed
问题3:swapon: /swapfile: insecure permissions 0644, 0600 suggested
sudo chmod 600 /swapfileSSD寿命考虑:
noatime挂载选项减少写入bash复制/swapfile none swap sw,noatime 0 0
优先级设置:
bash复制sudo swapon -p 100 /swapfile
监控Swap使用:
bash复制watch -n 1 'cat /proc/swaps'
对于内存受限的系统,ZRAM可能是更好选择:
bash复制sudo apt install zram-config
sudo systemctl restart zram-config
对于专业用户,LVM提供更灵活的Swap管理:
bash复制sudo lvcreate -L 16G -n swap_lv vg0
sudo mkswap /dev/vg0/swap_lv
sudo swapon /dev/vg0/swap_lv
对于临时性大内存需求:
bash复制sudo mount -t tmpfs -o size=32G tmpfs /mnt/tmpfs
在实际操作中,我发现对于Ubuntu 22.04 LTS,使用fallocate创建Swap文件后,配合swappiness=10的设置,能在保证性能的同时有效防止OOM(内存溢出)错误。特别是在训练Swin-Large这类大模型时,32GB的Swap空间使得原本会崩溃的任务能够顺利完成,虽然训练速度会有所下降,但至少保证了任务的连续性。