什么使用了Linux内存?低缓存,低缓冲区,不是虚拟机


11

首先,是的,我已阅读LinuxAteMyRAM,但并不能解释我的情况。

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

如上所示,该-/+ buffers/cache:行显示表明已使用的存储速率非常高。但是,从的输出中top,我看不到任何进程使用了​​超过100 MB的内存。

那么,什么使用了内存?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

这是运行x84_64 Linux的x86_64计算机(不是通用品牌服务器),而不是虚拟机中的容器。内核(uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

内容/proc/meminfo

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

df报告tmpfs文件系统没有大的内存消耗。


2
输出是ps -eo pid,user,args,pmem --sort pmem什么?
Braiam 2014年

粘贴到这里的链接,尝试了几次,得到了相同的输出。
2014年

3
不要使用head!我想要complete命令的完整输出。如果我希望您使用head,请将其放入命令中。请始终将完整的输出提供给人们要求的命令。
Braiam

3
在电话上,不要忘了语法,但要检查sysv共享内存。我认为命令是ipcs。
derobert 2014年

5
您是否找到了解决方案?-我在这里有一个类似的问题:superuser.com/questions/793192/...
Hackeron

Answers:


4

Linux上的内存可能是诊断和理解的怪兽。

在大多数情况下(如果不是全部),在正常操作下,您的内存将分配给一个或另一个任务。一些将分配给当前正在运行的前台进程。有些将存储从磁盘缓存的数据。有些将保存与在该特定时刻未主动执行的流程相关的数据。

Linux中的进程具有其自己的虚拟地址空间(的输出中为VIRT top)。它包含与流程关联的所有数据,可以认为流程有多“大”。但是,几乎所有的内存都很少主动地成为“真实”内存映射(的输出中的RES top)的一部分。RES或常驻内存是可以在时间点直接在RAM中访问的数据。然后,最重要的是共享内存(SHR)。可以在同一进程的多个实例之间共享。因此,进程使用的内存在任何时间点都是RES加SHR,但是如果有多个使用共享内存的进程实例,则使用情况是RES加RES加RES ...加SHR。

那么,为什么RES和VIRT有区别?当然,如果一个进程有一块分配的内存,那是分配的内存,不是吗?不会。内存是在页面中分配的,页面可以是活动的或不活动的。活跃的是RES中的内容。不活动的是“其余”。由于当前无法访问它们,因此可以将它们推到一侧。这意味着如果内存不足,可以将它们换出到磁盘上。但是它们不只是直接进入磁盘。首先,他们坐在缓存中。您不想一直交换,因此在应用程序和交换空间之间有一个缓冲区。随着交换器选择要执行的不同进程并且不同页面变为活动和非活动状态,这些缓冲区不断变化。而所有这些发生的方式都使一个人无法跟上。

最重要的是有磁盘缓冲区。不活动的内存不仅会进入高速缓存,而且当该高速缓存被交换到磁盘时,它还会首先进入磁盘缓冲区以排队等待写入。这是混合中的第二层缓存。这些磁盘缓冲区也被系统的其他部分用于常规IO缓冲。因此,它们也在不断变化。

所以你看到的东西像topfree等要么是在一段时间的机器,或者汇总统计的当前状态的瞬间快照。在您读取数据时,它已经过时了。

任何一个进程都可以访问大量的内存,但是这样做并不明智。无论如何,它不能一次访问所有内存,因此除非它被专门标记为“锁定在内核中”,否则它当前未查看的内存将被移到缓存中。

因此,应用程序“使用”的内存量及其“拥有”的内存量是两个完全不同的东西。许多应用程序数据空间实际上位于高速缓存中,而不是“核心”内存中,但是由于高速缓存大部分时间位于RAM中,因此它是即时可用的,只需要“激活”即可成为“核心”内存。除非将其换出到磁盘上,否则它随后需要进行交换(如果在缓冲区中,则可能会很快)。

由于野兽的高速性以及数字总是在变化的事实,数字甚至可能在计算数字的过程中有所变化,因此永远不可能准确地说出“这就是正在使用多少内存”用户的观点。meminfo是内核及时提供的快照,但是由于它是内核正在执行,因此它不一定显示任何一个进程的内存使用情况的真实状态,因为当时没有任何进程在执行,而是在进程之间。

就像我说的那样,这一切都很混乱。

但是,归根结底,这并不重要。重要的不是您有多少“可用”内存,而是您使用了多少交换空间,以及访问交换空间的频率。交换会减慢系统的速度,而不是内存不足(尽管内存不足会导致交换过多)。如果您有大量已使用的内存,但没有使用任何(或很少)交换空间,则一切正常。通常,自由内存是不可取的,并且无论如何通常都是纯过渡的,因为它是出于一种目的使用的,但尚未分配给其他目的-例如,它是高速缓存存储器,并且已被交换到磁盘上,但它尚未用于其他任何用途,或者它是磁盘缓冲区,缓冲区已刷新到磁盘,但是还没有应用程序请求将其用作缓存。


6
这确实很有趣,但是没有回答OP为何观察到这种特定差异的问题。
terdon

我认为唯一真正的差异在于OP的期望与Linux提供的东西之间。即,Linux给出的值不会相加,这是因为它们已经更改。
Majenko 2014年

由于OP似乎并不真正理解他所问的问题,所以我不知道如何选择“正确”的答案。我们可以解释一下系统是如何工作的,直到我们脸色发青为止,但是如果他不掌握这些基础知识并且意识到他的问题实际上是毫无意义的,我们将永远不会有“正确”的答案。
Majenko 2014年

感谢您撰写本文,但老实说,我不喜欢它背后的不可知论调。我同意“快照”理论,但是如果快照不断提供相同的数字,表示您不知道它是如何发生的,则RAM使用率很高,您会感到好奇吗?
杰森

5
您应该将此发布在您的博客上。很好,但这与这里无关。发生了一些奇怪的事情(我的意思是来自了解您所写内容的人的怪异事情),因为进程的VIRT不能解决所有RAM使用情况,并且尽管有这样做的压力,系统也不会进行交换。
吉尔斯(Gillles)“所以-别再邪恶了”

0

这是答案的一部分:

在“ free”命令中指定为“已用”内存和在“ / proc / meminfo”中指定为“分配给活动(用户)进程的内存”之间存在区别。好的,所以您的系统总共有48149 MB(大约47Gb)

如果查看/ proc / meminfo,则会看到:不活动:17296272 kB =(大约16.5 Gb)-不活动的内存可能来自已终止的进程。它也可以是活动进程长时间未使用的内存。内存不是因为进程终止而被“释放”。为什么?因为它的工作量更大。可能会再次使用同一页内存,因此linux内核只是将数据保留在“非活动”列表上,直到进程需要它为止。

此页面对此进行了解释。http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization;阅读有关Linux内核使用的PFRA(页面框架回收算法)的部分:“在属于进程的用户模式地址空间的页面之前,应回收磁盘中未由任何进程引用的页面和内存缓存中的页面”表示将它们从“已用”(无效+有效)移到“免费”。

这将更详细地说明内存管理:活动列表和非活动列表如何工作,页面如何在它们之间移动https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

我相信内核也有用于数据结构的内存,我相信这显示为“ slab 1049464 kb”(〜1 GB),但是对于将其单独计算并不肯定。


只是想补充一下,过去我曾遇到过一个系统运行不佳的情况,这是因为编写不良的应用程序分配了共享内存段,但没有释放它们。即使使用共享内存的所有进程都死了,共享内存段仍会保留。这不是Linux,但在Linux中也可能如此。如上所述,有关详细信息,请参阅ipcs。请参见makelinux.net/alp/035,它表示您需要显式释放分配的共享内存。
ssl 2014年

1
我不了解您答案的全部内容,但是“无效的内存可能来自已终止的进程”绝对是错误的。Userland内存有两种形式:映射的或匿名的。映射的内存始终可以回收,因为可以从文件中重新加载数据。如果将匿名内存换出,则可以对其进行回收。非活动内存是很适合回收的内存。但是内容必须在文件中或在某处交换,因为该内存仍在使用中。进程死亡时,其内存将变为空闲,并且不再考虑活动+非活动状态。
吉尔(Gilles)“所以,别再邪恶了”

1
一些参考:什么会导致不活动内存增加以及如何回收它?服务器故障时;来自Red Hat的旧的但仍然适用的技巧。还有您引用的Bhavin Turakhia的文章;这个问题尚不明确,但确实在“了解PFRA”部分中说明了有关匿名页面和映射页面的内容。
吉尔斯(Gillles)“所以-别再邪恶了”

我想到了本文中没有被进程引用的不活动页面:kernel.org/doc/gorman/html/understand/understand013.html 尽管我认为它可能是仍在运行的进程释放的页面。“从LRU列表中回收页面”部分
ssl 2014年

但这可能仅指交换缓存中的页面吗?
ssl 2014年

-2

您是否完全使用NFS?无论哪种方式都
可能值得运行slabtop -o,但这种情况nfs_inode_cache可能会失控。


-4

您应该查看的数字是swap,在输出中为“ 0”,这意味着您还没有用完RAM。只要您的系统不交换内存,就不必担心其他数字,无论如何这些数字都很难解释。

编辑:好的,看来我的回答被认为是神秘的而不是简洁的。因此,让我详细说明。

我猜这里的主要问题是解释top / ps的输出,这不是很准确。例如,由于未按预期计算出对同一共享库的多次使用,请参见例如http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

但是,绝对准确的是,如果交换大小恰好为零,则表明系统还没有耗尽内存(尚未)。当然,这是一个很明确的说明,但是要分析系统的实际内存使用情况,top并不是正确的选择。(并且,如果您看的是顶部,请至少对virt或%mem的输出进行排序。)

另请参见 http://elinux.org/Runtime_Memory_Measurement


1
您不必担心系统是否正在交换,那是正常的。您应该担心系统是否交换太频繁(这与使用大量交换空间不同)。本身使用的交换为0的事实本身很奇怪,只有很少的可用物理内存。
吉尔斯(Gillles)“所以-别再邪恶了”

好吧,他的输出表明他的系统根本没有交换。这肯定是最佳交换率。我没有说过小的交换大小是一件好事,但是肯定是零大小。只要系统实际上没有耗尽可用内存,为什么要开始交换?
Echsecutor

不,缺少交换远非最佳。目前尚未使用的程序的内存应进行交换,以便为经常使用的文件的磁盘缓存腾出空间。至于该位刚刚添加有关的输出free,我认为你的意思top-但即使是这样的总和只能是比总(因为共享内存计算多次),而不是更少。
吉尔斯(Gilles)'所以

您所说的总和只能是多少而不是更少?顶部仅显示屏幕上尽可能多的进程,我可以肯定以上并不是所有正在运行的进程,因此它们不会按内存使用情况进行排序,对于“使用了什么内存”的问题,该部分输出毫无用处。
Echsecutor

哦,我不想就何时开始进行交换的最佳时间进行辩论,但是linux服务器的默认设置是不交换内存仅是因为它“目前没有被使用”。
Echsecutor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.