Получение отладочной информации от исполнителя пула потоков Java - PullRequest
0 голосов
/ 15 сентября 2018

У меня довольно сложная часть программного обеспечения, которая интенсивно использует многопоточность для вычисления финансовых тиковых фидов, и ближе к концу моей рыночной сессии моя очередь пула потоков начинает увеличиваться и увеличиваться до такой степени, что система больше не работает стабильный. Чтобы решить эту проблему, мне нужно получить больше данных о том, сколько времени Runnable разных классов требуют для выполнения, или как-то помечать те, которые выполняются дольше, чем x секунд. Я также пытаюсь понять, не слишком ли я выделяю ядра для виртуальных машин на моих серверах, из-за чего JVM требуется некоторое время для получения ядра для выполнения потоков.

Отслеживать размер очереди довольно просто, но, получая эти другие метрики, я не вижу никаких API-интерфейсов в Java, которые сделали бы это возможным, любая помощь будет оценена, это мой последний главный блокировщик!

1 Ответ

0 голосов
/ 15 сентября 2018

Существует множество способов сделать это, используя много разных библиотек.Вы можете использовать какой-либо подход AOP или позволить Spring инструктировать ваши классы, использовать коммерческие решения и т. Д.

Если вы ищете простой подход, который вы могли бы реализовать вручную, тогда это один из них.

Вы можете создать подкласс java.util.concurrent.ThreadPoolExecutor и переопределить два метода:

protected void beforeExecute(Thread t, Runnable r) { }

и

protected void afterExecute(Runnable r, Throwable t) { }

Эти методы ничего не делают в их реализации по умолчанию, но какJavadoc говорит:

Метод, вызываемый до выполнения данного Runnable в данном потоке.Этот метод вызывается потоком {@code t}, который будет выполнять задачу {@code r}, и может использоваться для повторной инициализации ThreadLocals или для ведения журнала .

В этих методах вы можете собрать свою собственную информацию о времени для Runnables и записать их в файл.

...