我的Oracle Solaris 11.3
内存 (RAM) 为 128 GB,交换空间为 80 GB。
我想限制交换空间的使用(不是其大小,只是使用情况)。
我知道在更现代的 Linux 发行版中,例如Ubuntu
、Fedora
、CentOs
、 ... 有一个文件/proc/sys/vm/swappiness
,您可以在其中编辑并将其数字从 0 更改为 100。0 表示使用量较少,100 表示交换空间使用量较多。但不幸的是, /proc
named as中没有目录sys
(在Solaris 10 和11.3 上)。
现在:
我应该在哪里找到/proc/sys
或swappiness
归档?如果solaris上不存在这个文件我应该如何限制swap的使用?
PS:
目前我的内存使用量约为 30%,但每当我启动一个新进程时,它都会为其分配交换空间,并且无法正确启动该进程。
echo "::memstat" | mdb -k
结果如下:
Page Summary Pages Bytes %Tot
----------------- ---------------- ---------------- ----
Kernel 852964 6.5G 5%
ZFS Metadata 156226 1.1G 1%
ZFS File Data 2675261 20.4G 16%
Anon 4342304 33.1G 26%
Exec and libs 1764 13.7M 0%
Page cache 28121 219.6M 0%
Free (cachelist) 18607 145.3M 0%
Free (freelist) 8687248 66.2G 52%
Total 16777216 128G
结果swap -l
是:
swapfile dev swaplo blocks free
/dev/zvol/dsk/rpool/swap 303,1 16 8388592 8388592
结果prstat -Z
是:
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
0 96 97G 33G 26% 26:29:09 0.3% global
答案1
我想限制交换空间的使用(不是其大小,只是使用情况)。
您无法限制 Solaris 中的交换预留。
进程使用的 RAM 的几乎每个字节都是保证Solaris 提供了某种可用的持久后备存储。 (Solaris 上有一些例外,例如某些类型的共享内存,它们不需要交换保留,因为它们无法换出。Oracle 数据库 SGA 等实现使用这些功能。)
内存映射文件(例如可执行文件和共享对象)通常使用磁盘上的实际文件作为后备存储,因此根本不使用交换空间。大多数其他内存使用都需要后备存储。例如,如果一个进程向内核请求 2 GB 堆但从未实际使用它,则会导致交换空间保留 2 GB,因为 Solaris 保证如果进程请求内存,它将获得它。没有 OOM 杀手可以终止生产数据库服务器上的数据库进程或处理客户订单的在线 Web 服务器上的 Web 服务器...
在 Solaris 上,如果您请求内存并且内核说您可以拥有它,您就会得到它。即使您直到很长一段时间后才真正使用它。这意味着,如果您要求它,内核必须确保有一个地方可以放置它,如果将来由于任何原因必须将其换出。
在“我说你可以拥有这个内存,这意味着你将要无论如何都能够访问它”范式,而不是“我说你可以拥有这段记忆,但我对你撒了谎,现在你已经尝试使用它,我要杀了你”范式,而成本是看起来交换使用量过高。
要查看进程的交换空间使用情况,可以使用以下pmap -S
命令:
bash-4.1$ pmap -S $$
4622: /usr/bin/bash
Address Kbytes Swap Mode Mapped File
0000000000400000 1412 - r-x---- bash
0000000000571000 40 40 rw----- bash
000000000057B000 24 24 rw----- bash
0000000EC09E6000 236 236 rw----- [ heap ]
00007FF0C8590000 304 - r-x---- libcurses.so.1
00007FF0C85EC000 20 20 rw----- libcurses.so.1
00007FF0C85F1000 16 16 rw----- libcurses.so.1
00007FF0C8600000 6756 - r-x---- en_US.UTF-8.so.3
00007FF0C8CA9000 8 8 rw----- en_US.UTF-8.so.3
00007FF0C8CD0000 32 - r-x---- libgen.so.1
00007FF0C8CE8000 4 4 rw----- libgen.so.1
00007FF0C8CF0000 64 64 rwx---- [ anon ]
00007FF0C8D10000 64 64 rwx---- [ anon ]
00007FF0C8D2D000 4 - rwxs--- [ anon ]
00007FF0C8D30000 64 - r-x---- methods_unicode.so.3
00007FF0C8D40000 4 4 rw----- methods_unicode.so.3
00007FF0C8D50000 24 24 rwx---- [ anon ]
00007FF0C8D60000 1816 - r-x---- libc.so.1
00007FF0C8F36000 68 68 rw----- libc.so.1
00007FF0C8F47000 8 8 rw----- libc.so.1
00007FF0C8F50000 64 64 rw----- [ anon ]
00007FF0C8F6C000 352 - r-x---- ld.so.1
00007FF0C8FD4000 16 16 rwx---- ld.so.1
00007FF0C8FD8000 4 4 rwx---- ld.so.1
FFFF80E6271AF000 20 20 rw----- [ stack ]
---------------- ---------- ----------
total Kb 11424 684
注意这一行:
0000000000400000 1412 - r-x---- bash
该Swap
列表明特定的内存映射根本不需要使用交换区。这是bash
由磁盘文件本身支持的可执行文件的一部分/usr/bin/bash
。
但这行:
0000000000571000 40 40 rw----- bash
使用 40 kb 交换空间。它可能是从 映射的数据段/usr/bin/bash
,但由于它是可修改的数据(注意权限rw
),后备存储不能是不可修改的/usr/bin/bash
磁盘文件,因此它获得 40 kb 交换保留。
请注意,所有heap
、anon
和stack
映射均由交换空间支持。
底线:
在 Solaris 上,如果您不想用完所有交换空间而无法启动新进程,则不要让进程请求它们实际上并未使用的内存。
或者创建一个更大的交换分区。