Size: a a a

Kubernetes — русскоговорящее сообщество

2021 March 29

EA

Evgeniy Abramov in Kubernetes — русскоговорящее сообщество
Pavel Kolobaev
допустим 80 ядер на ноде.
го шедулер породит 80 шедулеов рутин если не сказать gomaxproc
и на этих 80 шедулераш будут пораждаться горутины а у контейнера крышечка 2 или 3 CPU
во ти выходит что все эти 80 шедулево толкаются в пределах времени 2 или 3 cpu да еще и с включеной нумой.
На счет NUMA можно подробнее, это архитектура проца, как может быть она включена?
источник

EA

Evgeniy Abramov in Kubernetes — русскоговорящее сообщество
Ага спасибо, изучаю
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
https://gist.github.com/bobrik/2030ff040fad360327a5fab7a09c4ff1 вот исходная статья про баг
источник

PK

Pavel Kolobaev in Kubernetes — русскоговорящее сообщество
при включеной нуме процессы свободно переезжают из одного сокета на другой, а значит нужно еще и паять доставать с другого проца а это такты, которые могли быть потрачены на расчеты.
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
Evgeniy Abramov
4.19.0-10-amd64 #1 SMP Debian 4.19.132-1 (2020-07-24) x86_64 GNU/Linux
Или норм ядро без бага, чет не могу понять по переписке:) попробуй сделать эксперимент что в гисте был :)
источник

EA

Evgeniy Abramov in Kubernetes — русскоговорящее сообщество
Pavel Kolobaev
при включеной нуме процессы свободно переезжают из одного сокета на другой, а значит нужно еще и паять доставать с другого проца а это такты, которые могли быть потрачены на расчеты.
Да у моего EPYC AMD два сокета, вполне допускаю что может быть контейнер запущен так что лимитов 8 и 4 с одного сокета 4 с другого, если вы про это.
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
George Gaál
Но оно же не тупое и должно уметь считывать лимиты на кпу
https://github.com/golang/go/issues/33803 вроде пока ещё тупое :)
источник

PK

Pavel Kolobaev in Kubernetes — русскоговорящее сообщество
лимиты в контейнерах (не пинниг) ограничивают потребление по времени, а не по конкретному процу
допустим одно ядро 1000Mhz (типа CPU limut = 1). допустм 80 ядер итого 80 времени на сервер. кружечка 2
т.е. процее поработает 0.025  на каждом из ядер и это при справедливом шедуленге и отсутствии накладных расходов (а это всегда не так).
+ если лимиты и реквесты разные будет еще веселее.
источник

PK

Pavel Kolobaev in Kubernetes — русскоговорящее сообщество
При большом количетве процессов там sy будет афигеть какой большой.
кстати есть возможность показть из top строку с us sy  ni и т.д.
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
Для простого понимания ещё, горутины исполняются в thread pool размером gomaxproc, поэтому это важно реально, если есть лимиты небольшие/много ядер/много горутин
источник

DS

Dmitry Sergeev in Kubernetes — русскоговорящее сообщество
Pavel Kolobaev
лимиты в контейнерах (не пинниг) ограничивают потребление по времени, а не по конкретному процу
допустим одно ядро 1000Mhz (типа CPU limut = 1). допустм 80 ядер итого 80 времени на сервер. кружечка 2
т.е. процее поработает 0.025  на каждом из ядер и это при справедливом шедуленге и отсутствии накладных расходов (а это всегда не так).
+ если лимиты и реквесты разные будет еще веселее.
> если лимиты и реквесты разные будет еще веселее
Ну реквесты это же ваще cpu.shares, то есть вес. Поэтому приравнивание реквестов и лимитов от тротлинга не спасет
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
источник

PK

Pavel Kolobaev in Kubernetes — русскоговорящее сообщество
да не спасет. но и считать почему оно теперь так себя ведет становится сложнее, приходится добавлять в систему расчетов еще и вес процесса.
у Столярова есть на эту тему хороший ролик.
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
Вот хорошие две картинки
источник

EA

Evgeniy Abramov in Kubernetes — русскоговорящее сообщество
Pavel Kolobaev
При большом количетве процессов там sy будет афигеть какой большой.
кстати есть возможность показть из top строку с us sy  ni и т.д.
Да есть
источник

EA

Evgeniy Abramov in Kubernetes — русскоговорящее сообщество
Dmitry Sergeev
> если лимиты и реквесты разные будет еще веселее
Ну реквесты это же ваще cpu.shares, то есть вес. Поэтому приравнивание реквестов и лимитов от тротлинга не спасет
Подтверждаю, хотя разработчик меня убеждал в обратном, мол его приложение лучше будет работь если limits=requests. Проверили и я ему показал что от тротлинга оно не спасло.
источник

DS

Dmitry Sergeev in Kubernetes — русскоговорящее сообщество
Pavel Kolobaev
лимиты в контейнерах (не пинниг) ограничивают потребление по времени, а не по конкретному процу
допустим одно ядро 1000Mhz (типа CPU limut = 1). допустм 80 ядер итого 80 времени на сервер. кружечка 2
т.е. процее поработает 0.025  на каждом из ядер и это при справедливом шедуленге и отсутствии накладных расходов (а это всегда не так).
+ если лимиты и реквесты разные будет еще веселее.
на той же ноде с 80 ядрами, допустим если она пустая и там только наш под. Мы дали реквестов  и лимитов 1000m. То есть 1024 cpu shares  и cfs_quota_us / cfs_period_us = 1.

Допустим там еще kubelet и 20 системных процессов также имеют cpu shares по 1024 (умолчание)
В итоге все эти 80 ядер будут разделены между  20 системными процессами и нашим подиком на равные части. То есть каждому процессу дадут условно  ~ 3 ядра (80 / ~20) в попугаях и нашему поду в том числе.  При этом мы ограничили  лимит на 1000m (cfs_quota_us / cfs_period_us = 1). В итоге ядро будет тротлить наш подик только в путь, поскольку по cpu.shares он может кушать 3 ядра, а вот квота ему этого не будет давать делать
источник

S

Sergey in Kubernetes — русскоговорящее сообщество
Вообще лимиты это скользкая тема, надо много тестить и понимать как это работает, tail latency все дела
источник

c

corsars in Kubernetes — русскоговорящее сообщество
Sergey
Вообще лимиты это скользкая тема, надо много тестить и понимать как это работает, tail latency все дела
если бы они еще и работали по CPU особенно. Просто если форки наплодятся то тут пиши пропало
источник

PK

Pavel Kolobaev in Kubernetes — русскоговорящее сообщество
Dmitry Sergeev
на той же ноде с 80 ядрами, допустим если она пустая и там только наш под. Мы дали реквестов  и лимитов 1000m. То есть 1024 cpu shares  и cfs_quota_us / cfs_period_us = 1.

Допустим там еще kubelet и 20 системных процессов также имеют cpu shares по 1024 (умолчание)
В итоге все эти 80 ядер будут разделены между  20 системными процессами и нашим подиком на равные части. То есть каждому процессу дадут условно  ~ 3 ядра (80 / ~20) в попугаях и нашему поду в том числе.  При этом мы ограничили  лимит на 1000m (cfs_quota_us / cfs_period_us = 1). В итоге ядро будет тротлить наш подик только в путь, поскольку по cpu.shares он может кушать 3 ядра, а вот квота ему этого не будет давать делать
Я полностью согласен. У меня это еще более наглядно обычно, еще и сетевой трафик 1-10 гигабати и та еще и стевухи отжирают cpu через IRQ
источник