"free" 显示的 Linux 交换空间数量与 "smem" 不同。

4

我正在尝试分析交换空间的来源,并查看smem显示,我得到了完全不同的交换空间使用量。

Free显示如下:

[root@server1 ~/smem-1.3]# free -k
             total       used       free     shared    buffers     cached
Mem:      24554040   24197360     356680          0     510200   14443128
-/+ buffers/cache:    9244032   15310008
Swap:     20980880    2473120   18507760

并且smem显示:

  PID User     Command                         Swap      USS      PSS      RSS
...
18829 oracle   oracle_1 (LOCAL=NO)             0     3.9M    98.3M    10.1G
18813 oracle   oracle_1 (LOCAL=NO)             0     3.9M    98.6M    10.1G
18809 oracle   oracle_1 (LOCAL=NO)             0     4.1M    99.2M    10.0G
28657 oracle   ora_lms0_1                 56.0K    54.1M   100.3M     4.2G
29589 oracle   ora_lms1_1                964.0K    69.7M   118.9M     4.5G
29886 oracle   ora_dbw1_1                  5.7M    20.8M   130.9M    10.2G
29857 oracle   ora_dbw0_1                  4.2M    22.6M   133.0M    10.3G
11075 ccm_user /usr/java/jre1.6/bin/java -   197.8M   133.9M   135.9M   140.7M
21688 bsuser   /usr/local/java/bin/java -c    30.7M   145.1M   147.2M   152.1M
29930 oracle   ora_lck0_1                  2.3M    58.6M   169.8M     1.0G
29901 oracle   ora_smon_1                     0    78.0M   195.6M     4.3G
15604 oracle   /var/oragrid/jdk/jre//bin/j    65.4M   253.9M   254.3M   262.2M
-------------------------------------------------------------------------------
  359 10                                     678.8M     2.5G    13.5G     1.2T

为什么free显示“2.4G”,而smem只显示了“679M”?其中一个显示了错误的结果。

我需要找出剩下的1.8G在哪里,或证明free正在显示错误的结果。

最后但并非最不重要的是,内核版本是2.6.18。


这是一个常见问题:所谓“缺失”的内存被用于文件系统缓存。 - Basile Starynkevitch
1
谢谢您的回复。如果您能详细说明您的评论,帮助我展示“缓冲区在哪里以及是什么”,那就太好了。 - user2360915
请查看http://www.linuxatemyram.com/。 - Basile Starynkevitch
我知道那个网站,但它仍然没有意义。应用程序正在占用678M的SWAP,而free命令显示已使用2.4G的SWAP。如何知道在free输出中使用了1.8G的内容是什么。 - user2360915
1个回答

1

主要问题是RSS(驻留集大小)和PSS(比例集大小)。根据http://www.selenic.com/smem/所说,“PSS测量每个应用程序在每个共享区域的‘公平份额’,以给出一个实际的度量”。另一方面,RSS通过将多个应用程序的共享内存区域计算为它们自己的来进行过度估计。这就是为什么你会看到差异的原因。简单地说,smem可以区分应用程序的共享内存,而不是将共享区域视为每个应用程序自己的!


1
我可以理解RSS之所以重要是因为共享内存,而PSS则以某种方式显示每个应用程序实际使用的内存量。现在问题是,“Free”如何说2.4G被交换出去,而smem只能说“678M”。我认为free显示未使用的共享页面交换出去的数量。对吗?如果是这样,我们是否在这里说“Free”错误地显示了交换的内存? - user2360915
对于活动内存没有任何困惑,但是关于交换仍然有一些困惑。 - user2360915
是的,但如果您查看我发布的数据,Free显示已使用“2473120”,但smem显示已使用“678.8M”。这就是我不理解的地方。为什么会有如此巨大的差异?“free”正确吗?“smem”正确吗?我该如何找出真正使用交换空间的程序? - user2360915
1
这正是我在第一篇帖子中试图回答的问题!例如,假设您有两个程序名称为“sam1”和“sam2” - 它们使用共享库“shared.so”,sam1和sam2的大小为5k,“shared.so”的大小为10k。让您的系统具有50k内存。当您运行free(sam1和sam2正在运行)时,它将显示已使用30k(sam1+shared.so = 15 + sam2+shared.so = 15)。如果您运行smem,则会看到已使用20k(sam1+sam1+shared.so = 20)。共享对象只加载一次,因此需要计算一次,而不是两次(这是free所做的错误之处)。我表达清楚了吗? - rakib_
2
不得不反驳Rakib的评论。我认为有两个可能的因素可以解释OP所问的差异。1)如果由!= root启动,则“smem”只能报告用户的进程2)它仅记录进程,即不包括页面缓存。此外,根据我的有限知识,75%的共享内存非常不可能。而且为什么free会区分RAM的已用共享内存(在我的情况下显示为free v3.3.11),然后将它们混合到交换空间中呢? - tuk0z
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接