过去,我对 Linux 上的内存不足情况感到有点厌倦,在这种情况下,虚拟内存开始交换并占用磁盘活动,并且机器速度变慢。
因此,当我在 MacBook Pro 上安装 Ubuntu 时,我注意到它有 8 GB 内存,我对自己说,“这似乎足够了,我想我会避免交换问题,并且不会为虚拟内存保留分区。我无论如何都需要磁盘空间。”
好吧,令我惊讶的是,事实证明,在没有虚拟内存的 Linux 内存不足的情况下,用户体验比我预期的要糟糕得多。
如果我无意中一次编译了太多大型 C++ 文件(使用“make -j6”很容易做到),或者在我注意到之前意外消耗了机器内存,那么程序不会像我预期的那样崩溃并给出错误,而是整个桌面停止响应,我被迫硬重启电脑!有时我会因此浪费大量时间或工作!
我会通过返回并重新分区来给自己一些虚拟内存来修复它,但是该死的..我现在负担不起这样做。有没有什么技巧可以让 Linux 更干净地处理内存不足的情况?
答案1
我会通过返回并重新分区来给自己一些虚拟内存来修复它,但是该死的..
您不需要有专门用于交换的完整分区,也不需要重新分区。
将交换创建为文件非常简单。只需创建一个大的空文件,对其运行 mkswap,然后添加交换即可。
# create an big empty 1GB file (or whatever size you like)
dd if=/dev/zero of=/swapfile bs=1M count=1024
# format the file as swap
mkswap /swapfile
# turn it on.
swapon /swapfile
如果你想让它永久存在,请将其添加到你的 fstab 中
/swapfile swap swap defaults 0 0
答案2
当我进行大型编译时(qtwebkit,我正在看着你),我使用控制组来防止交换死亡或其他不幸的副作用。对于我的 6G 盒子,我这样做:
cgcreate -g memory:emerge
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.limit_in_bytes
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.memsw.limit_in_bytes
cgexec -g memory:emerge tmux
如果发生 OOM 情况,唯一会被终止的进程是编译。
答案3
您还可以标记特定进程在内存不足的情况下或多或少可能被杀死。通过设置oom_score_adj
特定进程的值,您可以控制它们被杀死的优先级。
默认情况下,所有进程的分数均为 0,分数范围为 -1000(从不杀死)到 1000(始终先杀死)。
由于 Firefox 通常是我机器上内存使用的最大罪魁祸首,因此我用一个脚本来启动它:
#!/bin/sh
echo 900 > /proc/self/oom_score_adj
exec /usr/bin/firefox
这导致 Firefox 启动时的 OOM 分数为 900,作为唯一一个分数如此高的进程,这意味着一旦系统内存不足,它将立即被杀死。
我也做了类似的事情,将我的桌面环境设置为 -900,这样它就最不可能被杀死,因为默认值意味着 Firefox 有一半的时间会耗尽内存,桌面环境将被杀死以释放内存内存,然后取出 Firefox 和所有其他程序!不是很好。