Я использую 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.
Это значение может измениться во время определенного вызова виртуальной машины. Поэтому приложения, чувствительные к числу доступных процессоров, должны периодически опрашивать это свойство и соответствующим образом корректировать использование своих ресурсов.
Но мои вопросы
- почему он раньше не изменялся (всегда возвращая 8) и почему он так сильно меняется в AWS, и если есть способ это исправить?
- Если нет способа исправить это, как я могу изменить приложение, чтобы убедиться, что пул потоков и разделы совместимы?
Спасибо