LINUX.ORG.RU
ФорумAdmin

Apache съедает всю оперативку

 , , ,


0

1

Здравствуйте!

Есть в наличии VPS:

  • CentOS 6.3 64x
  • Nginx 1.2.3 (прокси)
  • Apache 2.2.22
  • PHP 5.3.27 (PHP как модуль Apache)
  • 3000МБ ОЗУ

На этом сервере крутится сайт, на котором нужно делать выгрузку базы данных в excel файл. Для этого используется пакет Spreadsheet_Excel_Writer.

И вот тут есть проблема. Во время работы скрипта, Apache сжирает всю оперативную память (3ГБ), при том, что в настройках PHP стоит ограничение на 512МБ. И ещё интересно, что при вызове memory_get_peak_usage(true), внутри работающего скрипта, результат всегда меньше 300МБ.

Так почему же Apache съел всю память?

Проблему удалось локализовать до файла «Spreadsheet/Excel/Writer/Workbook.php» (который из комплекта Spreadsheet_Excel_Writer). В этом файле есть функция _calculateSharedStringsSizes() (залил её на пастбин), в которой есть цикл, начинающийся со строки 63 (если смотреть на пастбине), так вот, если цикл удалить, то утечки памяти не будет (про результат работы скрипта речи не идёт)!

Я даже сделал копию сайта у себя на виртуальной машине, с теми же параметрами (только без Nginx'а в качестве прокси). Скрипт отработал как надо, и Apache не требовал более 400МБ вообще. Что за чудеса?!

Подскажите, пожалуйста, куда копать?


только без Nginx'а в качестве прокси
Apache не требовал более 400МБ вообще.

Nginx'а в качестве прокси

Nginx

см. его конфигурацию.

zgen ★★★★★ ()

VPSка случайно не не OpenVZ? Подчеркну что я тут сильно не специалист, но насколько я понимаю учёт расхода памяти внутри OpenVZ контейнера (при включённых лимитах на память) происходит не так как вне контейнера. В контейнере считается занятой вся затребованная приложением память, а в голом линуксе только реально задействованная. Многие программы берут себе память сильно с запасом рассчитывая на то что ОС умная и сумеет отдать неиспользуемые или излишки под другие нужды.
У меня был случай когда апач с пятью рабочими процессами без нагрузки выжырал 500 мб памяти сразу после запуска.
На сколько я понимаю лечится это настройкой apache на меньшую прожорливость, или заменой его на nginx. А может это был баг, а не фича, и его уже исправили.

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

К сожалению не знаю какой тип виртуализации использует хостер. Но проблема решилась банальным ребутом сервера.

hjack ()
Ответ на: комментарий от hjack

Ан нет, сарвак постоял день и снова начал жрать память на том же месте.

Для проверки полностью отключил Nginx, ничего не изменилось память на апаче утекает.

hjack ()

Я даже сделал копию сайта у себя на виртуальной машине, с теми же параметрами

Версия php та же? Тоже 64 бит?

goingUp ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.