Solaris 10 上的已用内存

Jer*_* C. 11 solaris memory solaris-10 memory-usage

还有一个关于 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
Run Code Online (Sandbox Code Playgroud)

一个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
Run Code Online (Sandbox Code Playgroud)

但是当我做一个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%
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,RSS 值的总和没有达到 15GB 的内存,即使我向它添加了 SWAP 值。

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

如果 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
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

2066 MB used( prstat -Zecho ::memstat | mdb -k结果)
1193 MB free(最高结果)
8859 MB ARC cache( kstat zfs::arcstats:size结果)

这给我们或多或少12 GB的内存,而我的系统有16 GB.
也许我错过了别的东西,但其他的4 GB呢?

jll*_*gre 13

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

# echo ::memstat | mdb -k
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

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

无论如何,仍然有一种方法可以在您的服务器上显示完整的 ARC 大小。

只需运行此命令:

# kstat zfs::arcstats:size
module: zfs                             instance: 0
name:   arcstats                        class:    misc
        size                            273469024
Run Code Online (Sandbox Code Playgroud)

它表明在我的机器上,当前使用 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
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*rtz 4

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

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

内存不是可节省的资源。如果您将 1GB 空闲空间保留一小时,那么您可以使用该数据执行的任何操作都将永远丢失。