У меня есть Linux-машина, на которой не слишком много программного обеспечения, но каким-то образом используется 1,7 ГБ из 2 ГБ установленной памяти. Когда я бегу на свободу, я получаю:
total used free shared buffers cached
Mem: 2072616 1979972 92644 0 164876 129740
-/+ buffers/cache: 1685356 387260
Swap: 498004 1632 496372
Когда я бегу top
, Я получаю те же числа, что и в первой строке free
(не может воспроизводиться, так как использование памяти теперь само исправлено).
Однако когда я бегу ps aux
, использование памяти всеми процессами составляет всего 295,9 МБ, что значительно меньше 1,7 ГБ памяти, которая освобождает отчеты по мере использования.
Почему такое несоответствие?
РЕДАКТИРОВАТЬ:
Вот запрошенная дополнительная информация, но я не думаю, что она сильно поможет, так как теперь я показываю ~ 360 МБ, использованных с использованием free
и ~ 300 МБ использовано с учетом итоговых значений ps aux
. Не знаю, почему проблема исчезла сама собой.
free
total used free shared buffers cached
Mem: 2072616 668484 1404132 0 185868 139196
-/+ buffers/cache: 343420 1729196
Swap: 498004 1632 496372
cat /proc/meminfo
MemTotal: 2072616 kB
MemFree: 1404628 kB
Buffers: 185792 kB
Cached: 139196 kB
SwapCached: 544 kB
Active: 411448 kB
Inactive: 210208 kB
Active(anon): 218636 kB
Inactive(anon): 78216 kB
Active(file): 192812 kB
Inactive(file): 131992 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 1187784 kB
HighFree: 761112 kB
LowTotal: 884832 kB
LowFree: 643516 kB
SwapTotal: 498004 kB
SwapFree: 496372 kB
Dirty: 60 kB
Writeback: 0 kB
AnonPages: 296168 kB
Mapped: 14536 kB
Shmem: 184 kB
Slab: 39088 kB
SReclaimable: 31720 kB
SUnreclaim: 7368 kB
KernelStack: 888 kB
PageTables: 1184 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1534312 kB
Committed_AS: 407808 kB
VmallocTotal: 122880 kB
VmallocUsed: 5132 kB
VmallocChunk: 112808 kB
DirectMap4k: 12280 kB
DirectMap4M: 897024 kB
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1620 548 ? Ss May18 0:04 init [3]
root 2 0.0 0.0 0 0 ? S May18 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S May18 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S May18 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S May18 0:00 [watchdog/0]
root 6 0.0 0.0 0 0 ? S May18 0:00 [migration/1]
root 7 0.0 0.0 0 0 ? S May18 0:00 [ksoftirqd/1]
root 8 0.0 0.0 0 0 ? S May18 0:00 [watchdog/1]
root 9 0.0 0.0 0 0 ? S May18 0:00 [events/0]
root 10 0.0 0.0 0 0 ? S May18 0:00 [events/1]
root 11 0.0 0.0 0 0 ? S May18 0:00 [khelper]
root 17 0.0 0.0 0 0 ? S May18 0:00 [async/mgr]
root 166 0.0 0.0 0 0 ? S May18 0:00 [sync_supers]
root 168 0.0 0.0 0 0 ? S May18 0:00 [bdi-default]
root 170 0.0 0.0 0 0 ? S May18 0:03 [kblockd/0]
root 171 0.0 0.0 0 0 ? S May18 0:03 [kblockd/1]
root 174 0.0 0.0 0 0 ? S May18 0:00 [kacpid]
root 175 0.0 0.0 0 0 ? S May18 0:00 [kacpi_notify]
root 176 0.0 0.0 0 0 ? S May18 0:00 [kacpi_hotplug]
root 332 0.0 0.0 0 0 ? S May18 0:00 [ata/0]
root 333 0.0 0.0 0 0 ? S May18 0:00 [ata/1]
root 334 0.0 0.0 0 0 ? S May18 0:00 [ata_aux]
root 336 0.0 0.0 0 0 ? S May18 0:00 [kseriod]
root 371 0.0 0.0 0 0 ? S May18 0:00 [rpciod/0]
root 372 0.0 0.0 0 0 ? S May18 0:00 [rpciod/1]
root 406 0.0 0.0 0 0 ? S May18 0:00 [khungtaskd]
root 407 0.0 0.0 0 0 ? S May18 0:20 [kswapd0]
root 408 0.0 0.0 0 0 ? S May18 0:00 [aio/0]
root 409 0.0 0.0 0 0 ? S May18 0:00 [aio/1]
root 410 0.0 0.0 0 0 ? S May18 0:00 [nfsiod]
root 411 0.0 0.0 0 0 ? S< May18 0:00 [kslowd000]
root 412 0.0 0.0 0 0 ? S< May18 0:00 [kslowd001]
root 414 0.0 0.0 0 0 ? S May18 0:00 [crypto/0]
root 415 0.0 0.0 0 0 ? S May18 0:00 [crypto/1]
root 1172 0.0 0.0 0 0 ? S May18 0:00 [scsi_tgtd/0]
root 1173 0.0 0.0 0 0 ? S May18 0:00 [scsi_tgtd/1]
root 1177 0.0 0.0 0 0 ? S May18 0:00 [scsi_eh_0]
root 1215 0.0 0.0 0 0 ? S May18 0:00 [kpsmoused]
root 1228 0.0 0.0 0 0 ? S May18 0:05 [jbd2/sda3-8]
root 1229 0.0 0.0 0 0 ? S May18 0:00 [ext4-dio-unwr]
root 1230 0.0 0.0 0 0 ? S May18 0:00 [ext4-dio-unwr]
root 1322 0.0 0.0 2044 632 ? S<s May18 0:00 /sbin/udevd --d
root 1650 0.0 0.0 0 0 ? S May18 0:25 [vmmemctl]
root 1678 0.0 0.0 0 0 ? S May18 0:00 [kjournald]
root 1680 0.0 0.0 0 0 ? S May18 0:00 [ksuspend_usbd]
root 1681 0.0 0.0 0 0 ? S May18 0:00 [khubd]
root 1709 0.0 0.0 0 0 ? S May18 0:02 [flush-8:0]
root 3157 0.0 0.0 5976 1576 ? Ss May18 0:10 /usr/bin/vmtool
root 3222 0.0 0.0 5984 276 ? S May18 0:00 supervising sys
root 3223 0.0 0.0 6220 1452 ? Ss May18 0:00 /usr/sbin/syslo
root 3224 0.0 0.0 4428 1240 ? S May18 0:00 /bin/sh /etc/sy
clamav 3808 0.1 11.4 256396 237488 ? SNsl May18 2:44 /usr/sbin/clamd
clamav 3818 0.0 0.0 12368 1684 ? SNs May18 0:03 /usr/bin/freshc
root 3984 0.0 0.0 4048 1164 ? Ss May18 0:00 /usr/sbin/ntpd
root 4106 0.0 0.0 14228 1868 ? Ss May18 0:00 /usr/sbin/smbd
root 4115 0.0 0.0 8360 1128 ? Ss May18 0:00 /usr/sbin/nmbd
root 4119 0.0 0.0 14228 852 ? S May18 0:00 /usr/sbin/smbd
root 4176 0.0 0.0 8488 1832 ? Ss May18 0:00 sendmail: accep
smmsp 4179 0.0 0.0 8212 1372 ? Ss May18 0:00 sendmail: Queue
root 4235 0.0 0.1 9824 2700 ? S May18 0:06 /usr/sbin/snmpd
root 4295 0.0 0.0 5684 1060 ? Ss May18 0:00 /usr/sbin/sshd
root 4415 0.0 0.0 2044 512 ? S< May18 0:00 /sbin/udevd --d
uptimed 4456 0.0 0.0 1620 440 ? Ss May18 0:00 /usr/sbin/uptim
root 4515 0.0 0.0 3456 716 ? Ss May18 0:00 /usr/sbin/cron
root 4609 0.0 0.0 1672 668 tty1 Ss+ May18 0:00 /sbin/agetty 38
root 4610 0.0 0.0 1672 668 tty2 Ss+ May18 0:00 /sbin/agetty 38
root 4611 0.0 0.0 1676 672 tty3 Ss+ May18 0:00 /sbin/agetty 38
root 4612 0.0 0.0 1672 668 tty4 Ss+ May18 0:00 /sbin/agetty 38
root 4613 0.0 0.0 1668 664 tty5 Ss+ May18 0:00 /sbin/agetty 38
root 4614 0.0 0.0 1668 664 tty6 Ss+ May18 0:00 /sbin/agetty 38
root 8761 0.0 0.1 8740 3000 ? Ss 02:02 0:02 sshd: root@nott
root 8763 0.0 0.0 5356 1632 ? Ss 02:02 0:02 /usr/lib/misc/s
root 8774 0.0 0.1 8744 2988 ? Ss 02:02 0:00 sshd: root@nott
root 8776 0.0 0.0 5368 1632 ? Ss 02:02 0:00 /usr/lib/misc/s
root 8787 0.0 0.1 8736 2944 ? Ss 02:02 0:00 sshd: root@nott
root 8789 0.0 0.0 5232 1520 ? Ss 02:02 0:00 /usr/lib/misc/s
root 8812 0.0 0.1 8740 3000 ? Ss 02:04 0:12 sshd: root@nott
root 8814 0.0 0.0 5416 1676 ? Ss 02:04 0:13 /usr/lib/misc/s
root 8825 0.0 0.1 8744 2992 ? Ss 02:04 0:00 sshd: root@nott
root 8827 0.0 0.0 5352 1628 ? Ss 02:04 0:00 /usr/lib/misc/s
root 8838 0.0 0.1 8880 3080 ? Ss 02:04 0:00 sshd: root@nott
root 8840 0.0 0.0 5436 1768 ? Ss 02:04 0:00 /usr/lib/misc/s
root 15237 0.0 0.1 8744 2856 ? Ss 16:00 0:00 sshd: hudson-sl
1000 15239 0.0 0.0 8884 1844 ? S 16:00 0:00 sshd: hudson-sl
1000 15240 0.0 0.0 2908 1084 ? Ss 16:00 0:00 bash -c wget --
1000 15242 0.2 2.1 671620 44412 ? Sl 16:00 0:08 /etc/java-confi
root 15575 0.0 0.1 8768 3008 ? Ss 16:25 0:00 sshd: root@pts/
root 15577 0.0 0.0 4304 1012 pts/0 Ss+ 16:25 0:00 /usr/bin/screen
root 15620 0.0 0.1 5428 2100 ? Ss 16:25 0:00 /usr/bin/SCREEN
root 15621 0.0 0.1 5304 2576 pts/1 Ss+ 16:25 0:00 -/bin/bash
smmsp 15875 0.0 0.1 8492 3476 ? S 16:54 0:00 sendmail: o4JLs
root 15888 0.0 0.1 8768 3004 ? Ss 16:58 0:00 sshd: root@pts/
root 15890 0.0 0.0 4316 1028 pts/2 Ss+ 16:59 0:00 /usr/bin/screen
root 15933 0.0 0.1 5432 2096 ? Ss 16:59 0:00 /usr/bin/SCREEN
root 15934 0.1 0.1 5304 2604 pts/3 Ss 16:59 0:00 -/bin/bash
root 16021 0.0 0.0 3856 1060 pts/3 R+ 17:00 0:00 ps aux
Однако, когда я запускаю ps aux, использование памяти всеми процессами составляет всего 295,9 МБ, что значительно меньше 1,7 ГБ памяти, которая освобождает отчеты по мере использования.
Почему такое несоответствие?
Потому что управление памятью в Linux просто дурацкое?
Шутки в сторону, серьезно - управление памятью в Linux - непростая задача. Существуют разные способы "просмотра" того, что является "бесплатным" и "использованным", и даже самое очевидное число может быть не таким очевидным, если вы посмотрите на него. Я думаю, вы можете дать количественную оценку вашему определению термина «используемый», а затем применить это определение к числам, на которые вы смотрите, особенно в отношении какие числа, которые вы используете.
Вы учитываете разделяемую память? В зависимости от того, как вы считаете «использованное», память программы может быть маленькой или намного, намного большей. Считаете ли вы разделяемую память отдельно или как будто она принадлежит каждому процессу?
Общие библиотеки может также иметь такое же поведение: программа загружает библиотеку (libmylibrary.so), которая используется совместно с другой программой. Согласно одному из представлений о памяти, библиотека не учитывается в используемой памяти; другая точка зрения говорит, что он не только считает, но и считает дважды - один раз для программы, которая только что использовала его, и еще раз для программы, которая уже использовала его, потому что каждой программе потребуется отображение виртуальной памяти для работы библиотеки. Третье мнение говорит, что библиотека действительно занимает только ту память, которая была необходима для ее загрузки. Какой из них «правильный» взгляд на память?
Дисковый кеш / буферы также могут создавать сложные представления о том, что «используется», а что «не используется», а что «бесплатно». Система будет использовать память, которая не используется программами, но если ей нужна память для загрузки программы, кэш удаляется и повторно используется для загрузки экземпляра этой программы. Вы легко можете иметь только 3 Мбайт кода, загруженного в память, но при этом потреблять 600 Мбайт дискового кеша. Очередной раз, какой из них "правильный"?