В настоящее время я работаю над сайтом, который использует 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