Я пытаюсь использовать JMX для определения того, как долго длился вызов метода, и сколько это было времени процессора, сколько было заблокировано нить и сколько ожидало. В идеале я бы ожидал, что время процессора + время блокировки + время ожидания = время на стене, но я заметил, что это не тот случай - и это не просто слегка неточный таймер. Например:JMX: CPU + Blocked + Wait time = Wall time?
Wall time: 5657.305 ms
CPU time: 4060.000 ms (71.77%)
User time: 3840.000 ms (67.88%)
Block time: 0.000 ms (0.00%)
Wait time: 0.000 ms (0.00%)
Итак, вопрос ... мое предположение, что сумма этих времен (не время пользователя, который включен во времени CPU) должен дать стене время не так? Я что-то упускаю?
Некоторых подробности:
Стен Время: разница
System.currentTimeMillis()
на входе методы и выходе времяЦП: разность
ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()
на входе методы и выходеБлок и время ожидания: аналогично процессору, с
ManagementFactory.getThreadMXBean().getThreadInfo(Thread.currentThread().getId()).getBlockedTime()
иgetWaitedTime()
Да, я знаю, что эти методы возвращают время в разных единицах (ns/ms), я принимаю это во внимание.
Приложение очень гиперпоточное (4000+ потоков), но я сохраняю всю информацию в потоке, поэтому не должно быть быть любой помехой между вызовами из разных потоков.
Я думал, что это может быть этот случай ... можете ли вы (или кто-либо еще) связать любой источник, который может поддержать это? (и «этим» я имею в виду, что «нить не работает, не блокируется и не ждет, когда она может работать, но не предоставляется время на ядре процессора для запуска») – Sethiel
@Sethiel: я отредактировал ответ, чтобы включить некоторые детали реализации, которые может помочь. Вы должны быть в состоянии доказать, что создавая потоки, которые потребляют процессор, но не используют синхронизацию или другие функции блокировки/ожидания. Общее количество потоков должно быть больше, чем количество ядер ЦП системы. Назначьте самый низкий приоритет одному из потоков. Это время процессора должно быть намного медленнее, чем другие, потому что оно было запланировано реже.Тем не менее, все потоки должны находиться в состоянии 'RUNNING' все время. – nif