Найдите то, что занимает много памяти и не видно в `ps` или аналогичном

У меня есть виртуальная машина с проблемами памяти. Одна из задач, которые я хотел бы запустить в ней, сбой с ошибками из-за памяти.

Однако, когда он падает, система все еще остается голодной. Я не уверен, что это просто процесс, который мне не хватает, или реальная ошибка (это в гипер-v, с новыми расширениями ядра, которые позволяют всплывать на память для Linux-хостов, поэтому вполне может быть подлинным ошибка ядра).

durr@sqlbox:~$ free -h total used free shared buffers cached Mem: 3.1G 2.6G 541M 88K 7.4M 39M -/+ buffers/cache: 2.5G 588M Swap: 1.0G 6.2M 1.0G 

Free говорит мне, что он не просто кэшируется, на самом деле есть что-то, что кажется живым, занимая 2.6G памяти.

Однако просмотр результатов PS, отсортированных по виртуальному размеру, не освещает:

 durr@sqlbox:~$ ps -e ax -o pid,vsz,comm | sort --numeric-sort --key=2 [ ... snip ... ] PID VSZ COMMAND 96 0 rcuob/23 97 0 rcuob/24 98 0 rcuob/25 99 0 rcuob/26 1124 4368 acpid 59863 10016 ps 1031 15668 upstart-file-br 1047 15820 getty 1050 15820 getty 1055 15820 getty 1056 15820 getty 1058 15820 getty 1167 15820 getty 1023 15920 upstart-socket- 1076 19140 atd 1099 19188 irqbalance 428 19476 upstart-udev-br 59864 21860 sort 59267 22644 bash 59234 22664 bash 59280 22808 bash 1075 23656 cron 59261 26928 screen 59279 27380 htop 59262 28472 screen 1 33776 init 749 39240 dbus-daemon 816 43452 systemd-logind 432 51348 systemd-udevd 1090 61364 sshd 871 255844 rsyslogd 59184 269028 sshd 59233 269028 sshd 

Таким образом, самый большой потребитель памяти – sshd , и он использует ….. 269K? Где все мои воспоминания?

Просмотр в /proc/meminfo показывает:

 durr@sqlbox:~$ cat /proc/meminfo MemTotal: 3266904 kB MemFree: 554228 kB Buffers: 7596 kB Cached: 41104 kB SwapCached: 3032 kB Active: 32552 kB Inactive: 34292 kB Active(anon): 13224 kB Inactive(anon): 5008 kB Active(file): 19328 kB Inactive(file): 29284 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 1044476 kB SwapFree: 1038084 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 15656 kB Mapped: 9196 kB Shmem: 88 kB Slab: 33488 kB SReclaimable: 14532 kB SUnreclaim: 18956 kB KernelStack: 2352 kB PageTables: 2748 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2677928 kB Committed_AS: 56148 kB VmallocTotal: 34359738367 kB VmallocUsed: 34360 kB VmallocChunk: 34359695660 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 44456 kB DirectMap2M: 3491840 kB 

Очевидно, похоже, что что-то Vmalloc огромное количество памяти, но я не уверен, что это актуально.

One Solution collect form web for “Найдите то, что занимает много памяти и не видно в `ps` или аналогичном”

Возможно, ваша программа использовала общую память и не очищала ее.

В Linux есть три варианта общей памяти:

1.) Общая память POSIX (реализованная glibc) доступна через файлы в псевдо-файловой системе tmpfs и обычно монтируется системой в таких местах, как /dev/shm , /run , /run/shm или /run/lock , Лучший способ узнать наверняка – войти в mount | grep -E '^tmpfs' mount | grep -E '^tmpfs' (более портативный) или grep -E '^tmpfs' /proc/mounts (лучше всего для linux) в оболочке.

Обратите внимание, что процесс может вызывать unlink() в файле mmap() в общей памяти, что делает файл недоступным по имени файла (например, для продолжения доступа к нему требуется ранее назначенный дескриптор файла). Тем не менее, файлы unlink() ed обычно удаляются при выходе из всех процессов, в которых он был open() 'ed – возможно, если ваша программа закончена, все равно есть еще один процесс, все еще содержащий дескриптор.

2.) Совместная память SysV IPC, которая не видна с помощью псевдо-файловой системы tmpfs , а через /proc/sysvipc/shm , linux syscalls (только если вы хакер), ее libc-оболочка или, совсем недавно, через ipcs -m -p -[tclu] . Вам нужно найти соответствующий идентификатор процесса в любом из этих списков, а затем проверить этот процесс дальше.

3.) Анонимная сопоставленная общая память, и в этом случае память не поддерживается каким-либо файлом, а память сначала распределяется между процессом и всеми его дочерними элементами. AFAIK такая анонимная распределенная память освобождается, когда процесс, который mmap() выдает его exit() s. Таким образом, в случае прекращения вашей программы и всех ее дочерних процессов, AFAIK не должен занимать какую-либо память.

  • Потребление памяти AIX
  • Где находится ядро ​​Linux в памяти?
  • Как отображать результаты `top`, отсортированные по использованию памяти в режиме реального времени?
  • Как найти часть кода, который создает анонимную приватную память
  • В Solaris 10 и 11 все еще используется распределение slab для их распределителя памяти ядра
  • Как просмотреть буферизованные и кэшированные данные
  • Процесс убит убийцей OOM, когда много памяти, по-видимому, бесплатно
  • Gentoo Hardened ест 3 ГБ памяти после работы в течение ~ 12 часов с очень небольшим количеством запущенных процессов
  • Почему сегменты данных и кода полностью перекрываются в Linux?
  • Что использует «память приложения» Linux?
  • Почему Vim не может открыть текстовый файл размером 100 МБ, если у меня 16 ГБ оперативной памяти?
  • Interesting Posts

    Как использовать аргументы с 'find -exec'?

    Как узнать, является ли файл на btrfs копированием на запись?

    проверять содержимое файла с помощью регулярных выражений bash

    обнаружение датчиков не обнаруживает

    cygwin: ls -i сообщает неправильный номер inode для файлов в UNC-пути

    Есть ли способ переназначить AltGr-ключ на Ctrl с помощью setxkbmap?

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

    Есть ли предел для процессов, которые я могу запустить в фоновом режиме?

    проблемы с загрузкой программного обеспечения в Ubuntu на Windows

    Linux Mint устанавливает программы в / not not / home, как мне это разрешить?

    Скопируйте Live CD в RAM при загрузке

    Запустите сценарий оболочки перед запуском

    Запуск git с более высоким распределением памяти

    libstdc ++. so.3 => не найден в CloudLinux, нет разрешений SuperUser, похоже, в chroot.

    Установленный sqlite3 v3.8, но Mac-терминал по-прежнему запускает старую версию 3.6 по умолчанию

    Linux и Unix - лучшая ОС в мире.