系统管理指南:设备和文件系统

第 21 章 配置其他交换空间(任务)

本章提供安装 Solaris OS 后配置其他交换空间的指导和逐步说明。

以下是本章中的逐步说明列表。

以下是本章中概述信息的列表。

关于交换空间

要确定以下内容,应了解 SunOSTM 交换机制的功能:

交换空间与虚拟内存

Solaris 软件将一些磁盘片用于临时存储而不是用于文件系统。这些片称为交换片。当系统没有足够的物理内存来处理当前进程时,会将交换片用作虚拟内存存储区域。

虚拟内存系统将磁盘上文件的物理副本映射到内存中的虚拟地址。文件系统中的普通文件或交换空间可以备份包含这些映射的数据的物理内存页面。如果交换空间对内存进行了备份,则该内存称为匿名内存,因为没有为备份内存的磁盘空间指定标识。

Solaris OS 使用的虚拟交换空间概念是指,匿名内存页面和实际备份这些页面的物理存储(或磁盘备份交换空间)之间的层。系统的虚拟交换空间等于其所有物理(磁盘备份)交换空间与当前部分可用物理内存的和。

虚拟交换空间具有以下优点:

交换空间与 TMPFS 文件系统

在 Solaris 环境中,TMPFS 文件系统由 /etc/vfstab 文件中的项自动激活。TMPFS 文件系统将文件及其关联信息存储在内存中(存储在 /tmp 目录中)而不是磁盘上,从而加快了访问这些文件的速度。对于大量使用 /tmp 的应用程序(例如编译器和 DBMS 产品),此功能可显著增强这些应用程序的性能。

TMPFS 文件系统从系统的交换资源分配 /tmp 目录中的空间。此功能意味着,用尽 /tmp 目录中的空间时,也就用尽了交换空间。因此,如果应用程序大量使用 /tmp 目录,而且您未监视交换空间使用情况,则系统可能会用尽交换空间。

如果要使用 TMPFS,但交换资源有限,请采用以下措施:

将交换空间作为转储设备

转储设备通常是为存储系统崩溃转储信息而保留的磁盘空间。缺省情况下,会将系统的转储设备配置为交换片。如有可能,应将备用磁盘分区配置为专用转储设备,以便为崩溃转储提供增强的可靠性,并缩短系统出现故障后重新引导的时间。可以使用 dumpadm 命令配置专用转储设备。有关更多信息,请参见《系统管理指南:高级管理》中的第 24  章 “管理系统崩溃转储信息(任务)”

如果使用卷管理器(例如 Solaris Volume Manager)管理磁盘,请勿将专用转储设备配置为受其控制。建议由 Solaris Volume Manager 控制交换区域。但是,出于可访问性和性能原因,应将另一个磁盘配置为不受 Solaris Volume Manager 控制的专用转储设备。

交换空间和动态重新配置

建议分配足够的交换空间,以便在动态重新配置期间支持出现故障的 CPU 或系统板。否则,CPU 或系统板故障可能会导致主机或域重新引导时内存不足。

如果此其他交换空间不可用,则一个或多个应用程序可能会因内存不足而无法启动。此问题需要进行手动干预,以便添加其他交换空间或重新配置这些应用程序的内存使用。

如果已分配其他交换空间来处理重新引导时内存的潜在不足,则所有需要大量内存的应用程序可照常启动。这意味着,用户可以使用系统,但系统速度可能会因一些其他交换而变慢。

有关更多信息,请参见硬件动态重新配置指南。

如何了解是否需要更多交换空间?

使用 swap -l 命令可确定系统是否需要更多交换空间。

例如,以下 swap -l 输出说明此系统的交换空间几乎完全占用或者已经 100% 分配。


% swap -l

swapfile             dev   swaplo blocks   free

/dev/dsk/c0t0d0s1   136,1      16 1638608    88

当系统的交换空间为 100% 分配时,会暂时锁定应用程序的内存页面。虽然不会出现应用程序错误,但可能会降低系统性能。

有关将更多交换空间添加到系统的信息,请参见如何创建交换文件并使其可用

与交换相关的错误消息

这些消息指示应用程序尝试获取更多的匿名内存。但是,没有剩余的交换空间对其进行备份。


application is out of memory

 

malloc error O

 

messages.1:Sep 21 20:52:11 mars genunix: [ID 470503 kern.warning] 

WARNING: Sorry, no swap space to grow stack for pid 100295 (myprog)

与 TMPFS 相关的错误消息

如果写入文件时无法分配页面,则会显示以下消息。如果 TMPFS 尝试写入的量超出其允许的量,或当前执行的程序使用了大量内存,则可能会出现此问题。


directory: File system full, swap space limit exceeded

以下消息表明,TMPFS 尝试创建新的文件或目录时物理内存不足:


directory: File system full, memory allocation failed

有关从与 TMPFS 相关的错误消息恢复的信息,请参见 tmpfs(7FS)

如何分配交换空间

最初,交换空间是在 Solaris 安装过程中分配的。如果使用安装程序的磁盘片自动布局,且不手动更改交换片的大小,则 Solaris 安装程序会分配 512 MB 的缺省交换区域。

从 Solaris 9 发行版开始,安装程序从第一个可用磁盘柱面(通常为柱面 0)开始分配交换空间。在缺省磁盘布局中,这种放置方法为根 (/) 文件系统提供了最大的空间,并允许在升级时扩展根 (/) 文件系统。

有关分配交换空间的一般规则,请参见规划交换空间

通过创建交换文件,可以将其他交换空间分配给系统。有关创建交换文件的信息,请参见添加更多交换空间

交换区域和 /etc/vfstab 文件

安装系统后,交换片和交换文件将在 /etc/vfstab 文件中列出。在引导系统时,它们将由 /sbin/swapadd 脚本激活。

/etc/vfstab 文件中交换设备的项包含以下内容:

激活交换文件之前,必须挂载包含交换文件的文件系统。因此,在 /etc/vfstab 文件中,应确保挂载文件系统的项位于激活交换文件的项之前。

规划交换空间

确定交换空间大小的最重要因素是系统的软件应用程序的要求。例如,大型应用程序(例如计算机辅助设计模拟器、数据库管理产品、事务监视器和地质分析系统)占用的交换空间可高达 200–1000 MB。

请咨询应用程序供应商,以了解其应用程序的交换空间要求。

如果无法通过咨询应用程序供应商确定交换空间要求,请根据系统类型使用以下一般规则来分配交换空间。

系统类型 

交换空间的大小 

专用转储设备的大小 

物理内存约为 4 GB 的工作站 

1 GB 

1 GB 

物理内存约为 8 GB 的中型服务器 

2 GB 

2 GB 

物理内存约为 16 到 128 GB 的高端服务器 

4 GB 

4 GB 

除这些一般规则外,还应考虑为以下项分配交换空间或磁盘空间:

监视交换资源

/usr/sbin/swap 命令用于管理交换区域。-l-s 这两个选项显示有关交换资源的信息。

使用 swap -l 命令可识别系统的交换区域。在 swapfile 列下会列出已激活的交换设备或文件。


# swap -l

swapfile             dev  swaplo blocks   free

/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528

使用 swap -s 命令可监视交换资源。


# swap -s

total: 57416k bytes allocated + 10480k reserved = 67896k used, 

833128k available

used 值与 available 值的和等于系统上的总交换空间,其中包括部分物理内存和交换设备(或文件)。

可以使用可用交换空间量和已用交换空间量(在 swap -s 输出中显示)监视在一段时间内交换空间使用情况的变化。如果系统性能良好,请使用 swap -s 确定可用交换空间量。如果系统性能下降,请检查可用交换空间量以确定其是否已下降。然后,可以确定对系统所做的哪些更改导致交换空间使用量增加。

使用此命令时,请记住可用于交换的物理内存量会因内核和用户进程的锁定和物理内存的释放而动态变化。


注 –

swap -l 命令以 512 字节块为单位显示交换空间。swap -s 命令以 1024 字节块为单位显示交换空间。如果将 swap -l 输出中的块累加,然后将其转换为 KB,则结果小于 used + available(在 swap -s 输出中显示)。原因是 swap -l 在计算交换空间时不包括物理内存。


下表概述了 swap -s 命令的输出。

表 21–1 swap -s 命令的输出

关键字 

说明 

bytes allocated

当前已分配作为备份存储(磁盘备份交换空间)的总交换空间量(以 1024 字节块为单位)。 

reserved

当前未分配、但内存已请求供将来使用的总交换空间量(以 1024 字节块为单位)。 

used

已分配或保留的总交换空间量(以 1024 字节块为单位)。 

available

当前可用于将来进行预留和分配的总交换空间量(以 1024 字节块为单位)。 

添加更多交换空间

随着系统配置的更改和新软件包的安装,可能需要添加更多交换空间。添加更多交换空间的最简单方法是,使用 mkfileswap 命令将部分现有 UFS 或 NFS 文件系统指定为补充交换区域。使用这些命令(在以下各节中介绍)可以添加更多交换空间而不必对磁盘重新分区。

添加更多交换空间的其他方法是,对现有磁盘重新分区或添加其他磁盘。有关如何对磁盘重新分区的信息,请参见第 11 章,管理磁盘(概述)

创建交换文件

创建交换文件涉及以下常规步骤:

mkfile 命令

mkfile 命令创建一个适合用作已挂载 NFS 交换区域或本地交换区域的文件。设置粘滞位,并用零填充文件。可以字节为单位(缺省设置)指定交换文件的大小,或者分别使用 kbm 后缀以 KB、块或 MB 为单位指定交换文件的大小。

下表说明 mkfile 命令选项。

表 21–2 mkfile 命令的选项

选项 

说明 

-n

创建空文件。标注大小。但是,在将数据写入磁盘块之前,不会分配磁盘块。 

-v

报告已创建文件的名称和大小。 


注 –

应仅在创建 NFS 交换文件时使用 -n 选项。


Procedure如何创建交换文件并使其可用

  1. 成为超级用户。

    无需超级用户权限,即可创建交换文件。但是,为避免意外覆写,超级用户应该是交换文件的属主。

  2. 如果需要,请为交换文件创建一个目录。

  3. 创建交换文件。


    # mkfile nnn[k|b|m] filename
    

    创建了具有指定 filename 的交换文件,且其大小为 nnn(以 KB、字节或 MB 为单位)。

  4. 激活交换文件。


    # /usr/sbin/swap -a /path/filename
    

    必须使用绝对路径名指定交换文件。添加了交换文件,该交换文件在取消挂载文件系统、重新引导系统或删除交换文件之前可用。请记住,将某个进程或程序交换至交换文件时,不能取消挂载文件系统。

  5. 将交换文件的项添加到指定该文件全路径名的 /etc/vfstab 文件,并将 swap 指定为文件系统类型。


    /path/filename   -      -       swap     -     no     -
  6. 检验是否添加了交换文件。


    $ /usr/sbin/swap -l
    

示例 21–1 创建交换文件并使其可用

以下示例说明如何创建名为 /files/swapfile 的 100 MB 交换文件。


# mkdir /files

# mkfile 100m /files/swapfile

# swap -a /files/swapfile

# vi /etc/vfstab

(An entry is added for the swap file):

/files/swapfile   -      -       swap     -     no     -

# swap -l

swapfile             dev  swaplo blocks   free

/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528

/files/swapfile        -       16 204784  204784

删除不用的交换文件

如果具有不需要的交换空间,则可以删除它。

Procedure如何删除不需要的交换空间

  1. 成为超级用户。

  2. 删除该交换空间。


    # /usr/sbin/swap -d /path/filename
    

    删除了交换文件名称,以便它不再可用于交换。文件本身并没有删除。

  3. 编辑 /etc/vfstab 文件,并删除交换文件的项。

  4. 恢复磁盘空间以便可以将它用于其他目的。


    # rm /path/filename
    

    如果交换空间是一个文件,则删除它。或者,如果交换空间位于单独的片上,并确信不再需要它,则建立新的文件系统并挂载该文件系统。

    有关挂载文件系统的信息,请参见第 19 章,挂载和取消挂载文件系统(任务)

  5. 检验交换文件是否不再可用。


    # swap -l
    

示例 21–2 删除不需要的交换空间

以下示例说明如何删除 /files/swapfile 交换文件。


# swap -d /files/swapfile

# (Remove the swap entry from the /etc/vfstab file)

# rm /files/swapfile

# swap -l

swapfile             dev  swaplo  blocks   free

/dev/dsk/c0t0d0s1   136,1      16 1638608 1600528