У меня есть сервер с 2 ядрами и 2 ГБ оперативной памяти, который борется с использованием памяти.
Когда я запускаю free -m, я регулярно получаю менее 50 МБ свободного места - прямо сейчас он показывает 378 МБ, когда на сайте только 1 пользователь:
total used free shared buffers cached
Mem: 1869 1772 96 5 34 247
-/+ buffers/cache: 1491 378
Swap: 1023 34 989
Когда я запускаю ps-aux, я вижу множество запросов httpd, которые начались вчера и все еще открыты.
apache 5789 0.0 3.8 1038176 72904 ? S 03:18 0:27 /usr/sbin/httpd
apache 5790 0.0 3.3 1029400 64216 ? S 03:18 0:26 /usr/sbin/httpd
apache 5792 0.1 3.4 1031124 65876 ? S 03:18 0:35 /usr/sbin/httpd
apache 28042 0.1 3.3 1029648 64868 ? S 04:53 0:28 /usr/sbin/httpd
apache 28043 0.0 3.8 1038412 73420 ? S 04:53 0:23 /usr/sbin/httpd
apache 31728 0.1 3.8 1038516 73008 ? S 07:53 0:14 /usr/sbin/httpd
root 31912 0.0 0.7 968160 14860 ? Ss 2014 0:03 /usr/sbin/httpd
apache 31914 0.0 0.0 246808 1364 ? S 2014 0:01 /usr/sbin/httpd
apache 31915 0.1 3.7 1038644 71700 ? S 2014 1:02 /usr/sbin/httpd
apache 31916 0.1 3.7 1038480 71844 ? S 2014 0:56 /usr/sbin/httpd
apache 31917 0.0 3.1 1026120 60044 ? S 2014 0:52 /usr/sbin/httpd
apache 31920 0.1 4.1 1045972 79940 ? S 2014 0:59 /usr/sbin/httpd
apache 31921 0.0 3.8 1039180 73040 ? S 2014 0:50 /usr/sbin/httpd
apache 31923 0.1 3.3 1029684 63908 ? S 2014 0:59 /usr/sbin/httpd
apache 31924 0.1 3.2 1027808 61632 ? S 2014 0:53 /usr/sbin/httpd
apache 31927 0.1 3.2 1027844 61664 ? S 2014 0:54 /usr/sbin/httpd
apache 31929 0.1 3.8 1039660 73528 ? S 2014 0:59 /usr/sbin/httpd
apache 31931 0.1 3.2 1028592 62492 ? S 2014 0:58 /usr/sbin/httpd
apache 31933 0.0 3.2 1029036 62876 ? S 2014 0:52 /usr/sbin/httpd
apache 31934 0.1 3.3 1029568 63232 ? S 2014 0:54 /usr/sbin/httpd
apache 32022 0.0 3.8 1038928 73104 ? S 2014 0:41 /usr/sbin/httpd
Вывод top, отсортированный по использованию памяти:
31920 apache 20 0 1021m 78m 9064 S 0.0 4.2 0:59.48 httpd
31929 apache 20 0 1015m 71m 8428 S 0.0 3.8 1:02.44 httpd
28043 apache 20 0 1014m 71m 9176 S 0.0 3.8 0:26.59 httpd
32022 apache 20 0 1014m 71m 8796 S 0.0 3.8 0:44.04 httpd
31921 apache 20 0 1014m 71m 8408 S 0.0 3.8 0:51.95 httpd
31728 apache 20 0 1014m 71m 8768 S 0.0 3.8 0:15.00 httpd
5789 apache 20 0 1013m 71m 8716 S 0.0 3.8 0:28.57 httpd
591 apache 20 0 1013m 71m 8756 S 0.0 3.8 0:42.92 httpd
31916 apache 20 0 1014m 70m 8368 S 0.0 3.8 0:59.94 httpd
31915 apache 20 0 1014m 70m 8384 S 0.0 3.7 1:04.74 httpd
5792 apache 20 0 1006m 64m 8744 S 0.0 3.4 0:37.37 httpd
5790 apache 20 0 1006m 63m 8800 S 0.0 3.4 0:28.23 httpd
28042 apache 20 0 1005m 63m 9176 S 0.0 3.4 0:29.50 httpd
584 apache 20 0 1006m 62m 8456 S 0.0 3.4 0:37.14 httpd
586 apache 20 0 1006m 62m 8412 S 0.0 3.4 0:44.48 httpd
588 apache 20 0 1006m 62m 8424 S 0.0 3.4 0:43.11 httpd
587 apache 20 0 1006m 62m 8420 S 0.0 3.4 0:47.20 httpd
31923 apache 20 0 1005m 62m 8796 S 0.0 3.3 1:01.21 httpd
31933 apache 20 0 1005m 62m 8376 S 0.0 3.3 0:54.89 httpd
31927 apache 20 0 1004m 60m 8392 S 0.0 3.2 0:58.68 httpd
31924 apache 20 0 1003m 60m 8412 S 0.0 3.2 0:53.68 httpd
31934 apache 20 0 1003m 60m 8408 S 0.0 3.2 0:56.56 httpd
31917 apache 20 0 1003m 60m 8404 S 0.0 3.2 0:54.97 httpd
1871 root 20 0 157m 17m 1968 S 0.0 0.9 0:53.10 lfd
5597 apache 20 0 952m 16m 5212 S 0.0 0.9 0:01.02 httpd
31912 root 20 0 945m 14m 13m S 0.0 0.8 0:03.37 httpd
5854 root 20 0 98364 4676 3672 S 0.0 0.2 0:00.09 sshd
6557 postfix 20 0 82264 4420 3292 S 0.0 0.2 0:00.04 cleanup
6560 postfix 20 0 82168 4316 3324 S 0.0 0.2 0:00.03 smtp
4411 postfix 20 0 81964 4048 3096 S 0.0 0.2 0:00.04 pickup
5856 root 20 0 105m 1944 1528 S 0.0 0.1 0:00.02 bash
В моем httpd.conf у меня есть:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule prefork.c>
StartServers 4
MinSpareServers 12
MaxSpareServers 24
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 3000
</IfModule>
Исходя из вышеизложенного, я предполагаю, что это означает, что KeepAlive включен, но он будет поддерживать активность любого сеанса только в течение 2 секунд - если это правильно, почему у меня все еще работает много процессов со вчерашнего дня и как я могу исправить это?
Чтобы подтвердить, что Apache забирает всю вашу память, вы можете использовать этот фрагмент:
function memperuser() {
ps aux | awk 'NR != 1 {x[$1] += $4} END{ for(z in x) {print z, x[z]"%"}}'
}
Затем введите мемпер.
Еще один полезный способ увидеть разбивку разделяемой и частной памяти - использовать ps_mem.py
Это покажет вам, сколько общей и частной памяти потребляет Apache.
Вам также следует просмотреть все записи LoadModule в вашем httpd.conf и определить, нужны ли вам все они. Обычно главный виновник - mod_php. Если вам не нужен PHP, просто отключите этот модуль. Он может загружаться в своей собственной конфигурации в httpd.d /
Если вы не используете PHP, вы также можете уменьшить объем памяти, занимаемый Apache, используя mpm_event или mpm_worker вместо mpm_prefork. В Apache На веб-сайте есть действительно хорошая документация по использованию различных модулей MPM.
Вы можете еще больше уменьшить объем памяти, используя новейшие APR апр, апр-утиль и апр-iconv и ветка Apache 2.4. То, как вы собираетесь компилировать и / или устанавливать, сильно зависит от ваших настроек, поэтому я обращусь к форуму вашей конкретной ОС.
Все эти параметры действительно зависят от того, как вы используете Apache.
keepalive
и KeepAliveTimeout
только контролирует, как долго сеанс для клиента остается активным, но если сеанс закрыт, это вовсе не означает, что процесс будет убит, поскольку любому процессу в вашей конфигурации разрешено обрабатывать до 3000 запросов (MaxRequestsPerChild
).
Ваша система настроена так, чтобы поддерживать до 24 простаивающих процессов Apache (12 запускаются сразу после запуска Apache) (Параметры MinSpareServers
и MaxSpareServers
).
Однако простаивающий процесс Apache обычно не использует весь объем оперативной памяти сам по себе, большая часть используется совместно со всеми другими процессами. Вам нужно выяснить, что на самом деле съедает оперативную память и почему.