Найдите то, что занимает много памяти и не видно в `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 не должен занимать какую-либо память.

  • Что подразумевает план памяти виртуального ядра в dmesg?
  • Измерение использования ОЗУ в программе
  • Как найти размер резидентной памяти процесса в busybox?
  • Как убедиться, что определенная функциональность (например, Alt + Ctrl + F1, переключение в tty) доступна в системе обмена файлами?
  • Как включить разделение 4G / 4G в Linux?
  • lsof - отладить выходную информацию
  • как освободить / dev / ram0
  • Использует ли моя система всю доступную оперативную память?
  • Gentoo Hardened ест 3 ГБ памяти после работы в течение ~ 12 часов с очень небольшим количеством запущенных процессов
  • OOM от итерации по очень большой карте памяти
  • Ядро: pci 0000: 7f: 12.4: BAR 3: не удалось назначить
  • Linux и Unix - лучшая ОС в мире.