Linux

Linux 機器上的記憶體使用與“免費”不匹配

  • October 29, 2018

我有一台 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 內部圖,展示了它們的所有榮耀

開玩笑,說真的——Linux 中的記憶體管理不是一個簡單的野獸。有不同的方式來“查看”什麼是“免費”和“使用”,即使是最明顯的數字,一旦你查看它,也可能不會那麼明顯。我認為您可能想要量化您對“使用”的定義是什麼,然後將該定義應用於您正在查看的數字,特別是關於使用的數字。

  1. 您是否考慮到共享記憶體? 根據您計算“已使用”的方式,程序的記憶體可以小很多,也可以大很多。 您是否單獨計算共享記憶體,或者好像每個附加到它的程序都擁有它?
  2. 共享庫也可以具有相同的行為:程序載入與另一個程序共享的庫 (libmylibrary.so)。一種記憶體視圖說庫不計入使用的記憶體。另一種觀點認為,它不僅會計算,而且還會計算兩次——一次用於剛剛使用它的程序,另一次用於已經使用它的程序,因為每個程序都需要一個虛擬記憶體映射才能使庫工作。第三種觀點認為庫實際上只佔用了載入它所需的記憶體。 哪一種是“正確”的記憶觀?
  3. 磁碟記憶體/緩衝區還可以創建“使用”和“免費”的複雜視圖。系統將用完程序未使用的記憶體,但如果它需要記憶體來載入程序,記憶體將被丟棄並重新用於載入該程序的實例。您可以輕鬆地在記憶體中僅載入 3Mbyte 的程式碼,但會消耗 600Mbyte 的磁碟記憶體。同樣,哪一種是“正確”的觀點?

引用自:https://serverfault.com/questions/143556