ли?
А если так, то почему следующие значения внутри контейнера и на хост машине различаются?
cat /sys/fs/cgroup/memory/memory.kmem.max_usage_in_bytes
cat /sys/fs/cgroup/memory/memory.kmem.slabinfo
cat /sys/fs/cgroup/memory/memory.kmem.usage_in_bytes
Ядро одно, но смотреть надо про сгрупсы. Потому что сгрупс - это про иерархию. В контейнере эти значения - "подиерархия" хостовой структуры сгрупсов. На хосте надо смотреть где-то тут: /sys/fs/cgroup/memory/docker/<container id> (это если у вас драйвер cgroupfs)
Понял! Верно ли я понимаю, что kmem.usage_in_bytes в главной сигруппе хоста - это сумма kmem.usage_in_bytes всех подгрупп, где могут быть контейнеры и что угодно?
Не совсем корректный вопрос, кмк. Но usage_in_bytes вышестоящей иерархии должен быть равен сумме usage_in_bytes нижестоящих. Проверить можно просто скриптом, и вы увидете так это или нет.
ага, понял! т.е. запись kmem.usage_in_bytes в корне сигруппы memory - это сумма всех "листов" этой иерархии? а в чём предыд. вопрос некорректен?
Не корректен "главной сигруппой хоста". Вы ведь для контейнеров и докердемона смотрите. Проверить, что это сумма вы можете через скрипт.
Ага, как раз сейчас пытаюсь проверить сумму пробежавшись по иерархии. Я смотрю использование памяти ядра для контейнера и для самого хоста. Ожидаю, что они будут иметь одинаковое значение. Ведь ядро одно на всех. Наверное, я ошибся когда сказал "главная сигруппа хоста". Есть корневая запись сигруппы и главный неймспейс сигрупп в хосте А почему значения использования памяти ядра в контейнере и на хосте разнятся?
1. Нет такого понятия "неймспейс сгруппы". Или я про такое не знаю. 2. Значения суммы могут отличаться от реальных значений вложенных иерархий, т.к. тут есть варианты, как собирать статистику из ядра. И тут явно не банальный getrusage. 3 Все подробности реализации надо смотреть либо тут: https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt либо тут: https://github.com/torvalds/linux/blob/master/kernel/cgroup/cgroup.c
неймспейс сигрупп вроде бы есть, вот тут он описан https://man7.org/linux/man-pages/man7/namespaces.7.html всего 8 типов неймспейсов кажется Cgroup IPC Network Mount PID Time User UTS
А, вот вы про что. Я думал что мы про понятие неймспейсов "внутри сгрупсов". Те неймспейсы, которые вы прислали - работают "выше" самих сигрупсов.
хех, не. сигруппы состоят из групп (видны в виде директорий в /sys/fs) а неймспейсы - это то, на что я выше дал ссылку теперь всё сходится?
Я не понял, что именно должно сойтись? Мы начинаем смешивать две разные абстракции: сигрупсы и неймспейсы.
Предлагаю их не смешивать, если нет надобности. Я сам не понимаю, нужно ли вообще говорить о неймспейсах в контексте этой беседы. Мне интересно значение memory.kmem.max_usage_in_bytes внутри контейнера и на хост системе взятое в обоих случаях из корня иерархии memory. Вопрос мой прост: почему они разные?
Cтоит уточнить - я считаю сходимость т.е. равна ли сумма memory.kmem.max_usage_in_bytes "листьев" иерархии memory использованию памяти под ядро на хосте Таким образом проверю догадку. Но что это даст - хз А отдельно взятый контейнер и хост, где он крутится, имеют разные значения. Это точно И тут вопрос. Почему? Ведь ядро одно на всех
не сойдется она на 100%. Потому, что ядро не предоставляет прям тот самый реал-тайм о котором вы мечтаете.
И вот вам из доки по сгрупсам: 5.5 usage_in_bytes For efficiency, as other kernel components, memory cgroup uses some optimization to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the method and doesn't show 'exact' value of memory (and swap) usage, it's a fuzz value for efficient access. (Of course, when necessary, it's synchronized.) If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) value in memory.stat(see 5.2).
ну если пару байт не сойдутся, это не беда, думаю ) кстати тут сказано Of course, when necessary, it's synchronized. Интересно, что значит necessary тут?
Полагаю, что это отсылка к mmu и линуксовому драйверу работы с ram
хорошо. выходит измерять эту "сходимость" не только не имеет смысла, но и вообще-то невозможно измерить : ) тогда остается вопрос, почему же всё-таки у них разные значения? наверное, когда мы изолируем процесс неймспейсами, каким-то образом контроллер памяти (не путать с железкой) тоже изолирован и видит только часть ядра отведенную под процесс?
Обсуждают сегодня