Вопрос по управлению памятью lighttpd

o.0

Новичок
Вопрос по управлению памятью lighttpd

Ситуация такая - имеется некий сайт на PHP, некоторые скрипты которого обрабатываются достаточно долго (более минуты) и выдают много контента. При росте посещаемости Apache начал дико поедать память, поэтому решено было хотя бы обработку этих долгих скриптов переложить на другой сервер, и выбор пал на Lighttpd и запуск PHP через FastCGI.

Проблема теперь такая - непонятно почему процесс lighttpd ест много памяти. Сразу после старта с каждым новым запросом (поначалу) набирает по 3-4 мегабайта, потом набирает только иногда, но всё равно растет постоянно, пока не выпиливается, упёршись в лимит памяти VPS. Возможно, дело в каком-то кешировании в памяти, но как его отключить, решительно непонятно - в манах про такие настройки ничего нет.

Может, кто-то знает, из-за чего такое происходит, и что с этим можно сделать?
 

dimagolov

Новичок
0. сократи время генерации минимум на порядок, в идеале меньше 1 сек. все, что исполняется дольше (e.g. конвертация видео/фото) должно вызываться через крон.
1. попробуй php-fpm.
2. ограничь кол-во воркеров пхп. они у тебя ростут пока могут и сжирают всю память. Если будут упираться в ограничение, то веб-сервер будет или ждать, пока не освободится очередной (аграничение посетителей) или отдавать gateway-timeout.
 

o.0

Новичок
0. Не получится. Особенность проекта.
1,2. Пока к php-cgi-процессам претензий нет - они тихо-мирно весят себе по 3,5 метра и никого особо не трогают.
В том-то всё и дело, что память кончается из-за разрастающегося до 120-150 метров lighttpd, что, по-моему, как раз и ненормально, или нет?

Такие мои настройки:

PHP:
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket"	=> "/tmp/php.socket",
                                   "bin-path" => "/usr/bin/php-cgi",
                                   "min-procs" => 1,
                                   "max-procs" => 1,
                                   "check-local" => "disable",
                                   "bin-environment" => (
										"PHP_FCGI_CHILDREN" => "32",
										"PHP_FCGI_MAX_REQUESTS" => "800"
									)
                                 )
                               )
                            )
 

o.0

Новичок
Серьёзно чтоли? И с чего тогда lighttpd считается конкурентом nginx, если в моей ситуации обеспечивает преимущество по памяти дай бог в полтора раза?

Так всё-таки, почему растет процесс? Хотя бы просто из интереса хочется знать. Он кеширует выдачу скриптов (сами скрипты не могут столько весить)? Что он вообще делает, занимая столько памяти?
 

o.0

Новичок
Вот именно, что хрен его знает. Есть целый модуль же ещё mod_mem_cache, который по идее этим и должен заниматься, и что lighttpd делает по умолчанию, непонятно совсем.

Интересно, что он никогда не худеет - только растет. Ну, только после перезапуска худеет, конечно.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
кешированием и сжатием занимается mod_compress, но он кеш хранит на диске, и жрет в основном проц, а не память.

-~{}~ 26.01.10 18:51:

Хотя у меня почему то подозрение, что TC делает что то, реально, пожирающее память. Ибо лайти у меня никогда память не жрал особо.

-~{}~ 26.01.10 18:53:

Алсо, фраза "особенность проекта" в 96% случаев надумана.

-~{}~ 26.01.10 19:02:

The reason for this is the way that lighty handles connection
structures.

To save processing resources lighty does NEVER completely REMOVE and
free a connection structure! It only resets it so that it can be used
again. This way the initialization does not have to take place all the
time.

Lighty will grow in memory as long as your traffic rises. Once the peak
arrives it stays there. It starts with 128 connection structures and
adds another 128 every time those 128 fill up with active connections.
The max by default is 1024 connections (server.max-connections) and each
structure takes up quite some amount of data even in reset state, I did
not check how much exactly, it depends on your site too.

The easiest way to get around this is to lower the BUFFER_MAX_REUSE_SIZE
setting in settings.h and recompile. Its defaulted to 4k. If a buffer is
below that size it will not be freed, it will just be reset. Each
connection structure uses quite a few of these buffers including 3 used
for transitting data which most likely will be rather used but not
always at the 4k level. I did not check myself yet, but I guess that
each connection structure will use around 64k in memory just sitting
there. At 1024 structures thats 64MB just for those and I'm sure my 64k
average is lower than it really is.

To see if this is your memory usage reason I would set
BUFFER_MAX_REUSE_SIZE to 0 or to something very low and see how that
changes things.
 

Alexandre

PHPПенсионер
непонятно почему процесс lighttpd ест много памяти
1) lighttpd / spawn php - есть утечки памяти (известный факт)
2) процессы могут поедать столько памяти, сколько требует PHP, т.е. очевидны проблемы в твоем коде.

попробуй тестово запустить только малопожираемые скрипты и промониторь "отжирание".
 

o.0

Новичок
Ну понятно, чего. В этом и был вопрос - что с ним происходит такое.
Спасибо.

Пересобирать не стал, поставил nginx, всё прекрасно. Ресурсов остается море, работает как часы.
 
Сверху