7GB 内存跑 4GB 语音模型
手里这台机器是 4 核 7GB,想在上面跑一个大约 4GB 的语音识别模型。听上去内存是够的,但真正跑起来,峰值内存远不止模型文件的大小——模型加载、推理时的中间张量、框架自身的开销,加起来很容易翻倍。
结果就是:不加 swap 的话,进程跑到一半被 OOM killer 干掉,日志里只剩一行 Killed。
加一块 swap
# 4GB 的 swap 文件
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 开机自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab
用 fallocate 而不是 dd,快很多。挂上之后 free -h 应该能看到 swap 那一行有数了。
把 swappiness 调低
默认值 60 意味着内核很积极地把内存页换出去。对这种“平时够用、峰值才爆”的场景,换得太勤反而拖慢速度。我改成 10:
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf
意思是:只有在真的紧张时才用 swap。平时不碰,峰值时兜底。
但 swap 救不了性能
这一点必须说清楚,免得期待过高。swap 放在磁盘上,速度比内存慢几个数量级。如果模型推理过程中大量数据被换到 swap 再读回来,延迟会肉眼可见地变高,语音识别这种对实时性有要求的场景尤其明显。
swap 的作用是让进程“活着跑完”,不是“跑得快”。如果峰值内存长期超过物理内存,正确的做法是加内存或者换更小的模型,不是加大 swap。
怎么判断是不是在被 swap 拖累
几个观察点:
vmstat 1里si/so两列(每秒换入换出)长期不为零,说明在频繁换页free -h里 swap used 持续上涨不回落- 同样的输入,推理耗时波动很大
我这台机器跑下来,swap 用了大概 1.5GB 就稳住了,没有继续涨,说明 4GB 的 swap 尺寸是够的。如果你的 swap 一直涨到打满,那就是物理内存真的不够,加 swap 只是把 OOM 推迟了一点。
顺带一提
如果机器长期只有 1~2GB 内存,与其反复调参,不如一开始就选大一号的规格。云服务器的内存差价,往往比花几个小时调优要便宜。