2015-10-19 2 views
0

Мы широко используем Java ThreadPoolExecutor. В частности, мы следуем шаблону объединения fork, создавая список вызываемых вызовов и используя для них временный вариант invokeAll(). Мы используем только эти пулы потоков для выполнения операций ввода-вывода (без процессора), однако, глядя на дамп потока, мы видим, что эти конкретные потоки потребляют высокий процессор. Глядя на реализацию FutureTask.awaitDone(), я вижу, что в LockSupport.parkNanos() реализована стратегия занятости и ожидания с чередованием вызовов. Глядя на JavaDoc для самого parkNanos, я вижу, что этот комментарий «может возвращаться ложно ..», что заставляет меня задаться вопросом, вращается ли awaitDone() и в свою очередь вызывает высокий уровень ЦП. Любая помощь будет оценена!Значения CPU для FutureTask.awaitDone

+0

ли вы проверить активность процессора с профайлер? – lbalazscs

+0

Я плетю выходы jstack и top, используя этот метод, описанный здесь, чтобы найти соответствующие темы. http://www.boxjar.com/using-top-and-jstack-to-find-the-java-thread-that-is-hogging-the-cpu/ – RPJ

+0

Профилировщик предоставляет подробную информацию о режиме, а не только thread использует процессор, но также и тот метод. Существуют бесплатные профили Java, такие как VisualVm и «Java Mission Control». – lbalazscs

ответ

0

Я вижу этот комментарий "может вернуться поддельно .."

То же самое верно и для ReentrantLock и Condition#await. Одной из причин, по которым вы обычно связываете await или wait с петлей while, является из-за ложной природы подвески нити. Тем не менее, поскольку мы не беспокоимся о побочном пробуждении с Condition, вы также не должны беспокоиться об этом.

Это действительно вращение, но оно не занято. Первая петля обычно быстро сопровождается подвеской.

+0

Возможно ли, что park() «в основном преуспевает» в получении разрешения, потому что есть, скажем, много других одновременных неаккуратных потоков? – RPJ

+0

Кроме того, возможно ли, что много пробуждений, происходящих для вилки, вызывает высокий уровень ЦП? – RPJ

0

Я думаю, что awaitDone не «занят - подожди», потому что он вызывает parkNanos. parkNanos концептуально похож на Object.wait(): поток ожидает, но CPU может делать другие вещи тем временем. Бесконечный цикл существует из-за ложных пробуждений, но это проблема ОС, и они также не подразумевают ожидание оживленного ожидания.

Поток может потратить много времени на метод («настенные часы»), но это не обязательно время процессора. Моя рекомендация - использовать профилировщик, потому что они могут сделать это различие, и они могут помочь вам найти реальное узкое место процессора.

Похожие вопросы:

What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX?

Unsafe.park vs Object.wait

How can I Monitor cpu usage per thread of a java application in a linux multiprocessor environment?

Смежные вопросы