Подтвердить что ты не робот

Сервер apache достиг настройки MaxClients, подумайте о повышении установки MaxClients

Я запускаю centos 5.5 с 768mb ram. я продолжаю получать server reached MaxClients setting, consider raising the MaxClients setting в журналах, а apache работает очень медленно. когда я смотрю на графики кактусов, он показывает, что сервер даже не использует все ресурсы. Вот текущая конфигурация

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers    10
ServerLimit        1024
MaxClients         768
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>



free -m
             total       used       free     shared    buffers     cached
Mem:           768        352        415          0          0         37
-/+ buffers/cache:        315        452
Swap:            0          0          0



top - 11:03:54 up 41 days, 11:53,  1 user,  load average: 0.05, 0.03, 0.00
Tasks:  35 total,   1 running,  34 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.3%st
Mem:    786432k total,   389744k used,   396688k free,        0k buffers
Swap:        0k total,        0k used,        0k free,    38284k cached

Я пробовал следующее, но сервер реагирует очень медленно

<IfModule worker.c>
#StartServers         2
#MaxClients         150
#MinSpareThreads     25
#MaxSpareThreads     75
#ThreadsPerChild     25
#MaxRequestsPerChild  0

StartServers    20
MaxClients      1024
ServerLimit     1024
MinSpareThreads 128
MaxSpareThreads 768
ThreadsPerChild 64
MaxRequestsPerChild 0
</IfModule>

free -m
             total       used       free     shared    buffers     cached
Mem:           768        324        443          0          0         37
-/+ buffers/cache:        286        481
Swap:            0          0          0

enter image description here

@regilero

Я обновил до

<IfModule prefork.c>
  StartServers       12
  MinSpareServers    12
  MaxSpareServers    12
  MaxClients         50
  MaxRequestsPerChild  300
</IfModule>

используя top я see

Tasks:  36 total,   1 running,  35 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    786432k total,   613180k used,   173252k free,        0k buffers
Swap:        0k total,        0k used,        0k free,    76488k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                         
    1 root      20   0 10364   92   60 S  0.0  0.0   1:09.53 init                                                                                                                                                                            
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd/808                                                                                                                                                                    
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper/808                                                                                                                                                                     
  124 root      16  -4 12620    8    4 S  0.0  0.0   0:00.00 udevd                                                                                                                                                                           
  533 root      20   0 95504 5692  228 S  0.0  0.7   4:02.94 memcached                                                                                                                                                                       
  546 root      20   0  5924  332  276 S  0.0  0.0   6:54.51 syslogd                                                                                                                                                                         
  557 root      20   0  101m 1456  868 S  0.0  0.2  13:18.64 snmpd                                                                                                                                                                           
  570 root      20   0 62640  316  208 S  0.0  0.0   2:39.56 sshd                                                                                                                                                                            
  579 root      20   0 21656   24   20 S  0.0  0.0   0:00.00 xinetd                                                                                                                                                                          
  589 root      20   0 12072   12    8 S  0.0  0.0   0:00.05 mysqld_safe                                                                                                                                                                     
  940 mysql     20   0  559m 164m 3832 S  0.3 21.5 209:33.88 mysqld                                                                                                                                                                          
 1015 root      20   0 20880  200  132 S  0.0  0.0   0:10.48 crond                                                                                                                                                                           
 1023 root      20   0 46748    4    0 S  0.0  0.0   0:00.00 saslauthd                                                                                                                                                                       
 1024 root      20   0 46748    4    0 S  0.0  0.0   0:00.00 saslauthd                                                                                                                                                                       
 3605 root      20   0 62832 2168  636 S  0.0  0.3   0:02.58 sendmail                                                                                                                                                                        
 3613 smmsp     20   0 57712 1648  504 S  0.0  0.2   0:00.01 sendmail                                                                                                                                                                        
17610 root      20   0 85932 3312 2600 S  0.0  0.4   0:00.02 sshd                                                                                                                                                                            
17612 mcmap     20   0 86072 1760 1012 S  0.0  0.2   0:00.17 sshd                                                                                                                                                                            
17613 mcmap     20   0 12076 1656 1292 S  0.0  0.2   0:00.01 bash                                                                                                                                                                            
17637 root      20   0 45052 1432 1120 S  0.0  0.2   0:00.00 su                                                                                                                                                                              
17638 root      20   0 12180 1800 1324 S  0.0  0.2   0:00.08 bash                                                                                                                                                                            
17740 root      20   0  246m 9264 4516 S  0.0  1.2   0:00.19 httpd                                                                                                                                                                           
18264 apache    20   0  282m  43m 4940 S  0.0  5.7   0:00.56 httpd                                                                                                                                                                           
18514 apache    20   0  279m  40m 4832 S  0.0  5.3   0:01.47 httpd                                                                                                                                                                           
18518 apache    20   0  273m  36m 4396 S  0.0  4.7   0:00.45 httpd                                                                                                                                                                           
18528 apache    20   0  251m  13m 3660 S  0.0  1.8   0:00.41 httpd                                                                                                                                                                           
18529 apache    20   0  278m  40m 4340 S  0.0  5.3   0:00.99 httpd                                                                                                                                                                           
18530 apache    20   0  278m  40m 4268 S  0.0  5.3   0:00.67 httpd                                                                                                                                                                           
18548 apache    20   0  272m  33m 3516 S  0.0  4.4   0:00.28 httpd                                                                                                                                                                           
18552 apache    20   0  280m  42m 3684 S  0.0  5.5   0:00.48 httpd                                                                                                                                                                           
18553 apache    20   0  271m  33m 3768 S  0.0  4.3   0:00.45 httpd                                                                                                                                                                           
18555 apache    20   0  274m  36m 3672 S  0.0  4.7   0:00.58 httpd                                                                                                                                                                           
18572 apache    20   0  247m 9020 2856 S  0.0  1.1   0:00.01 httpd                                                                                                                                                                           
18578 apache    20   0  280m  42m 3684 S  0.0  5.6   0:00.76 httpd                                                                                                                                                                           
18589 apache    20   0  246m 5452  676 S  0.0  0.7   0:00.00 httpd                                                                                                                                                                           
18588 root      20   0 12624 1216  932 R  0.0  0.2   0:00.06


free -m
             total       used       free     shared    buffers     cached
Mem:           768        578        189          0          0         74
-/+ buffers/cache:        504        263
Swap:            0          0          0

enter image description here Просто добавлено текущее изображение результата кактуса последние 4 часа. Занятые периоды - понедельник. Поэтому я буду ждать до следующей недели, чтобы увидеть дальнейшие результаты изменения конфигурации. но это похоже на улучшение, поскольку до этого у меня было всего 10 потоков. Глядя на это, вы думаете, я могу сделать больше улучшений?

free -m
             total       used       free     shared    buffers     cached
Mem:           768        619        148          0          0         49
-/+ buffers/cache:        570        197
Swap:            0          0          0

НОВЫЙ ТЕСТ

В ящике VPS с 2 ГБ я теперь задал предпрок для

StartServers      20
MinSpareServers   20
MaxSpareServers   20
ServerLimit  256
MaxClients   256
MaxRequestsPerChild  4000

Сегодня утром мой сервер memcache умер от

Nov 20 09:28:40 vps22899094 kernel: Out of memory: Kill process 12517 (memcached) score 81 or sacrifice child
Nov 20 09:28:40 vps22899094 kernel: Killed process 12517, UID 497, (memcached) total-vm:565252kB, anon-rss:42940kB, file-rss:44kB

Для чего нужно установить оптимальные значения в apache?

#/и т.д. /sysconfig/Memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"

/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

bind-address=127.0.0.1

#script
thread_concurrency=2
query_cache_size = 16M
query_cache_type=1
query_cache_limit=5M

# MyISAM #
#key-buffer-size                = 32M
#myisam-recover                 = FORCE,BACKUP

# SAFETY #
#max-allowed-packet             = 16M
#max-connect-errors             = 1000000

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
#query-cache-type               = 0
#query-cache-size               = 0
max-connections                = 50
thread-cache-size              = 16
#open-files-limit               = 65535
#table-definition-cache         = 1024
#table-open-cache               = 2048

# INNODB #
#innodb-flush-method            = O_DIRECT
#innodb-log-files-in-group      = 2
#innodb-log-file-size           = 5M
#innodb-flush-log-at-trx-commit = 1
#innodb-file-per-table          = 1
#innodb-buffer-pool-size        = 921M
# LOGGING #
log-error                      = /var/log/mysqld.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /var/log/mysqld-slow.log

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
4b9b3361

Ответ 1

При использовании Apache с mod_php apache применяется в режиме prefork, а не worker. Поскольку, даже если известно, что php5 поддерживает многопоточность, также известно, что некоторые библиотеки php5 не очень хорошо работают в многопоточных средах (поэтому, например, у вас будет вызов локали на один поток, изменяющий языковой стандарт на другие потоки php).

Итак, если php не работает в cgi, как с php-fpm, у вас есть mod_php внутри apache и apache в режиме предпродак. В ваших тестах вы просто прокомментировали настройки предпродажной программы и увеличили параметры рабочего стола, то, что у вас сейчас есть, - это значения по умолчанию для параметров предкара и некоторые измененные значения для общих:

StartServers       20
MinSpareServers    5
MaxSpareServers    10
MaxClients         1024
MaxRequestsPerChild  0

Это означает, что вы попросите apache начать с процесса 20, но вы говорите ему, что если более 10 процессов ничего не делают, это должно уменьшить это число детей, чтобы оставаться от 5 до 10 доступных процессов. Скорость увеличения/уменьшения apache составляет 1 минуту. Так что скоро вы вернетесь в классическую ситуацию, когда у вас довольно небольшое количество бесплатных апах-процессов (в среднем 2). Среднее значение низкое, потому что обычно у вас есть что-то вроде 5 доступных процессов, но как только растет трафик, все они используются, поэтому нет процесса, поскольку apache очень медленно создает новые вилки. Это, безусловно, усиливается тем фактом, что ваши PHP-запросы кажутся довольно длинными, они не заканчиваются раньше, и вилки Apache не выпущены достаточно скоро, чтобы обрабатывать другой запрос.

Посмотрите на последнем графике небольшое количество зеленого цвета перед красным пиком? Если вы можете нарисовать это на 1 минуте, а не на 5 минут, вы увидите, что эта зеленая сумма не была достаточно большой, чтобы принимать входящий трафик без сообщения об ошибке.

Теперь вы устанавливаете 1024 MaxClients. Я думаю, что график кактусов не будет принят после этой модификации конфигурации, потому что с такой модификацией, когда больше не будет процесса, apache будет продолжать разблокировать новых детей с ограничением 1024 занятых детей. Возьмите что-то вроде 20 МБ ОЗУ на одного ребенка (или, может быть, у вас есть большой memory_limit в PHP и позволяет что-то вроде 64 МБ или 256 МБ, а тезисы PHP-запросов действительно используют больше ОЗУ), возможно, сервер БД... ваш сервер сейчас замедляется, потому что у вас всего 768 МБ ОЗУ. Возможно, когда apache пытается инициировать первые 20 детей, вы уже достигли предела доступной RAM.

Итак. классический способ обработки, который заключается в проверке объема памяти, используемой вилкой apache (сделать некоторые верхние команды во время ее работы), а затем найти, сколько параллельных запросов вы можете обрабатывать с этим объемом ОЗУ (что означает, что параллельные дети apache в режим предварительного просмотра). Скажем, это 12, например. Поместите это число в настройки apache mpm таким образом:

<IfModule prefork.c>
  StartServers       12
  MinSpareServers    12
  MaxSpareServers    12
  MaxClients         12
  MaxRequestsPerChild  300
</IfModule>

Это означает, что вы не перемещаете число вилок при увеличении или уменьшении трафика, потому что вы всегда хотите использовать всю ОЗУ и быть готовыми к пиковым значениям трафика. 300 означает, что вы перерабатываете каждую вилку после 300 запросов, это лучше, чем 0, это означает, что у вас не будет потенциальных проблем с утечками памяти. MaxClients имеет значение 12 25 или 50, что более 12 для обработки очереди ListenBacklog, которая может вставлять некоторые запросы, вы можете взять большую очередь, но вы можете получить некоторые тайм-ауты, возможно, (удалены этот странный спутник, я не могу вспомнить, почему я сказал, что если поступит более 12 запросов, следующий будет помещен в очередь Backlog, но вы должны установить MaxClient на целевое количество процессов).

И да, это означает, что вы не можете обрабатывать более 12 параллельных запросов.

Если вы хотите обрабатывать больше запросов:

  • купите еще оперативную память
  • попробуйте использовать apache в рабочем режиме, но удалите mod_php и используйте php в качестве параллельного демона с его собственными настройками пула (это называется php-fpm), подключитесь это с fastcgi. Обратите внимание, что вам, безусловно, нужно будет купить некоторую ОЗУ, чтобы обеспечить большое количество параллельных процессов php-fpm, но, возможно, меньше, чем с mod_php
  • Сократить время, затрачиваемое на ваш php-процесс. На ваших графиках кактусов вы сталкиваетесь с потенциальными проблемами: реальный пик трафика около 11: 25-11: 30 или некоторый код php становится очень медленным. Быстрые запросы уменьшают количество параллельных запросов.

Если ваша проблема - это действительно пики трафика, решения могут быть доступны с кэшами, такими как сервер прокси-кэш. Если проблема является случайной медлительностью в PHP, то... это проблема приложения, например, вы делаете HTTP-запрос на другой сайт с PHP?

И, наконец, как заявил @Jan Vlcinsky, вы можете попробовать nginx, где php будет доступен только как php-fpm. Если вы не можете купить ОЗУ и должны обрабатывать большой трафик, который окончательно выдержал тест.

Обновление: внутренние фиктивные соединения (если это ваша проблема, но, возможно, нет).

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

Если у вас нет простого базового "Это работает", то по умолчанию Virtualhost предотвращает запросы этих приложений в вашем приложении некоторыми перезаписями:

  RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
  RewriteRule .* - [F,L]

Update:

Наличие только одного Virtualhost не защищает вас от внутренних фиктивных подключений, это худшее, теперь вы уверены, что эти соединения выполняются на вашем уникальном Virtualhost. Поэтому вы должны действительно избегать побочных эффектов для своего приложения, используя правила перезаписи.

Читая вашу тактическую графику, кажется, что ваш apache не находится в режиме предпродажного режима в рабочем режиме. Запустите httpd -l или apache2 -l на debian и проверьте, есть ли у вас рабочий .c или prefork.c. Если вы находитесь в рабочем режиме, вы можете столкнуться с некоторыми проблемами PHP в своем приложении, но вы должны проверить настройки рабочего, вот пример:

<IfModule worker.c>
  StartServers           3
  MaxClients           500
  MinSpareThreads       75
  MaxSpareThreads      250 
  ThreadsPerChild       25
  MaxRequestsPerChild  300
</IfModule>

Вы запускаете 3 процесса, каждый из которых содержит 25 потоков (так что по умолчанию равно 3 * 25 = 75 параллельных запросов), вы позволяете 75 нитям ничего не делать, как только используется один поток, новый процесс разворачивается, добавляя еще 25 потоков, И когда у вас более 250 нитей, ничего не делающих (10 процессов), какой-то процесс убит. Вы должны настроить эти настройки в своей памяти. Здесь вы допускаете 500 параллельных процессов (20 процессов из 25 потоков). Ваше использование может быть больше:

<IfModule worker.c>
  StartServers           2
  MaxClients           250
  MinSpareThreads       50
  MaxSpareThreads      150 
  ThreadsPerChild       25
  MaxRequestsPerChild  300
</IfModule>

Ответ 2

Ниже приведен подход, который мог бы решить вашу проблему, а если не помог бы устранить неполадки.

  • Создайте второй виртуальный сервер Apache, идентичный текущему.

  • Отправлять весь "нормальный" пользовательский трафик на исходный виртуальный сервер

  • Отправить специальный или длительный трафик на новый виртуальный сервер

Специальный или долговременный трафик может представлять собой генерацию отчетов, операции обслуживания или что-либо еще, чего вы не ожидаете завершить в < 1 < 1 секунда. Это может случиться для обслуживания API, а не только для веб-страниц.

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

Ответ 3

Вы рассматривали использование nginx (или другого веб-сервера, основанного на событиях) вместо apache?

nginx должен обеспечивать большее количество соединений и потреблять гораздо меньше ресурсов (поскольку он основан на событиях и не создает отдельный процесс для каждого соединения). Во всяком случае, вам понадобятся некоторые процессы, выполняющие реальную работу (например, WSGI-серверы или так), и если они останутся на том же сервере, что и веб-сервер с интерфейсом, вы просто переместите проблему производительности в другое место.

Последняя версия apache должна разрешить аналогичное решение (настройте его на основе событий), но это не моя область знаний.

Ответ 4

Я рекомендую использовать приведенную ниже формулу для Apache:

MaxClients = (общая оперативная память - ОЗУ для ОС - ОЗУ для внешних программ)/(ОЗУ на каждый процесс httpd)

Найдите мой script здесь, который работает на Rhel 6.7. вы можете внести изменения в соответствии с вашей ОС.

#!/bin/bash

echo "HostName=`hostname`"

#Formula
#MaxClients . (RAM - size_all_other_processes)/(size_apache_process)
total_httpd_processes_size=`ps -ylC httpd --sort:rss | awk '{ sum += $9 } END { print sum }'`
#echo "total_httpd_processes_size=$total_httpd_processes_size"
total_http_processes_count=`ps -ylC httpd --sort:rss | wc -l`
echo "total_http_processes_count=$total_http_processes_count"
AVG_httpd_process_size=$(expr $total_httpd_processes_size / $total_http_processes_count)
echo "AVG_httpd_process_size=$AVG_httpd_process_size"
total_httpd_process_size_MB=$(expr $AVG_httpd_process_size / 1024)
echo "total_httpd_process_size_MB=$total_httpd_process_size_MB"
total_pttpd_used_size=$(expr $total_httpd_processes_size / 1024)
echo "total_pttpd_used_size=$total_pttpd_used_size"
total_RAM_size=`free -m |grep Mem |awk '{print $2}'`
echo "total_RAM_size=$total_RAM_size"
total_used_size=`free -m |grep Mem |awk '{print $3}'`
echo "total_used_size=$total_used_size"
size_all_other_processes=$(expr $total_used_size - $total_pttpd_used_size)
echo "size_all_other_processes=$size_all_other_processes"
remaining_memory=$(($total_RAM_size - $size_all_other_processes))
echo "remaining_memory=$remaining_memory"
MaxClients=$((($total_RAM_size - $size_all_other_processes) / $total_httpd_process_size_MB))
echo "MaxClients=$MaxClients"
exit