在Solaris 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 rbw 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大小时,我得到这个:

 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% 

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

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

如果top和vmstat给我好的结果,我的15GB内存在哪里? 如果没有,为什么他们告诉我?

编辑:命令的结果: % echo ::memstat | mdb -k % 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:

好吧,现在我可以看到ARCcaching使用的内存。
但有了一些新的testing,现在我有:

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

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

ZFS可能将大部分内存用作ARCcaching。 如果您想知道如何使用您的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 

正如你所看到的,有一条线表明有多lessRAM用于cachingZFS文件数据。 不幸的是,您运行的是较早的Solaris 10发行版,因此memstat不会单独显示此ZFS统计信息。 它包含在使用内存的内核中,令人困惑。 在正常情况下内核不应该使用13 GB的内存。

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

只要运行这个命令:

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

它显示在我的机器上,当前使用273 MB的RAM来处理ZFS ARCcaching。 memstat显示从这些273 MB,208 MB被用作文件caching。 如果应用程序需要,可以根据需要自动释放多达208 MB的RAM。

现在让我们看看进程内存使用情况。 如果在prstat中使用-Z选项,则会在每个进程统计信息下显示每个区域的摘要。 这里的全球(也是唯一的)区域使用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”和应用程序及其库代码“Exec和libs”。

内存中充满了从磁盘读取的未映射的数据页面。 它保存在内存中,因为这些文件可能会被再次读取,并保持内存中的数据保存磁盘读取。 自由记忆永远被浪费,所以计算机尽可能less地保留它。

例如,假设你运行一个程序。 程序终止。 程序仍然在内存中,但是由于程序没有运行,所以这些内存页面没有被任何进程使用。 如果系统没有受到内存压力,页面将保存在内存中。 如果程序再次运行,这将节省只需要为程序分配更多内存然后再次读取的function。 如果这些页面是用于其他方面的,那么对于系统来说,这仍然是一个胜利,因为直接从一个用户移动一个内存到另一个内存比让它重新使用更容易。

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