如何限制 Solaris 中交换区的使用?

如何限制 Solaris 中交换区的使用?

我的Oracle Solaris 11.3内存 (RAM) 为 128 GB,交换空间为 80 GB。

我想限制交换空间的使用(不是其大小,只是使用情况)。

我知道在更现代的 Linux 发行版中,例如UbuntuFedoraCentOs、 ... 有一个文件/proc/sys/vm/swappiness,您可以在其中编辑并将其数字从 0 更改为 100。0 表示使用量较少,100 表示交换空间使用量较多。但不幸的是, /procnamed as中没有目录sys(在Solaris 10 和11.3 上)。

现在:
我应该在哪里找到/proc/sysswappiness归档?如果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 交换保留。

请注意,所有heapanonstack映射均由交换空间支持。

底线:

在 Solaris 上,如果您不想用完所有交换空间而无法启动新进程,则不要让进程请求它们实际上并未使用的内存。

或者创建一个更大的交换分区。

相关内容