Я потратил неделю или две, исследуя и настраивая свой сервер для запуска Apache с Worker MPM и FCID. Я пытаюсь оптимизировать его, чтобы обеспечить максимально возможное количество одновременных подключений. Было кошмаром найти хорошую информацию о Worker 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
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql #skip-innodb connect_timeout = 10 max_connections = 300 symbolic-links=0 innodb_file_per_table = 1 myisam_sort_buffer_size = 8M read_rnd_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K sort_buffer_size = 512K table_cache = 32 max_allowed_packet = 1M key_buffer = 16k query_cache_type = 1 query-cache-size = 32M thread_cache_size = 16 net_buffer_length = 2K thread_stack = 256K wait_timeout = 300 slow_query_log #log-slow-queries=/var/log/mysql/slow-queries.log slow_query_log=/var/log/mysql/slow-queries.log long_query_time = 1 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
И PHP memory_limit = 64M
Все эти настройки связаны с балансом, насколько высоко вы можете их получить, не рискуя исчерпать память и сбой сервера или не убивая ваши процессы родительским vps, что, возможно, именно поэтому вы получаете SegFaults.
Обычно, когда я оптимизирую сервер, я запускаю сценарий mysql tuning-primer.sh, чтобы получить представление о том, сколько памяти может использовать MySQL при максимальной загрузке:
https://launchpad.net/mysql-tuning-primer
Затем для prefork я бы умножил MaxClients на php memory_limit, чтобы получить представление о том, сколько памяти Apache + PHP может использовать на максимуме. Это приблизительные оценки, но как только вы проделаете это много, вы как бы почувствуете это.
Я стараюсь, чтобы общее количество этих 2 соответствовало максимальному объему памяти сервера, если на вашем VPS нет раздела подкачки, я бы определенно постарался сохранить его ниже, чем максимальный объем оперативной памяти по нескольким причинам:
1) Остальные процессы на сервере будут использовать память
2) Некоторые сценарии php на сервере могут использовать ini_set для изменения memory_limit для себя.
Если вы можете предоставить /etc/my.cnf и php memory_limit, я могу предложить вам несколько хороших настроек.
edit: Я просто хотел упомянуть, что знаю, что вы используете worker, а не prefork, применяются те же концепции, но worker должен иметь дело с потоками, а не только с MaxClients, поэтому prefork был лучшим примером. Я должен был бы изучить настройки после получения запрашиваемой информации, чтобы дать вам хороший совет