内存不足内核 (3.2.0) 恐慌 (Debian 7.3) 即使有问题的进程被杀死

Mör*_*rre 3 linux debian outofmemoryerror rdiff-backup kernel-panic

在尝试将一个相当大的文件夹 (450G) 备份到该服务器中的 2TB 驱动器时,该驱动器仅作为备份目标rdiff-backup(版本 1.2.8 - 最后标记为stable)导致内核崩溃。

系统:

Linux giorgio 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

磁盘:软件镜像RAID模式下2块1TB磁盘,1块2TB磁盘专用于备份。

我有一个怀疑:服务器上的内存是2G RAM + 2G swap = 4G。文件大小最大为 16G。是否有可能rdiff-backup在某个时候将整个文件加载到内存中?

在任何情况下,都不应该发生内核恐慌(因为 rdiff 进程被杀死了?所以内存应该再次可用?),所以我想我的问题有两部分,一:关于我的怀疑,二:关于内核恐慌。

顺便说一下,恐慌是最近开始的,相当多的备份已经成功——完整的和增量的——并且那些大 GB 文件已经存在。所以我猜这是新的 Debian 内核的错而不是 rdiff-backup 的错?

发生恐慌时的日志文件部分http://pastebin.com/e9a5fQdh

屏幕上的最后一件事:

编辑/更新:我刚刚尝试创建一个 20GB 的交换文件(使用来自 /dev/zero 的 dd)并且服务器再次关闭,对ping.

从查看日志来看:似乎内核已经杀死了一些进程 - 包括我怀疑导致这一切的那个进程(rdiff-backup) -但说“耗尽了可杀死的进程”。似乎杀死进程并没有释放内存?

Mat*_*Ife 5

它没有杀死 rdiff-backup,它应该有,但它oom_score_adj是 -1000。

这是由 sshd 中的错误引起的。该错误已修复,但在下一个版本 openssh 6.5 之前不可用。

如果您重新加载它,sshd 无法将它创建的新 shell 的 oom_score_adj 设置回 0,从而导致您通过 SSH 生成的所有子进程(因此您的 bash shell 和任何创建的子进程)都具有 -1000 oom_score_adj,随后可以占用所有内存没有 oom-killer 杀死他们。

解决此问题的最快方法是(假设 7567 是 sshd 的 pid,就像您的情况一样):-

  • echo 0 >/proc/7567/oom_adj_score
  • 重新启动 sshd。

不要重新加载 sshd,重新启动它直到修复到位。(openssh 6.5 应该有)

该错误已在此处报告并修复。https://bugzilla.mindrot.org/show_bug.cgi?id=2156