Все происходит в докер контейнере. Если сделать запрос к докеру /containers/.../top\?ps_args='u'
, то будет 7 гигабайт для первого процеса и поменьше для всех остальных, а если сделать /containers/.../stats
, то будет 1.32 гигабайта по всей системе. Открыл баш в работающем контейнере и вижу ту самую картину:
~ $ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
2192117760
~ $ cat /sys/fs/cgroup/memory/memory.stat | grep cache
cache 830414848
total_cache 830414848
~ $ cat /sys/fs/cgroup/memory/memory.kmem.usage_in_bytes
55189504
Собственно, 2192117760+55189504-830414848=1416892416=1.32GiB - это cgroups показывает память по всей системе. Даже если не отнимать кэш, все равно выходит 2 гигабайта.
~ $ ps -opid,rss,vsz
PID RSS VSZ
1 7.0g 39g
29 361m 369m
42 1128 1628
144 1184 1628
155 4 1548
~ $ cat /proc/1/statm
10245369 1836008 1604370 5767 0 238744 0
Но ps показывает 7.0g уже для первого процесса. /proc показывает тоже самое, 1836008 * 4096 = 7520288768 = 7.0GiB. Похоже что ps берет данные с /proc.
Для контейнеров с другим софтом такой проблемы нет, сумма вывода ps совпадает с данными cgroups.
Может причина в том, что виртуальной памяти 39g потрачено, но таблицы страниц занимают в 512 раз меньше, то есть 80 мегабайт и погоды не сделают.
Вопрос в том, что я пропустил? Что бы такого еще посчитать, чтобы сошлись объемы?