Drupal не хватает 300 мб ОЗУ. В чем может быть проблема?

Главные вкладки

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 1:47

В общем такая ситуация. Переехал на VPS. Изначально конфиг был такой Проц 400 MHz и 256 RAM

Поставил я туда 5 сайтов на друпале. 4 сайта практически без посещаемости (не влияют на нагрузку). 1 сайт имеет посещаемость примерно 2000 человек в сутки.

Сразу мне начало не хватать памяти. В нормальном состоянии было свободно примерно 40-50 мб ОЗУ...и часто стало появляться вот такое:

Мне увеличили память. Сейчас почти 300 мб ОЗУ... теперь такая ошибка вылазит редко...но вылазит.

Что я заметил. В нормальном состоянии, что днем, что ночью (то есть в независимости от посещаемости) свободно примерно 80-100 мб ОЗУ..бывает цифра падает до 70..60..50...но как правило находится в районе 90... Но..в какой то момент резко становится 0 (!) свободной ОЗУ... в какой то миг сжирает всю оперативку. Длится может это как пару секунд так и 10-20 секунд...далее резко все освобождается и вновь свободно 90 МБ...процессор особо не грузится..просто каким то чудесным образом сжирается вся оперативка.

Следовательно вопрос, должно ли хватать Друпалу таких ресурсов? И почему бывает такой резкий жор памяти? Может кто то сталкивался с пободным?

Комментарии

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 11:59

kosilko wrote:
memory_limit в настройках какой?

32 мб. Но это к данной проблеме не имеет отношения. Когда скрипту не хватает памяти то вылазит "Allowed memory size of X bytes exhausted (tried to allocate Y bytes)" а у меня другая проблема - не хватает ОЗУ вообще.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 12:01

Master of Tragedy wrote:
Друпалу должно, однако, сколько вы еще нахерачили туда модулей одному Богу известно.

из модулей только:

Nodewords
Printer-friendly pages
CAPTCHA
BUEditor
Flat comments 6.

все. Лишние стандартные модули отключил. Включено кеширование.

Аватар пользователя Nikit Nikit 7 декабря 2009 в 5:44

Возможно зацикливается какой-нибудь модуль.
Исследовать можно только на месте, а так гадать, почём зря, можно долго.

Аватар пользователя edhel edhel 7 декабря 2009 в 6:18

Или модуль какой-то сторонний глючит или провисает в пик посещаемости, когда на всех 300 мб не хватает. Например, каждый дрюпал отжирает допустим 60 мб, кликнуло 5 чел - это уже 300 мб + может в эту же память входит операционка и другие процессы?

Скрин допустим не говорит о том, что дрюпал много отжирает, всего-то 4 метра.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 12:04

edhel wrote:
Или модуль какой-то сторонний глючит или провисает в пик посещаемости, когда на всех 300 мб не хватает. Например, каждый дрюпал отжирает допустим 60 мб, кликнуло 5 чел - это уже 300 мб + может в эту же память входит операционка и другие процессы?

Скрин допустим не говорит о том, что дрюпал много отжирает, всего-то 4 метра.

Я пробовал отключать все сайты. Сама система жрет ровно 140 мб. При 270 ОЗУ..у меня было свободно 130 мб. Как только включаю сайты, даже с 0 посещаемостью (в 3 часа ночи) автоматически свободно примерно 90 ОЗУ. То есть 5 сайтов без нагрузки жрут примерно 40 ОЗУ. И такая цифра даже когда у меня на сайте 30 человек одновременно. Но в какой то миг бах...и 0 свободной ОЗУ...через пару секунд уже все нормально...

Аватар пользователя ws_admin ws_admin 7 декабря 2009 в 12:16

roadcontrol][quote=edhel wrote:
Но в какой то миг бах...и 0 свободной ОЗУ...через пару секунд уже все нормально...

А это не может быть из-за cron'a? Знаю случай когда ночью 2 сайта из-за нехватки памяти упали одновременно на 2-х раздельных аккаунтах. Хостер сообщил, что ничего не менял. Потом глядя на такую синхронность предположили, что может cron-отработал (cron давно не запускался, и похоже накопилось задач, т.к. настройки были идентичны).

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 12:28

ws_admin][quote=roadcontrol wrote:
edhel wrote:
Но в какой то миг бах...и 0 свободной ОЗУ...через пару секунд уже все нормально...

А это не может быть из-за cron'a? Знаю случай когда ночью 2 сайта из-за нехватки памяти упали одновременно на 2-х раздельных аккаунтах. Хостер сообщил, что ничего не менял. Потом глядя на такую синхронность предположили, что может cron-отработал (cron давно не запускался, и похоже накопилось задач, т.к. настройки были идентичны).

Я крон запускаю вручную... тем более крон ведь не запускается по нескольку раз в день...

Если я поставлю допустим 512 ОЗУ или 1 гиг проблема на 100% решится..просто странно что одному сайту не хватает столько ОЗУ...и что еще не понятней, почему такой резкий жор...а потом бах и опять свободно 90...

Аватар пользователя ws_admin ws_admin 7 декабря 2009 в 11:57

roadcontrol wrote:

Следовательно вопрос, должно ли хватать Друпалу таких ресурсов? И почему бывает такой резкий жор памяти? Может кто то сталкивался с пободным?

Официальные требования к ресурсам можно посмотреть,например, здесь., т.е. 300МБ по идее должно хватать.

У меня на виртуальном хостинге такая ошибка возникала и ходила парой с проблемами, связанными с ограничениями хостинга на время таймаута и размер пакетов (когда вылетает еще (Ошибка MySQL server has gone away query). В моем случае почти устранилась перенастройкой указанных выше параметров (в пределах возможностей виртуального хостинга лимит памяти 64Мб, размер пакетов не более 24Мб, таймаут от 10-60 сек). См. мой комментарий от 7.12.2009

Но, т.к. у вас VPS, надеюсь с root, то возможностей побольше и можно попробовать отконфигурировать php.ini на рекомендованные настройки. Например попробовать это.

Аватар пользователя axel axel 7 декабря 2009 в 12:13

Так эти 300Мб расходуются на операционную систему, mysql, apache и что там ещё у вас запущено. См. top/htop чтобы выяснить какие сервисы больше всего потребляют памяти и конфигурируйте для меньшего потребления. В первую очередь это касается mysql и apache. Для PHP под друпал нужно где-то по 48-64Мб на процесс (зависит от набора модулей). Этот лимит надо выставить в php.ini. Для сайта с посещаемостью 2000 в сутки одновременное число процессов - 1-3. Значит нужно максимум 3*48=144Мб под php - примерно такое количество свободной памяти желательно иметь в запасе после запуска всех программ, чтобы несколько процессов могли работать одновременно.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 12:26

axel wrote:
Так эти 300Мб расходуются на операционную систему, mysql, apache и что там ещё у вас запущено. См. top/htop чтобы выяснить какие сервисы больше всего потребляют памяти и конфигурируйте для меньшего потребления. В первую очередь это касается mysql и apache. Для PHP под друпал нужно где-то по 48-64Мб на процесс (зависит от набора модулей). Этот лимит надо выставить в php.ini. Для сайта с посещаемостью 2000 в сутки одновременное число процессов - 1-3. Значит нужно максимум 3*48=144Мб под php - примерно такое количество свободной памяти желательно иметь в запасе после запуска всех программ, чтобы несколько процессов могли работать одновременно.

Голая система без нагрузки жрет ровно 140 мб. С запущенными сайтами + 40 - 50 мб. Остальное жрется в процессе работы, но бывает так что по неизвестным причинам друпал кушает все оперативку. Проблема, что скрипту не хватает лимита ОЗУ - нет. У меня не проблема "Allowed memory size of X bytes exhausted (tried to allocate Y bytes)" а у меня проблема вообще нехватки ОЗУ.

Как только друпал кушает всю ОЗУ..форум PHPbb3 также пишет что оперативка закончилась и естественно не запускаются все остальные сайты которые висят на серваке.

Аватар пользователя axel axel 7 декабря 2009 в 23:49

roadcontrol wrote:
axel wrote:
Так эти 300Мб расходуются на операционную систему, mysql, apache и что там ещё у вас запущено. См. top/htop чтобы выяснить какие сервисы больше всего потребляют памяти и конфигурируйте для меньшего потребления. В первую очередь это касается mysql и apache. Для PHP под друпал нужно где-то по 48-64Мб на процесс (зависит от набора модулей). Этот лимит надо выставить в php.ini. Для сайта с посещаемостью 2000 в сутки одновременное число процессов - 1-3. Значит нужно максимум 3*48=144Мб под php - примерно такое количество свободной памяти желательно иметь в запасе после запуска всех программ, чтобы несколько процессов могли работать одновременно.

Голая система без нагрузки жрет ровно 140 мб. С запущенными сайтами + 40 - 50 мб. Остальное жрется в процессе работы, но бывает так что по неизвестным причинам друпал кушает все оперативку. Проблема, что скрипту не хватает лимита ОЗУ - нет. У меня не проблема "Allowed memory size of X bytes exhausted (tried to allocate Y bytes)" а у меня проблема вообще нехватки ОЗУ.

Как только друпал кушает всю ОЗУ..форум PHPbb3 также пишет что оперативка закончилась и естественно не запускаются все остальные сайты которые висят на серваке.

Именно про это я и писал. Лимит в php - только одна из настроек, она тоже нужна. Голая система (linux) - вписывается в потребление 16Мб. Mysql на таких объёмах памяти имеет смысл ограничить потреблением 64-96Мб. На 2000 хостов в сутки как я уже сказал очень маловероятен приход более 2-3 пользователей одновременно (ну можно заложиться на пик - прибавив ещё 1-2) - можно ограничить максимум процессов апача, а также mysql. Про расчёт памяти под PHP - написал уже выше. Для апача стоит также учесть, что вебсервер отдаёт картинки и css в запросе - это отдельные процессы. Поэтому на запрос пользователя к сайту приходится несколько процессов апача, но при этом один поток mysql.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 12:33

Смотрим:

Запущено 5 сайтов. На основном 43 человека одновременно.

В какой то миг свободной ОЗУ может стать 0 мб.

Аватар пользователя axel axel 7 декабря 2009 в 23:51

roadcontrol wrote:
Запущено 5 сайтов. На основном 43 человека одновременно.

В какой то миг свободной ОЗУ может стать 0 мб.

43 человека "одновременно" на сайте это те самые 1-3 одновременных запроса к серверу. У вас там в списке imap и pop3 демоны в несколько потоков, они действительно используются? Для отправки почты с сайта достаточно мейлсервера вроде exim.

Аватар пользователя edhel edhel 7 декабря 2009 в 12:48

Повторю свою гипотезу: если в "какой-то миг" 5 чел в течении одной секунды кликают на Ваш сайт, то и получим 5 одновременных процессов apache. Можно попробовать в апаче уменьшить кол-во одновременно обрабатываемых запросов.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 13:14

edhel wrote:
Повторю свою гипотезу: если в "какой-то миг" 5 чел в течении одной секунды кликают на Ваш сайт, то и получим 5 одновременных процессов apache. Можно попробовать в апаче уменьшить кол-во одновременно обрабатываемых запросов.

К сожалению я не знаю как это сделать Sad

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 14:54

Вот такая ситуация когда свободно 40 мб

Я так понял прямая зависимость от запущенных процессов..как видно их 9...а в нормальном состоянии 1-2

Аватар пользователя edhel edhel 7 декабря 2009 в 15:11

В "нормальном" состоянии 0 apache, а тут 7 вылезло. Зашло чела 3 одновременно может, грузятся картинки в несколько потоков. Есть директива MaxClients в apache, можно ее попробоать поставить равной 5-6, к примеру. Ну или больше памяти.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 15:16

edhel wrote:
В "нормальном" состоянии 0 apache, а тут 7 вылезло. Зашло чела 3 одновременно может, грузятся картинки в несколько потоков. Есть директива MaxClients в apache, можно ее попробоать поставить равной 5-6, к примеру. Ну или больше памяти.

Ну если у меня на сайте допустим 40 человек..то ясное дело они не просто сидят и смотрят в экран..и при этом у меня может быть 1-2 процесса.

Если я поставлю макс количество процессов 5-6..что будет если будет запрос на 8?

Аватар пользователя axel axel 7 декабря 2009 в 23:56

roadcontrol wrote:
Ну если у меня на сайте допустим 40 человек..то ясное дело они не просто сидят и смотрят в экран..и при этом у меня может быть 1-2 процесса.
Если имеется ввиду статистика выдаваемая друпалом или движками форумов "сколько человек на сайте за N минут", то да - можно считать что именно сидят и смотрят в экран. Реально это соответствует паре одновременных обращений к серверу - число соединений для mysql к примеру можно ограничить 10 - это с запасом. Есть скрипты анализа статистики - например http://day32.com/MySQL/, которые позволяют более точно определить необходимые параметры.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 15:49

edhel wrote:
2-3 запроса будет в очереди стоять, ждать пока обрабатаются предыдущие.

Подскажите в каком файлике вносить правки? httpd.conf ?

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 17:03

Не думаю что ограничение количества процессов поможет. Вот скрин. Запущено 2 процесса, но ОЗУ меньше чем когда работало 9 процессов.

Аватар пользователя rbogdan@drupal.org rbogdan@drupal.org 7 декабря 2009 в 17:19

Нет это как уже выше писали в комментариях идёт зацикливание в каком-то из модулей 100%. Даже при установке лимита памяти в php до 1Гб и одном посетителе, всё равно продолжались проблемы.

Все решилось после того, как была найдена причина вызывающая утечку памяти в одном из модулей. После этого все прекратилось. Правда, что конкретно и как делалось не сохранилось в памяти. Но копать нужно, однозначно в сторону модулей.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 18:36

<a href="mailto:rbogdan@drupal.org">rbogdan@drupal.org</a> wrote:
Нет это как уже выше писали в комментариях идёт зацикливание в каком-то из модулей 100%. Даже при установке лимита памяти в php до 1Гб и одном посетителе, всё равно продолжались проблемы.

Все решилось после того, как была найдена причина вызывающая утечку памяти в одном из модулей. После этого все прекратилось. Правда, что конкретно и как делалось не сохранилось в памяти. Но копать нужно, однозначно в сторону модулей.

Выше я указал список модулей которые установил...вроде никаких экзотических я не ставил..все очень распространенные....
Кстати, указанные проблемы СРАЗУ появились после переезда на VPS с обычного хостинга у того же хостера. То все предыдущее время я такого у себя не видел. Но с хостинга меня выгнали за то что я перегружаю сервак...и как только я получил ограниченные ресурсы..начала вылазить эта хрень.

Аватар пользователя edhel edhel 7 декабря 2009 в 18:11

«Запущено 2 процесса, но ОЗУ меньше чем когда работало 9 процессов.»

Только на экране видно 5 апачей, ниже еще могут быть.

Мускул тоже жрет не слабо. Даже под виндой он жрёт у меня 12 метров.

Аватар пользователя roadcontrol roadcontrol 7 декабря 2009 в 22:12

Вот только что опять было 0...Наблюдал в SHH..стремительное падение до нуля..примерно секунд 10 ноль...а потом стремительный возврат до 100 мб свободных

Аватар пользователя roadcontrol roadcontrol 8 декабря 2009 в 0:31

axel спасибо за комментарии! Только как подкорректировать лимиты я не знаю Sad Подскажите куда нужно внести правки?