Стручки Kubernetes получают разные ограничения процессора - PullRequest
1 голос
/ 06 ноября 2019

У нас есть несколько приложений в кластере Kubernetes, которые используют Apache Ignite. Ignite создает различные пулы потоков, которые имеют следующий размер:

Math.max(8, Runtime.getRuntime().availableProcessors())

Таким образом, в основном пул потоков всегда будет иметь размер не менее 8, но может быть больше, если система считает, что процессоров больше.

Проблема, с которой мы сталкиваемся, заключается в том, что некоторые модули работают с размером пула 8, а другие используют размер 36, то есть количество процессоров на узле.

Мы используем Helm для развертываниявсе приложения, но мы не устанавливаем любые ограничения ЦП для любых модулей. Теоретически все они должны видеть одинаковое количество доступных процессоров.

Что еще может заставить модули на одном и том же узле видеть разные представления о количестве доступных процессоров?

Обновление

У нас есть конечная точка работоспособности во всех наших приложениях, которая показывает количество CPUS, сообщаемое JVM, используя тот же метод Runtime#availableProcessors(), который использует Ignite.

Все наши приложения, включая приложения, в которых Igniteдумает, что есть 36 процессоров, сообщает 2 процессора, как только процесс начался.

Я нашел эту интересную строку в документации Java для этого метода:

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

Кажется, что мы находимся в состоянии состязания, когда в начале запуска приложения это значениесообщает 36, но в какой-то момент падает до 2. В зависимости от того, когда запускаются компоненты Ignite, они видят либо 36, либо 2.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

tl; dr Основная проблема, кажется, заключается в том, что resources.requests.cpu установлен точно на 1000m.

Я написал простое приложение Java, которое выводит доступное количество процессоров:

public class CpuTest {
  public static void main(String[] args) {
    System.out.println("Number of CPUs = " + Runtime.getRuntime().availableProcessors());   
  }
}

Я упаковал в Dockerfile и создал простое развертывание:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cputest
  labels:
    app: cputest
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cputest
  template:
    metadata:
      labels:
        app: cputest
    spec:
      containers:
      - name: cputest
        image: dev/cputest:latest
        imagePullPolicy: Never

Я запустил это на своей локальной машине RedHat 7, которая имеет 24 ядра. Ожидаемый результат:

Number of CPUs = 24

Затем я применил к развертыванию различные запросы ресурсов ЦП:

        resources:
          requests:
            cpu: 1000m

и повторно развернул. Результаты были интересны:

  • Запрос ЦП установлен на 500 м: приложение сообщает 1 ЦП
  • Запрос ЦП установлен на 1000 м: приложение сообщает 24 ЦП <== </li>
  • Запрос ЦП установлен на 1001 м: приложение сообщает 2 ЦП
  • Запрос ЦП установлен на 2000 м: приложение сообщает 2 ЦП
  • Запрос ЦП установлен на 4000 м: приложение сообщает4 CPU

Таким образом, проблема возникает только тогда, когда запрос CPU установлен 1000m (также попытался 1 и получил тот же результат, когда он думает, что имеет все 24 процессора).

Я вернулся и посмотрел на все наши приложения. Конечно же, те, в которых мы устанавливаем запрос ЦП равным 1000m, имеют проблему. Любое другое значение работает, как и ожидалось.

Интересно, что когда я также устанавливаю ограничение ЦП на 1000m, проблема исчезает, и JVM сообщает о 1 ЦП.

Вполне возможно, этоожидается, и я не до конца понимаю, как ресурсы и ограничения ЦП используются Kubernetes, или, возможно, проблема с версией, с которой мы работаем (1.12.7).

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

0 голосов
/ 06 ноября 2019

Очень странно. Они в одном и том же пространстве имен? Есть ли какая-либо quota или Limit range диаграмма управления или вы установили?

Кроме того, вы можете проверить пределы процессора, запустив kubectl get nodes -o custom-columns='NAME:metadata.name,CPU:status.capacity.cpu'?

...