[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Процессы httpd "толстеют". Утечки памяти?
naoborod
Вопрос в следующем: после рестарта Апача, судя по данным top, каждый процесс httpd потребляет 9-12 МБ памяти, но постепенно каждый процесс начинает занимать все больше памяти. За сутки процессы "толстеют" до 45-48 МБ, за двое - уже до 83-86. Несмотря на то, что сайты разные, все процессы "весят" примерно одинаково.
Таких процессов всегда от 4-10 ночью до 8-16 днем. В php.ini скрипту дано 32 МБ памяти. Для нескольких особо тяжелых случаев (парсеры) объем памяти добавляется прямо в скрипте. Долговременно работающих скриптов нет.
Конфигурация:
CentOS 5.3 x86_64
frontend - nginx
backend - Apache/2.2.3
PHP 5.3.5 (eAccelerator v0.9.6.1)
MySQL 5.1.54
Все это на физическом сервере. Работает 6 сайтов с разным уровнем посещаемости. Статику отдает nginx.
Если кто-то сталкивался с подобным, подскажите, пожалуйста, куда копать.



Спустя 7 часов, 5 минут, 38 секунд (16.02.2011 - 12:48) VELIK505 написал(а):
Это не из-за перезагрузки апача. Тут надо смотреть для начала конфиг апача твоего. содержимое httpd.conf можешь выложить?
и хотелось бы на nginx.conf глянуть тоже. Возможно с gzip перебаловался. И ещё такой вопрос mod_rpaf включен?

Спустя 1 час, 10 минут, 21 секунда (16.02.2011 - 13:58) написал(а):
Вот конфы

httpd.conf


ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 12
ServerLimit 256
MaxClients 50
MaxRequestsPerChild 200
</IfModule>
<IfModule
worker.c>
StartServers 2
MaxClients 50
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 1
</IfModule>
Listen 80
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
Include conf.d/*.conf
User www_test
Group test
ServerAdmin admin@test.ru
UseCanonicalName Off
DocumentRoot "/htdocs"
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory
"/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule
mod_userdir.c>
</IfModule>

DirectoryIndex index.php index.html index.html.var
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
TypesConfig /etc/mime.types
DefaultType text/plain
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
HostnameLookups Off
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log combined
ServerSignature On
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule
mod_dav_fs.c>
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
</IfModule>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README.html
HeaderName HEADER.html
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
ForceLanguagePriority Prefer Fallback
AddDefaultCharset CP1251
AddType application/x-tar .tgz
AddType application/x-rar-compressed .rar
Addtype application/x-shockwave-flash .flv .swf
AddType application/octet-stream .rar
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler type-map var
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Alias /error/ "/var/www/error/"
<IfModule mod_negotiation.c>
<IfModule
mod_include.c>
<Directory
"/var/www/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>
</IfModule>
</IfModule>

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
NameVirtualHost ....



nginx.conf

worker_processes 3;
events {
worker_connections 1024;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
reset_timedout_connection on;
client_body_buffer_size 10M;
client_max_body_size 32m;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:32m;
large_client_header_buffers 8 64k;
server {
listen 111.222.333.444:85;
access_log off;
location /files/ {
root /htdocs/site1;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://111.222.333.444:80;
#proxy_cache all;
#proxy_cache_valid 404 502 503 1m;
#proxy_cache_valid any 10m;
}
location ~ /\.ht {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}


mod_rpaf не включен

Спустя 44 минуты, 49 секунд (16.02.2011 - 14:43) VELIK505 написал(а):
client_body_buffer_size 10M; это чё за дед сад??? сделай 128.
Поставь mod_rpaf - именно из за этого что апач опредялял айпишники чуваков а теперь их пытаеться определить nginx и так как нету mod_rpaf он в ах.уе скидывает это обратно на апач и апач уже пытаеться определить айпишники в то время как выполняет какой-то процесс -> выполняемый в это время процессы начинает толстеть. в любом случае если не используешь вывод айпишников даже в скрипте mod_rpaf необходим.

Едем дальше знаешь чё такое gzip на nginx? Думаем чел заходит на сайт для него выполняеться какой-то процесс и в это время апач должен успеть скинуть на nginx статику в сжатом виде статику он будет скидываеть gzip, deflate которая будет вешать в 3 раза меньше.
Ты быстрее архив через аську передашь 1мб или 3 файла по 2мб? воть.
Ну и наконец ребутни через ssh потом сервак reboot. А так как ты собрал связку так никто не собирает ещё небось и через панель собирал
Гугли gzip на centos и mod_rpaf на centos

У тебя максимальное число дочерних процессов разрещённое одновременно запускаться 50 а ServerLimit ты даёшь 256 для снижения памяти подразумеваю что надо MaxClients 256 поставить

Спустя 11 минут, 13 секунд (16.02.2011 - 14:54) VELIK505 написал(а):
MaxRequestsPerChild 200 поставь 10000. MaxSpareServers 12 - у тебя чё проект дико высоко нагружаем?? поставь 10 по дефолту а то у тебя апач не успевает убивать неиспользуемые дочерние процессы.
Если есть персистентные соединения то KeepAlive On

Спустя 14 минут, 10 секунд (16.02.2011 - 15:09) naoborod написал(а):
VELIK505, спасибо. Попробую настроить в соответствии с твоими рекомендациями. Объем памяти и количество дочерних процессов были жестоко урезаны, т.к. сервер несколько раз "впадал в кому", забивая этими процессами все 8 гиг оперативы и гиг свопа туда же. С такими настройками как сейчас ни разу за 2,5 гига (в т.ч. гиг для мускуля) не вылез. Планировалось увеличить когда разберусь с "толстением".
Айпишники использую, но получаю их теперь через $_SERVER['HTTP_X_REAL_IP']

Спустя 58 минут, 45 секунд (16.02.2011 - 16:07) VELIK505 написал(а):
Цитата (naoborod @ 16.02.2011 - 12:09)
Объем памяти и количество дочерних процессов были жестоко урезаны, т.к. сервер несколько раз "впадал в кому", забивая этими процессами все 8 гиг оперативы и гиг свопа туда же.

Так не должно быть ты уверен что у тебя скрипты сайтов нормально оптимизированы? Я не в обиду.
Просто приведу пример у меня на проекте 10 000 юзеров и статистика каждого юзера обсчитывалась онлайн постоянно с ног до головы и сервак у меня до того тормозил что nginx не успевал апачу запрос отдавать и по 250 процессов было одновременно и 504 gateway time-out соответственно=) Потом я понял что надо обсчитывать раз в сутки и кешировать и из кеша уже выдавать=)

Спустя 12 часов, 57 минут, 38 секунд (17.02.2011 - 05:05) Guest написал(а):
Да никаких обид. smile.gif По оптимизации скриптов много чего сделано за последнее время, в т.ч. и то, о чем раньше у меня понятий не было, типа утечек при конкатенации строковых переменных через точку. И понятно, что оптимизировать еще есть куда. Но сильно кешировать на получится - инфа на сайте очень активно обновляется (6 модеров полный рабочий день пашут). И "впадания в кому" прекратились, думаю не только за счет урезания процессов. Правда есть еще и проблема в том, что сайт периодически атакуют.

Спустя 11 минут, 58 секунд (17.02.2011 - 05:17) inpost написал(а):
Guest
Делать статическую страницу, у нас на этом форуме, кажется, главная страница полностью статичная (или на 90%), то есть с интервалом создается результат запроса и идёт обращение непосредственно к нему. Ну а атаки стоит сразу пресекать. Атакующий ай-пи, если да - exit() скрипта в начале.

Спустя 1 час, 10 минут, 20 секунд (17.02.2011 - 06:27) naoborod написал(а):
Наши творчески подходят - с анонимных прокси, ip меняют, query_string меняют. а про статику - сейчас прорабатываю, чтобы больше было. минуты на 3, думаю, реально статикой страницу держать.

Спустя 1 час, 10 минут, 49 секунд (17.02.2011 - 07:38) alex12060 написал(а):
Правильно, у тебя все модули загружены в память, так вот какой-то из них и режет память впоследствии. Кстати, почисть логи и посмотри в httpd-error.log какие есть ошибки.

Спустя 22 минуты, 32 секунды (17.02.2011 - 08:01) naoborod написал(а):
В логах сейчас только 404. Потому и появилось подозрение об утечках. Я знаю, что не на 100% код оптимизирован, но ошибок и даже предупреждений уже нет. например, конкатенация через точку не вызывает ошибку, но вызывает утечку. По идее, когда скрипт отработал все его переменные убиваются, соответственно память освобождаться должна. А вот освобождается ли?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.