LINUX.ORG.RU

Свободная и занятая память в Linux

 


0

3

Уже был этот вопрос, но спрошу ещё раз, потому что хоть убейте не понимаю:

Как цифры из /proc/meminfo преобразуются в цифры, которые выдаёт команда «free -k»

★★★★★

Последнее исправление: sunny1983 (всего исправлений: 2)

Ответ на: комментарий от seiken

Давай более развёрнуто:
1. Свободная память - это сумма Free+Cached+Buffers, потому как если какой-либо процесс запросит несколько страниц памяти, линукс ему её выдаст, забрав уменьшив дисковый кэш, та же ситуация с буферами.
2. Занятую память можно посчитать, вычев из полного объёма памяти свободную, но вот посчитать, просуммировав занятую память всех процессов не получится, так как занятая память каждым отдельным процессом включает в себя также и разделяемую память, и если просуммировать, то фактически просуммируешь одни и те же чиста несколько раз, то есть результат будет больше чем фактически занимаемая память.

А если считать в процентных долях? Есть некий процесс, который потребляет 13,5% памяти, при этом занятый объем, вычисленный по п.1 - 67,2%. Как понять куда делись оставшиеся 57,3? Другие процессы потребляют не более чем 0.1% каждый, так что на разделяемую память тут не спишешь

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 1)

Вывод free зависит от версии (до 3.3.10 или после): https://access.redhat.com/solutions/406773

Что касается процентов, то по какому показателю памяти (VSS,RSS,PSS,USS) они вычилялись? Посмотрите ″smem -t″, как строку для вашего процесса, так и сумму для столбца PSS, насколько сумма отличается от used.

mky ★★★★★
()
Ответ на: комментарий от mky

Вывод free зависит от версии (до 3.3.10 или после)

ядро 4.9.0

Что касается процентов, то по какому показателю памяти (VSS,RSS,PSS,USS) они вычилялись? Посмотрите ″smem -t″, как строку для вашего процесса, так и сумму для столбца PSS, насколько сумма отличается от used.

Для данного процесса PSS не сильно отличается от RSS. Процентное отношение PSS самого нагруженного процесса к Used составляет 20,6%

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Версия ядра не влияет. Вы мою ссылку смотрели, там ведь про версию команды free (точнее пакета procps-ng или sys-process/procps в gentoo) написано. Про то, что used в ″free -k″ считается по-разному в разных версиях. Одни версии выводят ″available″, а другие нет.

Для данного процесса PSS не сильно отличается от RSS.

А от VSS? Может у вас 13,5% насчитано по VSS.

Процентное отношение PSS самого нагруженного процесса к Used составляет 20,6%

А по остальным процессам, у вас же вопрос, почему сумма так сильно отличается от 67,2% или нет? И откуда взялось число 57,3? Что даёт ″smem -t″ в сумме PSS и что даёт ″free -k″ в used?

mky ★★★★★
()
Ответ на: комментарий от mky

Версия procps 3.3.12

По VSS если смотреть, то есть 2 процесса с большим VSS: 33,44% и 16,03%. PSS этих процессов - 12,9% и 0,11% соответственно.

Сумма столбца PSS из вывода «smem -t -p» - 16,2%

Отношение used к total из вывода «free -k» - 70,7%, неделю назад было 67,2%, память «течёт».

И да, я ещё глянул в «smem -w»:

Area                           Used      Cache   Noncache
firmware/hardware                 0          0          0
kernel image                      0          0          0
kernel dynamic memory      27162576    9217132   17945444
userspace memory            5555796      64716    5491080
free memory                  217708     217708          0
Такое большое значение kernel dynamic memory Noncache можно считать нормальным?

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от mky

Уже пробовал, в результате около 400 Мбайт памяти переходят из cached во free, used при этом не уменьшается, при этом резко возрастают дисковые операции, через 10 минут всё возвращается обратно.
Ну у меня тоже есть предположение, что в ядре, вопрос где именно и что с этим делать

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Свободная MemFree - не занята ничем.

Доступная MemAvailable -

              Estimation of how much memory is available for starting
              new applications, without swapping. Unlike the data
              provided by the cache or free fields, this field takes
              into account page cache and also that not all reclaimable
              memory slabs will be reclaimed due to items being in use
              (MemAvailable in /proc/meminfo, available on kernels 3.14,
              emulated on kernels 2.6.27+, otherwise the same as free)

Занятая - смортря чем. Только приложениями? С учетом кэшей или без? с учетом ядерных резервов или без?

anonymous
()
Ответ на: комментарий от sunny1983

Покажите весь /proc/meminfo.

Что касается поиска куда идёт память в ядре, то технология одна — фиксировать все выделения памяти в течении длительного промежутка времени. Либо патчить ядро, либо ftrace https://elinux.org/Kernel_dynamic_memory_analysis .

mky ★★★★★
()
Ответ на: комментарий от mky

И к meminfo ещё такую сумму:

awk '/ vmalloc$/{S+=$2}; END {print S/1024}' < /proc/vmallocinfo 
так как сейчас ядра показывают нулевой VmallocUsed в meminfo ради производительности.

mky ★★★★★
()
Ответ на: комментарий от mky

Покажите весь /proc/meminfo

MemTotal:       32936080 kB
MemFree:          202348 kB
MemAvailable:    8187404 kB
Buffers:           25112 kB
Cached:          8563672 kB
SwapCached:         2832 kB
Active:         11593620 kB
Inactive:        2717208 kB
Active(anon):    4683508 kB
Inactive(anon):  1403656 kB
Active(file):    6910112 kB
Inactive(file):  1313552 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4148200 kB
SwapFree:        4132064 kB
Dirty:            358660 kB
Writeback:            20 kB
AnonPages:       5719536 kB
Mapped:            77708 kB
Shmem:            363200 kB
Slab:             329428 kB
SReclaimable:     214600 kB
SUnreclaim:       114828 kB
KernelStack:        8656 kB
PageTables:        23620 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    20616240 kB
Committed_AS:    7254140 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:      2048 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:    31645156 kB
DirectMap2M:     1896448 kB
DirectMap1G:           0 kB

ещё такую сумму

360448

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Все нормально. В чем ваша проблема? shmem низкий, tmpfs занят мало. 6 гигов активные файловые страницы, ок. slab небольшой. Вообще ничего подозрительного. Выглядит как обычный сервер с активной работой с файлами.

hakavlad ★★★
()
Ответ на: комментарий от sunny1983

около 400 Мбайт памяти переходят из cached во free, used при этом не уменьшается, при этом резко возрастают дисковые операции, через 10 минут всё возвращается обратно

Вроде так и должно быть. Кэш убрали - кэш вернулся. Проблема-то в чем?

hakavlad ★★★
()
Ответ на: комментарий от sunny1983

Помимо разделяемой анонимной разделяться может и файловая.

RSS=Anon+File+Shmem.

hakavlad ★★★
()
Ответ на: комментарий от sunny1983

Странно. Вроде было:

MemTotal = MemFree + (Active + Inactive) + (Slab + PageTables + KernelStack + VmallocUsed)

VmallocUsed вычислять из /proc/vmallocinfo

У вас разница примерно в 17 Гбайт, которые и показывает smem в ″kernel dynamic memory″ (он это число как-то так и вычисляет). Не знаю, может какая бага в ядре, а может нужно из vmallocinfo брать не только ″vmalloc″, но ещё какие-то записи...

mky ★★★★★
()

Попутный вопрос. Как через /proc получить для каждого показателя величины RES, SHR и VIRT? Пока нашёл только VIRT, это строка VmSize в /proc/PID/status

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Надо суммировать данные из /proc/PID/smaps. Можно посмотреть исходники утилиты, как и что они суммируют.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.