Паника из-за нехватки памяти (3.2.0) (Debian 7.3) даже при том, что нарушающий процесс был убит
При попытке сделать резервную копию довольно большой папки (450 ГБ) на диске 2 ТБ, который находится на этом сервере исключительно в качестве места назначения для резервного копирования rdiff-backup
(версия 1.2.8 - последняя отмеченная как стабильная) вызвала панику ядра.
система:
Linux giorgio 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
Диски: 2 диска по 1 ТБ в режиме программного зеркала RAID, 1 диск по 2 ТБ исключительно для резервных копий.
У меня есть подозрение: память на сервере составляет 2G, RAM + 2G, swap = 4G. Есть файлы размером до 16G. Возможно ли, что rdiff-backup
в какой-то момент загружает весь файл в память?
В любом случае, паники ядра не должно было произойти (так как процесс rdiff был убит? Значит, память должна была быть снова доступна?), Поэтому я предполагаю, что мой вопрос состоит из двух частей, одна: о моем подозрении, две: о ядро паника.
Кстати, паника началась недавно, довольно много резервных копий уже были успешными - полными и инкрементными - и эти большие файлы ГБ уже были там. Итак, я полагаю, что это вина нового ядра Debian, а не rdiff-backup?
Раздел файла журнала во время паники http://pastebin.com/e9a5fQdh
Последняя вещь на экране:
РЕДАКТИРОВАТЬ / Обновить: я только что попытался создать файл подкачки 20 ГБ (с dd из /dev/zero), и сервер снова пошел вниз, никакой реакции на ping
,
Из просмотра журналов: кажется, что ядро убило некоторые процессы - включая тот, который, как я подозреваю, вызвал все это (rdiff-backup) - но говорит, что "не хватает процессов, которые можно убить". Кажется, что уничтожение процессов не освободило память?
1 ответ
Это не убивает rdiff-backup, оно должно иметь, но его oom_score_adj
-1000
Это вызвано ошибкой в sshd. Ошибка исправлена, но не будет доступна до следующего выпуска openssh 6.5.
sshd не может установить oom_score_adj новых оболочек, которые он создает обратно в 0, если вы перезагрузите его, в результате чего все дочерние процессы, которые вы порождаете через SSH (так что ваша оболочка bash и любые дочерние процессы, которые создают), имеют -1000 oom_score_adj
и впоследствии может похитить всю память, не убивая их.
Самый быстрый способ это исправить (при условии, что 7567 - это pid sshd, как в вашем случае):-
- Бежать
echo 0 >/proc/7567/oom_adj_score
- Перезапустите sshd.
Не перезагружайте sshd, перезапустите его, пока исправление не будет на месте. (у openssh 6.5 должно быть это)
Ошибка сообщена и исправлена здесь. https://bugzilla.mindrot.org/show_bug.cgi?id=2156