Назад | Перейти на главную страницу

зависание сервера; нет ответа, но и отключений нет

Приветствую вас, эксперты!

Система: стандартная установка gentoo с постфиксом.

Прошлой ночью я был в процессе большой миграции электронной почты с использованием IMAP (куча сценариев Perl), когда новый почтовый сервер перестал отвечать. Однако мои SSH-соединения все еще работают и не разорвутся. Новые соединения зависают (до аутентификации), но не истекло время ожидания.

Значит ли это, что со временем он выздоровеет? Или мне нужно перезагрузить сервер?

Требуется перезагрузка. В ожидании этого ничего не произошло.

В ходе дальнейшего расследования было обнаружено, что в используемой библиотеке Perl IMAP произошла утечка памяти. Первоначально я настроил Perl-скрипт для загрузки всех учетных записей электронной почты в массив (из текстового файла, на который ссылается аргумент 1 в командной строке), а затем перебрал их, запустив код миграции для каждой учетной записи. Для каждой итерации цикла сценарий входил в систему как на исходном почтовом сервере, так и на целевом почтовом сервере, запускал код миграции, а затем выходил из системы на обоих почтовых серверах. Это в конечном итоге съело всю доступную RAM, затем весь доступный SWAP, пока, наконец, init убил процесс.

Я думал, что ускорю: я использовал screen для запуска 9 из этих процессов, каждый для разных учетных записей. После запуска девяти из этих процессов система быстро замедлилась до сканирования, а затем перестала отвечать на запросы. я догадываюсь init имел бы в конце концов убил все процессы Perl, но сколько времени это займет? Таким образом, потребовалась перезагрузка.

Я изменил свой сценарий миграции Perl для создания одной учетной записи, а затем вышел. Затем я настроил цикл bash, подобный этому, чтобы просмотреть все учетные записи, полученные из одного и того же текстового файла:

# cat run_migration4.sh
#!/bin/bash

FILE=$1

# read $FILE using the file descriptors
exec 3<&0
exec 0<$FILE

while read line
do
        # use $line variable to process line
        echo line: $line
        ./migration4.pl $line
done
exec 0<&3

Это сработало очень хорошо. Мне удалось запустить девять из них за один сеанс экрана, и все они занимали незначительный объем оперативной памяти, что не могло быть близко к пределу сервера 4G. Средняя загрузка сервера никогда не превышала 2 или 3. Все прошло без проблем.

Возможно, в ядре закончилась энтропия. Это может произойти, по крайней мере, с сервером Cyrus IMAP, если он не настроен для использования / dev / urandom в качестве источника случайности, и если сервер не может сгенерировать достаточно "реальной" случайности для / dev / случайный. Ваши симптомы совпадают с теми, с которыми я столкнулся много лет назад.

Чтобы проверить, так ли это у вас, позвольте

watch -n1 'cat /proc/sys/kernel/random/entropy_avail' 

или

while true; do cat /proc/sys/kernel/random/entropy_avail >>/somepath/available_entropy.txt; sleep 1; done

запустите и посмотрите, постоянно ли доступная энтропия падает до или около 0 во время зависания IMAP. В этом случае программное обеспечение сервера IMAP ожидает новой случайности.

Один из способов увеличить энтропию - установить rngd, в случае Gentoo это означает Emerge rng-tools а затем запустить rngd (Демон сбора случайных чисел). Он переносит полуслучайность из / dev / urandom в / dev / random, если реальная случайность слишком мала.

Обязательное предупреждение: в сверхзащищенной среде это не то, что вам нужно.