还有一个关于 Solaris 10 内存的问题。
A顶部显示我有 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
A状态监测向我展示了相同的内容:
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 大小我明白了:
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
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 used
(prstat -Z和回显::memstat | mdb -k结果)
1193 MB free
(顶部结果)
8859 MB ARC cache
(kstat zfs::arcstats:大小结果)
这会给我们更多或更少12 GB
的内存,而我的系统有16 GB
。
也许我错过了其他东西,但其他的在哪里4 GB
?
答案1
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 可以根据需求自动释放。
现在让我们看看进程的内存使用情况。如果您使用 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”是应用程序用于存储数据的 RAM,“Exec and libs”是应用程序及其库代码。
答案2
内存中充满了从磁盘读取的未映射数据页。它之所以保存在内存中,是因为这些文件可能会被再次读取,而将数据保存在内存中可以节省磁盘读取。空闲内存永远被浪费,因此计算机会尽量少保留空闲内存。
例如,假设您运行一个程序。程序终止。程序仍在内存中,但由于程序未运行,因此这些内存页面不会被任何进程使用。如果系统没有内存压力,则这些页面将保留在内存中。如果程序再次运行,这将节省释放内存的工作量,而不必为程序分配更多内存,然后再次读入。如果其他操作需要这些页面,这对系统来说仍然是有利的,因为将一页内存直接从使用状态移至另一页比释放内存后再使用要容易得多。
内存不是可节省的资源。如果您将 1GB 内存闲置一小时,那么您可以用这些数据执行的任何操作都将永远丢失。