Какое влияние CPU-Shares на потоки - PullRequest
0 голосов
/ 05 октября 2018

Мой вопрос больше на уровне потоков Java.Но, вероятно, это может быть более общим для потоков уровня ОС.

JAVA SPECIFIC: каково значение ThreadPool Tuning Size .(Формула)?Ударная характеристика и как она себя ведет под капотом, с контейнерами.(Я думаю, что могу понять наборы процессоров, но не ресурсы процессоров, я знаю, что такое процессоры ресурсов просто не понимал, как здесь работают потоки).

Итак, я читал статью о javaв контейнерах (что я наблюдал при запуске приложений в CloudFoundary), 3 и расширения , которые были внесены в JDK 10 для определения ограничений контейнера.

В упомянутой статье:

Давайте кратко рассмотрим, как JVM адаптируется к числу процессоров / ядер, доступных на узле, на котором он работает.На самом деле существует ряд параметров, которые по умолчанию инициализируются на основе количества ядер.Поэтому, если обычные значения по умолчанию для потоков GC, потоков JIT и т. Д. - это общее количество доступных «ядер».

Теперь, если

, то number_of_cpus () будетрассчитываться на основе cpu_shares () / 1024

Затем в сценарии, где, скажем, доля CPU составляет 512. Это вычисление даст 0. (Я тогда предполагаю, что значение будет округленодо 1 ??).Как это работает тогда?

1 Ответ

0 голосов
/ 05 октября 2018

Да, оно будет округлено до 1 .

Реализация находится под ./hotspot/os/linux/osContainer_linux.cpp и в основном выглядит следующим образом:

share_count = ceilf((float)share / (float)PER_CPU_SHARES);

, где PER_CPU_SHARES = 1024 и share в соответствии с вашим примером 512.Эта функция приведет к 1.

Я не совсем уверен, что правильно вас понял с вашими правками, но cpu-share имеет значение, когда несколько контейнеров, работающих в одной ОС, пытаются использовать 100% ЦП.Предположим, у вас есть 3 контейнера, один имеет 1024, два других имеют 512 cpu-share.Когда все 3 из них попытаются получить 100% процессорного времени, вот что произойдет: 50% времени уйдет на контейнер с 1024 акциями, остальные получат каждый25%;но опять же, это только когда процессор находится на 100%.

А теперь снова прочитайте этот JEP - он влияет только на потоки JIT / GC, а не на потоки вашего приложения;вы все равно можете создать множество потоков, как и в любой другой статье, - что бы ни говорила эта статья - она ​​все еще действительна, контейнер или нет.

...