Вот такое забавное сообщение «Out of memory: kill process» довелось наблюдать на EC2 Micro Instance Amazon. В какие-то моменты инстанс начал умирать, по логам удалось увидеть информацию:
kernel: [151388.450555] Free swap = 0kB kernel: [151388.450557] Total swap = 1212964kB ... kernel: [151388.453545] Out of memory: kill process 22450 (apache2) score 111071 or a child kernel: [151388.453561] Killed process 2182 (apache2) vsz:318016kB, anon-rss:352kB, file-rss:0kB
Конфигурация Micro Instance:
— 613 MB memory
— Up to 2 EC2 Compute Units (for short periodic bursts)
— EBS storage only
— 32-bit or 64-bit platform
— I/O Performance: Low
— API name: t1.micro
— Swap был сконфигурирован на 1.2 GB
На сервере была установлена Ubuntu и настроен LAMP. Особой нагрузки на сервере не наблюдалось. Сценарий происходящего на сервере был следующий — вначале заканчивалась оперативная память, потом заканчивалась память в swap и сервер умирал :). Причиной этому был Apache, который был настроен в режиме Prefork. Для решения этой проблемы был переконфигурирован Apache Prefork, но и это не спасло ситуацию. Я установил nginx, вроде ситуация улучшилась, но все равно проблема повторялась. Увеличивая размер Swap мы не решили бы проблему, т.к. утечка памяти в любом случае продолжалась бы.
Интересное решение данной проблемы я нашел на официальном сайте Amazon:
http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#MemoryOOM
Do one of the following:
— Stop the instance, and modify the instance to use a different instance type, and start the instance again. For example, you may want to use a larger instance type or a high-memory instance type.
— Reboot the instance to return it to a non-impaired status. The problem will probably occur again unless you change the instance type.
Как будто Amazon намекает «есть проблемы — берите более мощный instance». Ну-ну, но мы же не ищем легких путей :).
Для решения этой проблемы я решил использовать Monit, про который я напишу в ближайшее время. Решение не самое идеальное, но по крайней мере сервер самостоятельно восстанавливается и это лучше, чем пока Amazon пришлет письмо, что нужно опять перезапускать полностью сервер.
Дополнительный материал:
— EC2 Micro Instance Limitations
— Adding Swap to any EC2 Instance
— Quick and Easy Way to Monitor Process Memory Usage
— Shell Script To Auto Restart Apache HTTPD When it Goes Down / Dead
— Shell Script To Auto Restart Apache HTTPD
Июль 8th, 2012 at 13:40
Очень в тему, я уже перевёл базу в RDS, но она дорогущая зараза, а с горизонтальным масштабированием апачей ещё не разбирался — там надо под конкретный проект скорей всего подкручивать, а у меня тоже только мелкие сайты.
«ps aux» говорит что процесс ест по 2-3% оперативки, надо будет тоже переезжать