Почему java availableProcessors API постоянно меняется в течение одного запуска? - PullRequest
0 голосов
/ 29 июня 2018

Я использую Runtime.getRuntime.availableProcessors() для создания пула потоков. В нашем собственном физическом центре обработки данных он возвращал число процессоров, равное 8, и никогда не менялось. Затем каждый раз, когда поступает запрос (интенсивно использующий данные), мы разделяем данные с помощью одного и того же API availableProcessors, и каждый поток этого пула потоков обрабатывает один из этих разделов.

Однако в последнее время мы переключаемся на AWS (и Docker в качестве контейнера), и каждый раз, когда приходит запрос (с интенсивным использованием данных), и он хочет разделить данные и, следовательно, вызывает этот API, он возвращает другое число. Пример:

Количество используемых разделов: [X = 12] [Y = 15] [Z = 12] [W = 5] [Q = 15] [P = 3]

Это не хорошо. Что если в момент создания пула потоков число доступных процессоров равно 3, а при поступлении запроса и разбиении данных - 15.

Я знаю, что в документации API написано:

Возвращает количество процессоров, доступных для виртуальной машины Java.

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

Но мои вопросы

  1. почему он раньше не изменялся (всегда возвращая 8) и почему он так сильно меняется в AWS, и если есть способ это исправить?
  2. Если нет способа исправить это, как я могу изменить приложение, чтобы убедиться, что пул потоков и разделы совместимы?

Спасибо

...