Общая доступная память Linux - PullRequest
9 голосов
/ 02 декабря 2011

Я пытаюсь найти хорошую формулу для определения объема доступной памяти. В настоящее время я использую следующую формулу: freeMem = MemFree + Buffers + Cached - Shmem. Однако по этой формуле моя встроенная система теряет память. Теперь мне интересно, если у меня есть утечка памяти, поэтому я включил kmemleak в ядре. Согласно mpatrol, valgrind и coverity у меня нет никаких утечек в пользовательском пространстве. Есть ли утечка в пространстве ядра или моя формула выключена? Обратите внимание, что у меня нет подкачки для этого устройства.

MYBOX> cat /proc/meminfo
MemTotal:        2073348 kB
MemFree:         1388180 kB
Buffers:          137016 kB
Cached:            88772 kB
SwapCached:            0 kB
Active:           589124 kB
Inactive:          44380 kB
Active(anon):     410236 kB
Inactive(anon):     1992 kB
Active(file):     178888 kB
Inactive(file):    42388 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:       1310716 kB
HighFree:         811828 kB
LowTotal:         762632 kB
LowFree:          576352 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                64 kB
Writeback:             0 kB
AnonPages:        407712 kB
Mapped:            26140 kB
Shmem:              4516 kB
Slab:              40408 kB
SReclaimable:       8320 kB
SUnreclaim:        32088 kB
KernelStack:        1480 kB
PageTables:         1464 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1036672 kB
Committed_AS:     660508 kB
VmallocTotal:     237344 kB
VmallocUsed:      104556 kB
VmallocChunk:     126296 kB

Ответы [ 6 ]

2 голосов
/ 05 декабря 2011

В ваших вычислениях «свободной памяти» отсутствует одна вещь - нужно добавить SReclaimable (для исправляемого кэша слябов) в эффективно свободную память.

Если это не изменит медленное сокращениеэффективно освобождая память с течением времени, вы должны делать снимки /proc/meminfo через равные промежутки времени и определять, какая строка показывает увеличение.

Если увеличивается линия SUnreclaim, вы можете посмотреть в /proc/slabinfo чтобы увидеть использование вашей плиты ядра и определить виновника.Вполне возможно, что вы наблюдаете просто фрагментацию памяти, и она в конечном итоге успокоится в течение более длительного периода времени.

2 голосов
/ 02 декабря 2011

Утечка памяти из пользовательского пространства в любом случае не будет отображаться в /proc/meminfo, поскольку ядро ​​выделяет память (независимо от того, используете ли вы free () в приложении пользователя или нет, оно либо выделяется с помощью mmap () syscall или brk () / sbrk () и ядро ​​отслеживает страницы, выделенные в пользовательском пространстве, в противном случае у нас будут серьезные проблемы;).

Я не совсем понимаю, как вы пришли к убеждению, что у вас утечка памяти?Вот хорошая ссылка redhat / meminfo , если вы ее еще не прочитали, которая объясняет, что на самом деле означает каждая статистика.

0 голосов
/ 08 мая 2017

Раньше это был MemFree + перехват (что верно много лет назад).

Теперь это MemFree + Active (файл) + Inactive (файл) + SRreclaimable.

Для получения дополнительной информации перейдите по ссылке ниже LINUX TORVALD.

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

0 голосов
/ 18 сентября 2015

FreeMem = MemFree + Buffers + Cached - Mapped. Кэшируемая память содержит сопоставленную часть, эта часть была сопоставлена ​​с пользовательским пространством.

0 голосов
/ 18 мая 2012

Для моих систем я использую следующую команду, чтобы проверить, сколько памяти используется:

ps aux | awk '{sum +=$4}'

Это добавляет общий процент использованной памяти для всех процессов, которые в данный момент запущены.

0 голосов
/ 02 декабря 2011

Согласовано с auxv - использование / proc / meminfo, вероятно, не лучший способ отслеживания памяти пользовательских процессов, поскольку она включает в себя память, выделяемую всеми пользовательскими процессами, что затрудняет снижение потребления вашего процесса.

Лучший способ отследить общий объем памяти, потребляемой вашим процессом, - использовать top (1) и посмотреть на VIRT (который включает в себя замену памяти) или RES (который включает только физическую память).

Но если выесли вы хотите использовать / proc / meminfo, тогда формула, которую я бы использовал:

MemTotal = MemFree + Cached + Buffers + SwapCached

... обратите внимание, что этотолько учетные данные, а не код.Большая часть MemTotal - (количество справа от уравнения) должно быть вашим образом ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...