Выпала участь администрировать сервер на VPS. Когда приваливает народу на форум, nginx выдает ошибку "internal server error". Мысли две: 1) Достигнуто предельное количество процессов php, nginx не может "выудить" новый поток и дает ошибку 2) Не хватает ресурсов, чтобы открыть новый поток и ngnix выдает ошибку Но как определить - ума не приложу. Когда натыкаюсь на ошибку сам, нет времени на выяснения. Но скажу сразу, в такие моменты обычно бывает 70 человек онлайн на форуме SMF. Сервер с 512 мб памяти и 600 МГЦ. Подскажите, что делать? В технических характеристиках хостинга: Судя по всему, так и есть, достигается предельное количество.
От nginx access лог оказался весомым - 2 Гб. Остальных не обнаружено. А что делать, чтобы такой размер не допускать?
1. Отключить, если не нужен (убрать эту строчку из конфига) 2. Ротировать каким-нибудь logrotate Но ошибки в error_log, а не в access
Да, пардон, не сообразил. Честно говоря, в логе ошибок не знаю, что искать (там файл на 130 мегабайт). Попробовал по thread, выдало вот что: 2009/07/17 10:59:33 [alert] 23808#0: *3191231 socket() failed (105: No buffer space available) while connecting to upstream, client: 83.236.199.98, server: site.ru, URL: "/forum/index.php?topic=9957.msg1052209277", upstream: "http://127.0.0.1:8082/forum/index.php?topic=9957.msg1052209277", host: "site.ru", referrer: "http://board.muse.mu/showthread.php?t=63122&page=387" 2009/07/17 10:59:37 [error] 23808#0: *3191106 upstream prematurely closed connection while reading response header from upstream, client: 84.208.133.4, server: site.ru, URL: "/forum/index.php?topic=9957.1100", upstream: "http://127.0.0.1:8082/forum/index.php?topic=9957.1100", host: "site.ru", referrer: "http://board.muse.mu/showthread.php?t=63122&page=388" 2009/07/17 10:59:41 [error] 23808#0: *3191205 upstream prematurely closed connection while reading response header from upstream, client: 84.250.92.154, server: site.ru, URL: "/forum/index.php?topic=9957.1100", upstream: "http://127.0.0.1:8082/forum/index.php?topic=9957.1100", host: "site.ru", referrer: "http://board.muse.mu/showthread.php?t=63122&page=388" 2009/07/17 10:59:43 [error] 23808#0: *3190890 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 24.46.40.98, server: site.ru, URL: "/forum/index.php?topic=9957.msg1052209277", upstream: "http://127.0.0.1:8082/forum/index.php?topic=9957.msg1052209277", host: "site.ru", referrer: "http://board.muse.mu/showthread.php?t=63122&page=387"
105: No buffer space available В количество сокетов упирается, да... Или лимит по сокетам или нехватка памяти
Оперативки 512 мегов, а сокетов всего 120. В общем хостинг нужно менять... Код (Text): uid resource held maxheld barrier limit failcnt 3009: kmemsize 2944777 6944912 8388608 8388608 0 lockedpages 0 5 256 256 0 privvmpages 56921 101663 131072 131072 0 shmpages 658 994 32768 32768 0 dummy 0 0 0 0 0 numproc 37 90 100 100 0 physpages 30428 59806 0 2147483647 0 vmguarpages 0 0 131072 2147483647 0 oomguarpages 35506 64885 131072 2147483647 0 numtcpsock 42 120 120 120 289635 numflock 4 9 256 256 0 numpty 1 1 32 32 0 numsiginfo 1 6 256 256 0 tcpsndbuf 61644 512620 478932 786432 18594219 tcprcvbuf 0 812160 478932 786432 2353 othersockbuf 22200 291788 478932 786432 7 dgramrcvbuf 0 19120 132096 132096 0 numothersock 20 70 120 120 401 dcachesize 220304 308538 1048576 1048576 0 numfile 1133 1541 4096 4096 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 numiptent 10 10 32 32 0 Вижу почти 300 000 неудавшихся подключений
Каждое соединение это 2 сокета. 2 для nginx - 1 для TCP/IP соединения, второй для соединения с Apache 2+ для Apache - входящий запрос от nginx, соединение с базой данных + любое другое соедниение (cURL, file_get_contents по HTTP, memcached). Вот и считайте Может просто для TCP/IP и Unix socket буфера слишком маленькие стоят? Их можно увеличить в /proc/sys/net/ipv4/{tcp_wmem,tcp_rmem}
Код (Text): /proc/sys/net/ipv4/tcp_wmem :::::::::::::: 4096 16384 655360 :::::::::::::: /proc/sys/net/ipv4/tcp_rmem :::::::::::::: 4096 87380 655360 Ну да, сокетов 100% не хватает. По сути дела, на одного пользователя используется от 4 сокетов. То есть, одновременно может обратиться к серверу всего 30 человек. Если бы сокетов было в два раза больше, то не хватало бы процессов?
Нашел статью по сокетам http://www.opennet.ru/base/net/tcp_tune.txt.html Посчитал, по формулам у меня размер буфера выходит 128 Кб. Только не понял, какое именно значение (максимальное?)
Да буфера могут влиять на производительность, но вряд ли фатально мешать. Упираетесь в сокеты... maxheld у numtcpsock 120 и правда малавато. Как бороться? Ну для начала посмотреть, что кроме веба юзает сокеты.. если есть почта - гасить ее. В nginx попробуйте поставить меньше таймауты и keepalive маленький - коннекты будут освобождаться "быстрее". Кешируйте контент, что бы меньше коннектов на бекенд делать. Но это все временно, советую поговорить с техподдержкой по поводу увеличение этого значения.
Ну у нас форум SMF. Средняя генерация страницы которого, где-то 0.2с с мемкэшем. Выход один - купить больше ресурсов