Назад | Перейти на главную страницу

vmstat -f показывает большое количество вилок

У меня есть производственный сервер, который показывает очень большое количество вилок при запуске 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 не разветвляется, он только запускает потоки, но не для каждого запроса, он использует пул.