Назад | Перейти на главную страницу

Apache с моделью prefork с использованием 1000 МБ памяти на процесс

В настоящее время я работаю над сайтом, который использует Apache, работающий с моделью памяти prefork. Ниже приведена конфигурация из httpd.conf.

<IfModule prefork.c> 
  StartServers            30
  MinSpareServers         15
  MaxSpareServers         30
  MaxClients              96 
  ServerLimit             512
  MaxRequestsPerChild     0
</IfModule>

Ниже приведен пример строки сверху.

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
29261 apache    15   0 1003m 231m  53m S 16.3  2.9   1:47.68 httpd              

Ниже приведены загруженные модули apache.

core prefork http_core mod_so mod_auth_basic mod_authn_file 
mod_authz_host mod_authz_user mod_include mod_log_config 
mod_logio mod_env mod_ext_filter mod_mime_magic mod_expires 
mod_deflate mod_headers mod_usertrack mod_setenvif mod_mime 
mod_status mod_autoindex mod_info mod_vhost_alias mod_negotiation 
mod_dir mod_actions mod_alias mod_rewrite mod_cgi mod_version 
mod_realip2 mod_php5 mod_ssl

Я не уверен, все ли эти модули используются.

Ниже приведены загруженные расширения php.

date, libxml, openssl, pcre, zlib, bz2, calendar, ctype, 
curl, hash, filter, ftp, gettext, gmp, session, iconv, 
posix, Reflection, standard, shmop, SimpleXML, SPL, sockets, 
exif, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, 
apache2handler, memcache, uploadprogress, dbase, dom, 
eAccelerator, gd, json, mbstring, mcrypt, memcached, mongo, 
mysql, mysqli, newrelic, PDO, pdo_mysql, pdo_sqlite, xmlreader, 
xmlwriter, xsl, zip

Почему Apache использует столько памяти для каждого процесса? Это из-за этих модулей? Если да, то есть ли там свинки памяти, на которых я могу посмотреть, используются ли они? Или это может быть из-за расширений php? Есть там свинки памяти?

Предел памяти php установлен на 256 МБ.

В Eaccelerator установлено 512 МБ памяти.

Сервер не может обрабатывать даже нагрузки, немного превышающие средние, поскольку использование подкачки начинается, как только увеличивается трафик, из-за чего система перестает отвечать. Сервер имеет в общей сложности 8 ГБ ОЗУ и является выделенным четырехъядерным сервером.

Заранее благодарим за любую помощь в решении этой проблемы.

Во-первых, об определении использования памяти. VSS / VSIZE / VIRT не является фактическим использованием ОЗУ процессом (как также отметил @psusi). Есть несколько инструментов, которые могут рассчитать фактическое использование, один очень полезный инструмент от Питера Уиллиса из Yahoo !:

http://psydev.syw4e.info/new/misc/meminfo.pl

Два важных замечания о вашем config. Обычно не рекомендуется использовать:

MaxRequestsPerChild     0

Если только вы сами не написали приложение. Утечки памяти являются довольно распространенным явлением, поэтому после нескольких сотен (или тысяч) запросов использование памяти дочерним элементом будет расти и в конечном итоге превысит разумный уровень. Вам, вероятно, следует установить это значение на ~ 200 и посмотреть, сколько памяти они используют после 200 запросов. Это должно быть взвешено с количеством времени, которое требуется для создания сервера. Если для разветвления новых дочерних элементов требуется несколько секунд и много ресурсов, вы хотите увеличить значение (или даже уменьшить его, если он легкий).

Во-вторых, если вы специально не используете потокобезопасные модули, prefork не является предпочтительным, поскольку он использует больше памяти:

http://httpd.apache.org/docs/2.0/misc/perf-tuning.html#compiletime

MPM prefork использует несколько дочерних процессов с одним потоком каждый. Каждый процесс обрабатывает одно соединение за раз. Во многих системах prefork сравним по скорости с worker, но использует больше памяти.

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

Также есть причина, по которой ps говорит, что каждый процесс такой ... не каждый процесс использует столько памяти ... см. Следующее, чтобы хорошо прочитать о ps и памяти

http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html