Как я могу контролировать использование памяти?

265

Я привык topвидеть использование памяти на данный момент. Но я хотел бы контролировать использование памяти в течение определенного периода времени. Например, запустите мониторинг, затем выполните несколько команд и, наконец, остановите мониторинг и посмотрите, сколько памяти было использовано за период.

Как я могу сделать это на Ubuntu Server?

Я думаю, я мог бы запускать cronjob каждые 5 секунд или около того, и вызывать команду, которая записывает текущее использование памяти в текстовый файл. Но какую команду я должен использовать, чтобы получить текущее использование памяти в формате, который легко записать в текстовый файл?

Jonas
источник

Ответы:

322

Я рекомендую объединить предыдущие ответы

watch -n 5 free -m

Обратите внимание, что Linux любит использовать любую дополнительную память для кэширования блоков жесткого диска . Таким образом, вы не хотите смотреть только на бесплатное Mem. Вы хотите посмотреть на freeстолбец -/+ buffers/cache:строки. Это показывает, сколько памяти доступно приложениям. Так что я просто побежал free -mи получил это:

             total       used       free     shared    buffers     cached
Mem:          3699       2896        802          0        247       1120
-/+ buffers/cache:       1528       2170
Swap:         1905         62       1843

Я знаю, что я использую 1528 МБ и имею 2170 МБ бесплатно.

Примечание: чтобы остановить этот watchцикл, вы можете просто нажать Ctrl+ C.

Джастин Форс
источник
1
Спасибо, это информативно. Но для используемого столбца, который у вас есть, 2896а затем 1528для буферов, разве это не означает, что вы используете 2896 + 1528?
Джонас
8
Mem: usedваша общая используемая память -/+ buffers/cache: usedваша общая используемая память минус буферы и кеш. Я знаю, что результат выглядит забавно, но здесь не требуется арифметика. Вы просто ищете используется / бесплатно в строке - / + buffers / cache.
Джастин Форс
6
Опция -h намного приятнее
frmdstryr
1
@frmdstryr Хороший вопрос! -h / - человек не существовал, когда я написал это, хотя. gitlab.com/procps-ng/procps/commit/…
Джастин Форс,
3
@ cbradsh1 Вы можете просто сделать free -h, например, watch -n 5 free -hчтобы получить «читаемый человеком» вывод, например, 2.1Gвместо 2170вывода.
Джастин Форс
213

Я думаю, что htopэто лучшее решение.

  • sudo apt-get install htop

Таким образом, вы заметите, какие программы используют больше оперативной памяти. и вы можете легко прекратить один, если хотите. Вот скриншот!

Альвар
источник
2
htopэто хорошо, потому что это более "графическое" и, возможно, легче читать, чем free.
mjswensen
1
я не понимаю вывод. RESИспользуется ли память этим приложением в МБ? Тогда что есть SHR?
Файзал
1
@faizal: виртуальная, зарезервированная и общая память.
WitchCraft
1
как htopпоказывает «использование памяти за период времени»?
Дангел
htop -s M_SHARE htop -s ВРЕМЯ
Томачи
40

Если вы ищете красивую разбивку памяти, используемой каждым запущенным процессом, я мог бы рекомендовать проверить ps_mem.py (находится здесь на pixelbeat.org).

Я знаю, что в комментариях выше вы упомянули, что хотите получить бесплатный снимок из одной строки , но я подумал, что другие могут найти это полезным.

Пример вывода:

user@system:~$ sudo ps_mem.py
[sudo] password for user:
 Private  +   Shared  =  RAM used       Program

  4.0 KiB +   7.5 KiB =  11.5 KiB       logger
  4.0 KiB +   8.0 KiB =  12.0 KiB       mysqld_safe
  4.0 KiB +  10.0 KiB =  14.0 KiB       getty
  4.0 KiB +  42.0 KiB =  46.0 KiB       saslauthd (5)
 48.0 KiB +  13.0 KiB =  61.0 KiB       init
 56.0 KiB +  27.5 KiB =  83.5 KiB       memcached
 84.0 KiB +  26.5 KiB = 110.5 KiB       cron
120.0 KiB +  50.0 KiB = 170.0 KiB       master
204.0 KiB + 107.5 KiB = 311.5 KiB       qmgr
396.0 KiB +  94.0 KiB = 490.0 KiB       tlsmgr
460.0 KiB +  65.0 KiB = 525.0 KiB       rsyslogd
384.0 KiB + 171.0 KiB = 555.0 KiB       sudo
476.0 KiB +  83.0 KiB = 559.0 KiB       monit
568.0 KiB +  60.0 KiB = 628.0 KiB       freshclam
552.0 KiB + 259.5 KiB = 811.5 KiB       pickup
  1.1 MiB +  80.0 KiB =   1.2 MiB       bash
  1.4 MiB + 308.5 KiB =   1.7 MiB       fail2ban-server
888.0 KiB +   1.0 MiB =   1.9 MiB       sshd (3)
  1.9 MiB +  32.5 KiB =   1.9 MiB       munin-node
 13.1 MiB +  86.0 KiB =  13.2 MiB       mysqld
147.4 MiB +  36.5 MiB = 183.9 MiB       apache2 (7)
---------------------------------
                        208.1 MiB
=================================

 Private  +   Shared  =  RAM used       Program

Единственная часть, которая мне не нравится, это то, что скрипт требует наличия привилегий root. У меня еще не было возможности точно понять, почему это так.

Джейсон Мок
источник
Интересно, распределяется ли память между потоками? Разделяется ли он между процессами, не так ли? По крайней мере, на Windows ...
Томас Уэллер
Таким образом, в этом случае общая память относится к страницам, которые отображаются несколькими процессами в форме общих библиотек. Кроме того, в контексте многопоточных приложений все пространство памяти процесса доступно всем потокам в этом процессе.
Джейсон Мок
4
Теперь доступно в PyPI ( pip install ps_mem) и на GitHub .
Лейф Арне Сторсет
@ThomasWeller: Да, потоки всегда совместно используют память, тогда как процессы могут совместно использовать ее частично или полностью при определенных условиях.
Лейф Арне Сторсет
для этого я использую gnome-system-monitor
24

Используйте бесплатную команду. Например, это вывод free -m:

             total       used       free     shared    buffers     cached
Mem:          2012       1666        345          0        101        616
-/+ buffers/cache:        947       1064
Swap:         7624          0       7624

free -m | grep /+ вернет только вторую строку:

-/+ buffers/cache:        947       1064
Исайя
источник
Спасибо, выглядит отлично. Таким образом, это 947использование памяти минус память, используемая для буферов и кешей?
Джонас
11

Команда watch может быть полезна. Попробуйте watch -n 5 freeотслеживать использование памяти с обновлениями каждые пять секунд.

mgunes
источник
Спасибо, это было здорово! Тем не менее, я бы предпочел, чтобы память использовалась в одной строке, поэтому легко войти в текстовый файл.
Джонас
8

Вы можете сделать это с помощью cat /proc/meminfo.

MemTotal:        4039160 kB
MemFree:          309796 kB
MemAvailable:    3001052 kB
Buffers:          345636 kB
Cached:          2341288 kB
SwapCached:            8 kB
Active:          1725160 kB
Inactive:        1551652 kB
Active(anon):     538404 kB
Inactive(anon):    70076 kB
Active(file):    1186756 kB
Inactive(file):  1481576 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:       4194300 kB
SwapFree:        4194044 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        589988 kB
Mapped:           255972 kB
Shmem:             18596 kB
Slab:             374888 kB
SReclaimable:     310496 kB
SUnreclaim:        64392 kB
KernelStack:        6976 kB
PageTables:        26452 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6213880 kB
Committed_AS:    3589736 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      147392 kB
DirectMap2M:     4046848 kB
эмир
источник
1
добавление часов в начало этой команды делает ее классной! как вwatch cat /proc/meminfo
Старейшина Гик
Команда freeберет свою информацию /proc/meminfoи представляет их в компактном виде. Используйте free -hдля удобочитаемого вывода.
LoMaPh
4

Для визуального мониторинга общего использования оперативной памяти, если вы используете Byobu , он будет хранить ваше использование памяти в правом нижнем углу терминала и будет работать, пока вы находитесь в любом терминальном сеансе.

Как вы можете видеть на скриншоте, моя виртуальная машина имеет время бесперебойной работы 1 час 3 м, нагрузку 0,00, 2,8 ГГц (виртуальный) процессор и 994 МБ (21%) оперативной памяти, доступной в системе.

Бёбу в использовании

bafromca
источник
3

Однолинейное решение и вывод:

free -m | grep "Mem:"

Вот пример ожидаемого результата:

Mem:           3944         652         302          18        2990        2930
Тим
источник
1

Я бы использовал Кактусы . Это будет отображать график использования памяти и т. Д. За определенный период времени, и вы сможете проверить использование с помощью веб-браузера.

Matt
источник
1

Мониторинг использования памяти

Я больше согласен с одним из предыдущих постов, в которых упоминалась Cacti как отличный способ контролировать использование памяти. Однако, поскольку кажется, что кактусы больше не популярны в мейнстриме, есть альтернативное графическое приложение под названием Graphite.

Graphite относительно прост в установке на сервер Ubuntu, и для его установки вы можете воспользоваться этой ссылкой для простых процедур установки.

После того, как графит был установлен, теперь вы можете отправлять ему метрики памяти с любым интервалом, который пожелаете; каждые 5 секунд, каждую минуту, каждый час ... и т. д.

Чтобы построить график метрик памяти, как уже предлагалось в предыдущих статьях, вы можете написать свой собственный скрипт, используя системные инструменты для сбора необходимой информации о памяти. Или вы можете использовать заранее написанный плагин snmp, который сделает всю работу за вас.

Если вы хотите написать свой собственный скрипт памяти, будет разумно убедиться, что вы учитываете буферизованную и кэшированную память при расчете используемой памяти, в противном случае вы в конечном итоге соберете ложные данные.

Если вы хотите вместо этого использовать плагин snmp, который уже выполняет все необходимые вычисления, вот ссылка на тот, который работает довольно хорошо: checkMemoryviaSNMP .

Плюсы SNMP:

У меня установлен snmp на всех удаленных узлах, которые я наблюдаю. Это позволяет мне контролировать все мои системы с одного центрального сервера (ов) , без необходимости копировать или устанавливать плагин на удаленных узлах.

Минусы SNMP:

Вы должны убедиться, что агент snmp установлен на каждом из удаленных узлов, на которых вы хотите отслеживать память. Тем не менее, эта установка будет разовой. Если в вашей среде вы используете инструменты автоматизации, такие как «повар», «марионетка» или аналогичные, тогда это не проблема.

Конфигурация агента SNMP на удаленном узле (ах):

После того, как агент snmp был установлен, просто загрузите файл /etc/snmpd/snmpd.conf и добавьте в него следующую строку:

rocommunity  (specify-a-community-string-aka-password-here)

Затем перезапустите агент snmpd:

/etc/init.d/snmpd restart

Затем на вашем центральном сервере, с которого вы вместо этого будете контролировать все остальные ваши серверы, вы можете запустить следующую команду:

$ time ./checkMemoryviaSNMP -v2 public gearman001.phs.blah.com 30 90 graphite,10.10.10.10,2003,typical
WARNING: Used = [ 3.26154 GB ], Installed = [ 5.71509 GB ], PCT.Used = [ 57.069% ], Available.Memory = [ 2.00291 GB ]. Buffer = [ 137.594 MB ], Cached = [ 1.3849 GB ]. Thresholds: [ W=(30%) / C=(90%) ].  System Information = [ Linux gearman001.phs.blah.com 2.6.32-504.30.3.el6.x86_64 #1 SMP Thu Jul 9 15:20:47 EDT 2015 x86_64 ].

real    0m0.23s
user    0m0.03s
sys     0m0.02s
SimplisticSpeed
источник