1 ГБ VPS - Apache Worker MPM - FCGID - Максимальное количество одновременных подключений - RAM CAP

9

Я потратил неделю или две на исследование и настройку своего сервера для работы Apache с Worker MPM и FCID. Я пытаюсь оптимизировать его, чтобы обеспечить максимально возможное количество одновременных соединений. Это был кошмар, чтобы найти хорошую информацию о Рабочем MPM.

Сервер - VPS с 1 ГБ ОЗУ (при отключенном Apache, использующем только около 150 МБ ОЗУ), я бы хотел, чтобы Apache имел CAP использования памяти около 750 МБ, чтобы на моем сервере никогда не заканчивалось ОЗУ.

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

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

[Sat Mar 23 03:19:50 2013] [notice] child pid 28351 exit signal Segmentation fault (11)
[Sat Mar 23 03:56:20 2013] [notice] child pid 29740 exit signal Segmentation fault (11)
*** glibc detected *** /usr/sbin/httpd.worker: malloc(): memory corruption: 0xb83abdd8 ***

И некоторые ошибки нехватки памяти

Out of memory during array extend.

Это мои текущие настройки, я был бы очень признателен за некоторые советы.

Настройки Apache:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Spawn 2 child processes, spawning 25 threads for each child process.
# So, a pool of 50 threads is left up and sleeping, ready to serve incoming requests.
# If more requests will come in, apache will spawn new child processes, each one spawning 25 threads,
# enlarging the thread pool until the total number of threads become 50. In that case, apache begin
# to cleanly drop processes, trying to reach 25 threads.
# New processes and its threads are spawned in case of a large spike of requests, until 200 parallel
# client requests are reached, then apache will no longer accept new incoming connections.
# When the load calm down, and requests come back under 200 parallel connections, apache will continue
# to accept connections. After 25, 000 requests served by a child, q. 1000 per thread, the process
# get closed by the father to ensure no memory leak is fired.
<IfModule worker.c>
ServerLimit      16
StartServers         2
MaxClients       400
MinSpareThreads   25
MaxSpareThreads  50 
ThreadsPerChild    25
MaxRequestsPerChild  1000
ThreadLimit          64 
ThreadStackSize      1048576
</IfModule>
#####################

А потом некоторые настройки в fcgid.conf

FcgidMinProcessesPerClass 0 
FcgidMaxProcessesPerClass 8 
FcgidMaxProcesses  25
FcgidIdleTimeout 60 
FcgidProcessLifeTime 120 
FcgidIdleScanInterval 30

Как и просил мой вывод для /etc/my.cnf

[ТуздЫ]
каталогу_данных = / вар / Библиотека / MySQL
сокет = / вар / Библиотека / MySQL / mysql.sock
пользователь = MySQL

# Пропуском InnoDB

connect_timeout = 10
max_connections = 300
символические ссылки = 0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8 миллионов
read_rnd_buffer_size = 512 КБ
net_buffer_length = 8K
read_buffer_size = 256 КБ
sort_buffer_size = 512K
table_cache = 32
max_allowed_packet = 1M
key_buffer = 16 КБ
query_cache_type = 1
размер кеша запросов = 32M
thread_cache_size = 16
net_buffer_length = 2K
нить стека = 256 КБ
wait_timeout = 300

slow_query_log

# Лог-медленные запросы = / вар / Журнал / MySQL / медленно queries.log
slow_query_log = / вар / Журнал / MySQL / медленно queries.log
long_query_time = 1

[Mysqld_safe]
Журнал ошибок = / вар / Журнал / mysqld.log
PID-файл = / вар / Работа / туздЫ / mysqld.pid

И PHP memory_limit = 64M

user1287874
источник
Любые идеи кто-нибудь?
user1287874
1
Итак, из того, что у вас есть 1 ГБ, если Apache занимает 750 МБ, как вы думаете, какие еще 250 будут распределены? Это действительно важно ... Я спрашиваю, потому что 750 очень нереально и нездоровое ожидание. Из этого 1 ГБ реально, если вы хотите хорошо
работающую

Ответы:

0

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

Обычно, когда я оптимизирую сервер, я запускаю сценарий mysql tuning-primer.sh, чтобы получить представление о том, сколько памяти может максимально использовать MySQL:

https://launchpad.net/mysql-tuning-primer

Затем для prefork я бы умножил MaxClients на php memory_limit, чтобы получить представление о том, сколько памяти Apache + PHP может использовать при макс. Это приблизительные оценки, но как только вы это сделаете, вы почувствуете это.

Я пытаюсь сохранить общее количество этих двух в пределах максимальной памяти сервера, если ваш VPS не имеет раздела подкачки, я определенно постараюсь сохранить его ниже, чем max ram по нескольким причинам:

1) Другие процессы на сервере будут использовать память

2) Некоторые php-скрипты на сервере могут использовать ini_set для изменения memory_limit для себя.

Если вы можете предоставить /etc/my.cnf и php memory_limit, я могу предложить вам несколько хороших настроек.


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

Майкл Уайнленд
источник
Привет, Майкл, с тех пор я обновил свои настройки (после получения некоторых советов от людей), с тех пор я опустил Serverlimit до 8 Maxclients до 200 и FCGID до 10 - буду следить за этим и смотреть, как он будет работать. Я скоро опубликую результаты в оригинальном сообщении
user1287874
как скоро? апреля?
Эдди