httpd использует сотни мегабайт памяти
У меня есть сервер MediaTemple (DV) 4 с 512 МБ под управлением Apache 2.2.21 64-разрядной.
В течение 60 секунд после запуска httpd порождает 2-4 процесса, каждый из которых потребляет ~150 МБ памяти (согласно столбцу top 'RES'). Это очень быстро сбивает мой сервер. Под "сбоями" я подразумеваю, что все URL-адреса начинаются по тайм-ауту, в результате я не могу войти в присоединенную панель плаза. Кроме того, ssh больше не работает (время ожидания соединения), а статистика в реальном времени, предоставляемая MediaTemple, также перестает работать. Пока единственное исправление, которое я нашел, это перезапустить сервер. Apache работает на PHP (Zend Engine 2.3.0) и выполняет простую установку Drupal.
Я попробовал несколько предложений на вики медиа храма без каких-либо улучшений.
- Что может быть причиной того, что httpd потребляет столько памяти?
- Это нетипичное поведение?
- Что я могу сделать, чтобы исправить это и восстановить сервер в работоспособное состояние?
Я рад опубликовать информацию о сервере, журналы и т. Д. По запросу.
РЕДАКТИРОВАТЬ: Я должен был упомянуть ранее, этот сервер работал нормально в течение 4 месяцев или около того, и только начал время от времени сбой, как это в прошлом месяце. Я надеюсь выяснить, связано ли это просто с увеличением загрузки Drupal или с какой-то другой (потенциально более вредоносной) проблемой.
РЕДАКТИРОВАТЬ: В соответствии с просьбой, вот результат работы ps_mem.py сегодня.
-bash-3.2$ wget http://www.pixelbeat.org/scripts/ps_mem.py
-bash-3.2$ sudo python ps_mem.py
Private + Shared = RAM used Program
92.0 KiB + 12.0 KiB = 104.0 KiB qmail-clean
96.0 KiB + 14.0 KiB = 110.0 KiB splogger
116.0 KiB + 23.0 KiB = 139.0 KiB init
128.0 KiB + 12.0 KiB = 140.0 KiB qmail-rspawn
124.0 KiB + 16.0 KiB = 140.0 KiB syslogd
132.0 KiB + 12.0 KiB = 144.0 KiB qmail-lspawn
148.0 KiB + 13.0 KiB = 161.0 KiB qmail-send
208.0 KiB + 28.5 KiB = 236.5 KiB dbus-daemon
232.0 KiB + 36.5 KiB = 268.5 KiB xinetd
240.0 KiB + 32.5 KiB = 272.5 KiB mysqld_safe
328.0 KiB + 20.5 KiB = 348.5 KiB udevd
348.0 KiB + 66.0 KiB = 414.0 KiB courierlogger (4)
444.0 KiB + 85.5 KiB = 529.5 KiB bash
480.0 KiB + 50.0 KiB = 530.0 KiB xfs
592.0 KiB + 36.0 KiB = 628.0 KiB crond
544.0 KiB + 114.0 KiB = 658.0 KiB couriertcpd (4)
1.3 MiB + 82.5 KiB = 1.4 MiB sw-cp-serverd
1.2 MiB + 1.1 MiB = 2.3 MiB sshd (3)
3.1 MiB + 205.5 KiB = 3.3 MiB named
3.9 MiB + 48.2 MiB = 52.1 MiB spamd (2)
63.7 MiB + 387.0 KiB = 64.1 MiB mysqld
108.3 MiB + 9.2 MiB = 117.5 MiB httpd (7)
---------------------------------
245.4 MiB
=================================
Верхний снимок, показывающий, что одна служба httpd работает как root, а другие - как пользователь apache. Это (один корневой процесс) типично?
-bash-3.2$ top -b -n 1
top - 17:09:34 up 27 days, 18:04, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 38 total, 1 running, 37 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 946344k total, 581372k used, 364972k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21727 root 15 0 114m 52m 2112 S 0.0 5.6 0:09.17 spamd
21728 popuser 18 0 114m 50m 972 S 0.0 5.5 0:00.00 spamd
28112 apache 18 0 135m 3612 484 S 0.0 0.4 0:00.03 httpd
28110 root 18 0 259m 15m 8284 S 0.0 1.7 0:00.21 httpd
31854 apache 15 0 259m 9368 1492 S 0.0 1.0 0:00.00 httpd
28113 apache 15 0 260m 9400 1508 S 0.0 1.0 0:00.03 httpd
31853 apache 15 0 260m 9368 1484 S 0.0 1.0 0:00.00 httpd
5599 named 18 0 301m 5112 1976 S 0.0 0.5 0:00.51 named
31851 apache 15 0 309m 61m 4004 S 0.0 6.7 0:01.13 httpd
28124 apache 18 0 312m 63m 4996 S 0.0 6.8 0:03.92 httpd
1865 mysql 15 0 358m 70m 7112 S 0.0 7.6 5:52.36 mysqld
5824 root 18 0 3808 560 472 S 0.0 0.1 0:00.00 courierlogger
5834 root 18 0 3808 556 472 S 0.0 0.1 0:00.00 courierlogger
5842 root 18 0 3808 564 472 S 0.0 0.1 0:00.15 courierlogger
5851 root 18 0 3808 556 472 S 0.0 0.1 0:00.00 courierlogger
7255 qmailq 18 0 3812 428 344 S 0.0 0.0 0:00.00 qmail-clean
7252 qmaill 18 0 3816 556 468 S 0.0 0.1 0:00.00 splogger
7253 root 16 0 3856 468 352 S 0.0 0.0 0:00.00 qmail-lspawn
7254 qmailr 15 0 3856 472 356 S 0.0 0.0 0:00.00 qmail-rspawn
7250 qmails 15 0 3864 564 456 S 0.0 0.1 0:00.07 qmail-send
1418 root 15 0 5928 624 500 S 0.0 0.1 0:10.71 syslogd
1 root 18 0 10368 736 620 S 0.0 0.1 0:05.61 init
1695 root 18 0 10784 1300 1060 S 0.0 0.1 0:00.01 mysqld_safe
31869 serverad 15 0 12080 1716 1324 S 0.0 0.2 0:00.02 bash
31976 serverad 15 0 12624 1120 872 R 0.0 0.1 0:00.00 top
1123 root 15 -4 12636 684 356 S 0.0 0.1 0:00.00 udevd
5822 root 17 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
5832 root 15 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
5840 root 15 0 13188 612 476 S 0.0 0.1 0:00.46 couriertcpd
5849 root 18 0 13188 612 476 S 0.0 0.1 0:00.00 couriertcpd
3077 xfs 15 0 20276 1272 792 S 0.0 0.1 0:00.00 xfs
2035 root 15 0 20892 1180 588 S 0.0 0.1 0:04.17 crond
1427 dbus 19 0 21276 700 492 S 0.0 0.1 0:00.00 dbus-daemon
3523 root 15 0 21664 944 712 S 0.0 0.1 0:00.02 xinetd
28213 sw-cp-se 18 0 59512 2728 1420 S 0.0 0.3 0:00.03 sw-cp-serverd
1504 root 15 0 62680 1228 660 S 0.0 0.1 1:54.58 sshd
31866 root 15 0 96624 3704 2852 S 0.0 0.4 0:00.02 sshd
31868 serverad 15 0 96624 1892 1012 S 0.0 0.2 0:00.04 sshd
... и некоторые характеристики памяти в соответствии с пс.
-bash-3.2$ ps aux | sort -nk +4 | tail
named 5599 0.0 0.5 308484 5112 ? Ssl Jul24 0:00 /usr/sbin/named -u named -c /etc/named.conf -u named -t /var/named/run-root
apache 28113 0.0 0.9 266364 9400 ? S 05:15 0:00 /usr/sbin/httpd
apache 31853 0.0 0.9 266364 9368 ? S 16:08 0:00 /usr/sbin/httpd
apache 31854 0.0 0.9 266228 9368 ? S 16:09 0:00 /usr/sbin/httpd
root 28110 0.0 1.6 266092 16028 ? Ss 05:15 0:00 /usr/sbin/httpd
popuser 21728 0.0 5.5 117128 52164 ? S Jul07 0:00 spamd child
root 21727 0.0 5.6 117128 53304 ? Ss Jul07 0:09 /usr/bin/spamd --username=popuser --daemonize --nouser-config --helper-home-dir=/var/qmail --max-children 1 --pidfile=/var/run/spamd/spamd_full.pid --socketpath=/tmp/spamd_full.sock
apache 31851 0.0 6.6 317320 63324 ? S 16:08 0:01 /usr/sbin/httpd
apache 28124 0.0 6.8 319536 64604 ? S 05:15 0:03 /usr/sbin/httpd
mysql 1865 0.0 7.6 367604 72376 ? Sl Jul04 5:52 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306
Некоторые потенциально важные фрагменты из httpd.conf (после настройки параметров prefork).
-bash-3.2$ head httpd.conf -n 128 | tail -60
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 20
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive Off
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 400000
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 1
MaxClients 50
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Спасибо!
3 ответа
каждый потребляет ~150 Мб памяти (согласно столбцу "RES").
Это не хороший способ измерить использование памяти процессами, как объясняется во многих местах.
Это очень быстро вылетает мой сервер
Если в вашей системе недостаточно памяти, значит, вы неправильно ее настроили. Попробуйте правильно измерить использование памяти и сначала ограничьте количество серверов, затем вы можете начать настройку установки.
Что я могу сделать, чтобы это исправить
Вы не получите здесь ответ - слишком много вопросов и информации, которые необходимо собрать. Начните с понимания того, что на самом деле происходит с памятью и производительностью системы, читайте лоты, читайте еще, устанавливайте механизм сбора метрик, для предпочтения настройте тестовую среду, в которой вы можете быстро опробовать различные конфигурации / загрузки, тогда начинай тюнинг.
Там может быть много причин, почему это происходит. Как человек, который работает в хостинг-центре обработки данных, я бы прежде всего сомневался и спрашивал в журналах следующее:
- В коде сайта drupal может быть утечка памяти - запустите этот скрипт и опубликуйте результаты здесь.
- Сайт мог быть взломан. Поэтому проверьте разрешения запущенных процессов Apache.
Мы можем сузить после публикации результатов использования памяти.
Это очень типичное поведение, которое можно изменить в конфигурации Apache. У меня была такая же проблема, и вот что мне помогло:
Apache порождает несколько процессов, ожидающих соединения - это быстрее, чем порождается по требованию.
используйте следующие директивы:
StartServers 3
MinSpareServers 2
MaxSpareServers 3
в конфиге apache указать количество порождаемых процессов.
Вот похожая тема о нескольких процессах Apache -> https://stackoverflow.com/questions/501205/how-can-i-prevent-tons-of-apache-processes-spawning-when-i-start-apache-and-proc