Solaris 10上的已用内存


10

关于Solaris 10上的内存的另一个问题。

让我发现,我有672 MB可用内存:

130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle,  3.9% user,  1.0% kernel,  0.0% iowait,  0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap

vmstat的节目我一样的:

kthr      memory            page            disk          faults      cpu
r b w   swap  free  re  mf pi po fr de sr rm s0 s1 s2   in   sy   cs us sy id
0 0 0 564744 687896  3  13  0  0  0  0  0  0  0  0  0  354  667  752  1  1 98

但是当我执行prstat -a -s size时,我得到了:

NPROC USERNAME  SWAP   RSS MEMORY      TIME  CPU
   45 orbixadm 1449M 1592M   9.7%   4:46:53 0.4%
   48 root      146M  160M   1.0%   8:09:49 1.2%
    3 user1      46M  204M   1.2%   0:00:45 0.0%
    9 webservd   46M   14M   0.1%   0:00:00 0.0%
    5 ctxsrvr    28M   32M   0.2%   4:54:51 0.0%
   11 user2      23M   34M   0.2%   0:00:37 0.2%
    4 user3    4840K   11M   0.1%   0:00:01 0.0%
    1 smmsp    1456K 4552K   0.0%   0:00:24 0.0%
    2 daemon   2128K 6224K   0.0%   0:06:32 0.0%
    1 user4    1232K 3608K   0.0%   0:00:00 0.0%
    1 nagios    376K 2472K   0.0%   0:15:18 0.0%

如您所见,即使我向其中添加了SWAP值,RSS值的总和也不会达到15GB。

所以我的问题是:我相信哪个命令?

如果top和vmstat给我很好的结果,我15GB的已用内存在哪里?如果不是,他们为什么向我展示?

编辑:命令的结果: % echo ::memstat | mdb -k

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    1687138             13180   82%
Anon                       137110              1071    7%
Exec and libs               47107               368    2%
Page cache                  95277               744    5%
Free (cachelist)            22248               173    1%
Free (freelist)             69592               543    3%

Total                     2058472             16081
Physical                  2055442             16058

编辑2:

好的,现在我可以看到ARC缓存使用的内存了。
但是有了一些新的测试,现在我有了:

2066 MB usedprstat -Zecho :: memstat | mdb -k结果)
1193 MB free最高结果)
8859 MB ARC cachekstat zfs :: arcstats:size结果)

12 GB当我们的系统具有时,它们或多或少会给我们带来记忆16 GB
也许我错过了其他事情,但是另一个在哪里4 GB呢?


kstat zfs::arcstats:size在您的问题中添加输出。
jlliagre 2012年

Answers:


12

ZFS可能会将您的大部分内存用作ARC缓存。如果您想知道如何使用RAM,请以root用户身份运行以下命令:

# echo ::memstat | mdb -k

在Solaris 10 10/09和更高版本上,显示如下:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      60569               236   16%
ZFS File Data               53270               208   14%
Anon                        41305               161   11%
Exec and libs                5891                23    2%
Page cache                   1190                 4    0%
Free (cachelist)             7006                27    2%
Free (freelist)            212607               830   56%

Total                      381838              1491

如您所见,一行显示了多少RAM用于缓存ZFS文件数据。不幸的是,您正在运行较早的Solaris 10版本,因此memstat不会单独显示此ZFS统计信息。它包含在内核使用的内存中,这很令人困惑。在正常情况下,内核不应使用13 GB的RAM。

无论如何,仍然可以在服务器上显示完整的ARC大小。

只需运行以下命令:

# kstat zfs::arcstats:size
module: zfs                             instance: 0
name:   arcstats                        class:    misc
        size                            273469024

它表明在我的计算机上,当前使用了273 MB RAM来处理ZFS ARC缓存。memstat显示,这273 MB中有208 MB被用作文件缓存。如果应用程序需要,可以根据需要自动释放多达208 MB的RAM。

现在让我们看一下进程的内存使用情况。如果将-Z选项与prstat一起使用,它将在每个进程统计信息下显示每个区域的摘要。在这里,全局(也是唯一的)区域正在使用185 MB的RAM。这应该(大致)匹配所有进程rss列的总和。

# prstat -Z
PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
   741 noaccess  129M  113M sleep   59    0   0:00:35 1,4% java/18
   973 root     5148K  832K run     29    0   0:00:00 0,4% script/1
   972 root     5072K  900K sleep   59    0   0:00:00 0,2% script/1
   998 root     7148K 2812K cpu0    49    0   0:00:00 0,1% prstat/1
   974 root     3456K  968K sleep   49    0   0:00:00 0,1% ksh/1
     5 root        0K    0K sleep   99  -20   0:00:01 0,1% zpool-rpool/37
   241 root     5400K 1608K sleep   59    0   0:00:00 0,0% VBoxService/5
    77 root     7620K 2356K sleep   59    0   0:00:00 0,0% devfsadm/7
   969 root     3372K  936K sleep   59    0   0:00:00 0,0% script/1
   126 root     9664K 2844K sleep   59    0   0:00:00 0,0% nscd/31
   480 root     9420K 2036K sleep   59    0   0:00:00 0,0% sendmail/1
    11 root     9164K 7860K sleep   59    0   0:00:29 0,0% svc.configd/17
     1 root     2504K 1432K sleep   59    0   0:00:00 0,0% init/1
   413 root       15M 9644K sleep   59    0   0:00:00 0,0% fmd/19
   377 root     6536K 2848K sleep   59    0   0:00:02 0,0% inetd/4
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
     0       48  177M  185M    12%   0:01:24 2,5% global

这185 MB对应于memstat输出中两行的总和:“ Anon”是应用程序用于存储数据的RAM,而“ Exec和libs”则是应用程序及其库代码。


谢谢您的回答,命令的结果并没有很详细,但是有必要查看正在使用RAM的内容。
杰里米·C

您可以通过更新问题来添加其输出吗?顺便说一下,您接受的答案实际上有点不正确,因为Solaris将未映射的页面报告为可用RAM,而不是所使用的页面,这就是您抱怨的问题。
jlliagre 2012年

使用命令结果编辑问题。您是对的,我的问题还没有完全得到回答。至少我们可以看到topvmstat的可用内存与:: memstat相同。但是,是否有意思详细说明每个过程的用途?
杰里米·C

您正在使用什么Solaris 10更新(目录/ etc / release),并且正在使用ZFS?
jlliagre 2012年

它是Solaris 10 5/09,是的,我使用ZFS
Jeremy C.

4

内存中充满了从磁盘读取的未映射的数据页。之所以将其保留在内存中,是因为可以再次读取这些文件,并且将数据保留在内存中可以节省磁盘读取的时间。可用内存将永远浪费,因此计算机会尝试尽可能少地占用它们。

例如,假设您运行一个程序。程序终止。该程序仍在内存中,但是由于该程序未运行,因此任何进程都不会使用这些内存页。如果系统不受内存压力,则页面将保留在内存中。如果程序再次运行,这将节省释放它的工作量,而只是为该程序分配更多的内存,然后再次读入它即可。而且,如果其他目的需要使用页面,那么对于系统而言,这仍然是一个胜利,因为将一个内存页面直接从使用中移到另一个页面比将其释放仅使其再次使用要容易得多。

内存不是可保存的资源。如果您将1GB的可用空间留给一个小时,那么用该数据所做的一切都将永远丢失。


感谢您对这个解释得很好的答案。我现在知道为什么我所有的Solaris服务器都使用或多或少90%的RAM。
杰里米·C
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.