Linux
Linux 機器上的記憶體使用與“免費”不匹配
我有一台 Linux 機器,它在軟體方面沒有執行太多,但不知何故使用了 2GB 已安裝記憶體中的 1.7GB。當我自由奔跑時,我得到:
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.9MB,這與 free 報告為已使用的 1.7GB 記憶體相差甚遠。為什麼會有這樣的差異?
編輯:
這是請求的額外資訊,但我認為這不會有太大幫助,因為我現在已經顯示
free
使用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.9MB,這與 free 報告為已使用的 1.7GB 記憶體相差甚遠。
為什麼會有這樣的差異?
因為 linux 記憶體管理很古怪?
開玩笑,說真的——Linux 中的記憶體管理不是一個簡單的野獸。有不同的方式來“查看”什麼是“免費”和“使用”,即使是最明顯的數字,一旦你查看它,也可能不會那麼明顯。我認為您可能想要量化您對“使用”的定義是什麼,然後將該定義應用於您正在查看的數字,特別是關於您使用的數字。
- 您是否考慮到共享記憶體? 根據您計算“已使用”的方式,程序的記憶體可以小很多,也可以大很多。 您是否單獨計算共享記憶體,或者好像每個附加到它的程序都擁有它?
- 共享庫也可以具有相同的行為:程序載入與另一個程序共享的庫 (libmylibrary.so)。一種記憶體視圖說庫不計入使用的記憶體。另一種觀點認為,它不僅會計算,而且還會計算兩次——一次用於剛剛使用它的程序,另一次用於已經使用它的程序,因為每個程序都需要一個虛擬記憶體映射才能使庫工作。第三種觀點認為庫實際上只佔用了載入它所需的記憶體。 哪一種是“正確”的記憶觀?
- 磁碟記憶體/緩衝區還可以創建“使用”和“免費”的複雜視圖。系統將用完程序未使用的記憶體,但如果它需要記憶體來載入程序,記憶體將被丟棄並重新用於載入該程序的實例。您可以輕鬆地在記憶體中僅載入 3Mbyte 的程式碼,但會消耗 600Mbyte 的磁碟記憶體。同樣,哪一種是“正確”的觀點?