У меня есть производственный сервер, который показывает очень большое количество вилок при запуске vmstat -f
. Есть ли какие-либо предложения по шагам, которые можно было бы использовать для выяснения происхождения вилок?
vmstat -f 1
6650796 forks
РЕДАКТИРОВАТЬ:
[~]$ ./forks.sh
Forks in last 2 seconds: 20
Forks in last 2 seconds: 40
Forks in last 2 seconds: 58
Forks in last 2 seconds: 9
Forks in last 2 seconds: 6
Forks in last 2 seconds: 28
Forks in last 2 seconds: 8
Forks in last 2 seconds: 10
Forks in last 2 seconds: 15
Forks in last 2 seconds: 9
Согласно странице руководства, он включает все вызовы fork, vfork или clone. Последний из этих трех (клон) используется Java для реализации своих потоков.
Таким образом, каждый раз, когда ваш Java-сервер создает новый поток, это значение увеличивается.
Если это не будет глупо, все будет в порядке. Сколько в среднем вы видите в секунду?
Любой процесс, который порождает другой процесс, не завершая себя, является вилкой - например, каждая команда, выполняемая в оболочке, будет считаться вилкой. Очень большое количество вызовов fork, так как система загружается, совершенно нормально.
Прежде всего следует отметить, что запуск vmstat без двух аргументов времени показывает накопленное значение с момента последней перезагрузки. Вам придется запускать его несколько раз, чтобы получить число «вилок в секунду», чтобы увидеть, действительно ли это большое число. Что-то вроде этого (что, очевидно, можно было бы превратить в гораздо более дружелюбный сценарий):
g3 0 /home/jj33 ># while true
> do
> vmstat -f
> sleep 15
> done
278039 forks
278044 forks
278047 forks
278051 forks
Итак, эта система выполнила 5, 3 и 4 вилки за 3 15-секундных интервала, что, учитывая, что каждый вызов процесса в блоке * nix включает вилку, не кажется большим числом.
Большое количество форков на самом деле не проблема - я использую маршрутизатор на базе Gentoo уже несколько месяцев, и мое число форков вдвое больше вашего, но сама машина надежна.
dijkstra ~ # vmstat -f 1
14623947 forks
dijkstra ~ # uptime
15:29:26 up 291 days, 14:02, 1 user, load average: 0.02, 0.04, 0.07
Если вы подозреваете, что какой-то процесс (например, JVM) является причиной большого количества форков (2 / с - это не так много и не проблема), вы можете использовать strace / ltrace, чтобы увидеть, что он делает.
В частности, вилка также должна быть видна в учете процессов (большее влияние) с помощью команды accton. Но я не думаю, что это касается clone () для запуска потоков.
Если вы попадаете в диапазон 100 клонов в секунду, вам действительно стоит взглянуть на приложение.
BTW: относительно комментария выше (пока не могу его комментировать): Tomcat не разветвляется, он только запускает потоки, но не для каждого запроса, он использует пул.