Может ли ЗАБЛОКИРОВАННАЯ нить вызвать высокое потребление ресурсов процессора
Недавно мы столкнулись с проблемой высокой загрузки ЦП в нашей производственной среде и увидели что-то странное во время отладки. Когда я выполнил команду top -H, чтобы увидеть статистику ЦП для каждого идентификатора потока, я обнаружил, что поток Х потребляет высокую загрузку ЦП. Когда я взял дамп потока, я увидел, что этот поток X находился в состоянии BLOCKED. Что это значит, может ли поток, находящийся в состоянии BLOCKED, потреблять высокую загрузку процессора? Я думаю, что это может быть тривиальным вопросом, но я новичок в отладке проблем с производительностью и JVM, и не уверен, чего мне здесь не хватает.
2 ответа
Вход и выход из заблокированного состояния могут быть дорогими. Если вы заблокированы хотя бы на некоторое время, это не проблема, но если вы на короткое время блокируете в занятом цикле, ваш поток может казаться заблокированным, но на самом деле он сжигает процессор.
Я бы искал несколько потоков, постоянно конкурирующих на общих ресурсах, которые вводят BLOCKED очень быстро.
@Peter уже упомянул хороший момент об занятом цикле (который может быть внутренней адаптивной оптимизацией спин-блокировок JVM в случае синхронизации или занятого цикла, созданного самим приложением при некоторых условиях), который может сжечь процессор. Есть еще один косвенный способ, которым процессор может подняться очень высоко из-за блокировки потоков. Обычно на веб-сервере, если множество потоков находится в заблокированном состоянии (не из-за блокировки, связанной с блокировкой синхронизации, а, скажем, в ожидании ввода-вывода из внутреннего хранилища данных), это может оказать большое давление на сборку мусора JVM. Предполагается, что эти рабочие потоки быстро завершают свою работу, поэтому все объекты, созданные ими в куче, быстро освобождаются от ссылок и собирают мусор. Если в этом состоянии находится множество потоков, то потоки сборки мусора должны работать сверхурочно, и они могут в конечном итоге занять много ЦП.