Solaris Swap Space Tips

最近被问到Solaris上的Space和Memory信息,发现很多信息不一致,比如top看到的swap和memory信息跟vmstat看到的信息不同,如何知道具体服务器用了多少swap,还有多少swap?实际物理内存到底是多少?做了一点功课,总结一下:

首先Solaris上的Swap跟普通的Linux上的swap机制有一点不同,Solaris上的swap用的是一个Virtual Swap Space概念,原因如下:

假设系统当前还有可用的内存空间为30M,而只剩下10M的Swap空间了,这时,如果有一个进程开始运行并企图执行Malloc(15*1024*1024)的命令(分配15M空间),这个进程会因为这个命令而失败。

为了弥补这个缺陷,Sun为Solaris 2 以后的版本设计了虚拟Swap空间。所谓虚拟的Swap空间,概念其实很简单,swap空间再也不是单指硬盘的分区或文件。虚拟Swap空间包含两个部分:部分物理内存和传统上的Swap分区。经过适当的配置,可以使系统需要Swap空间时,先使用内存部分的swap空间,如果内存部分的swap空间不够,再使用磁盘部分的Swap空间。这样,也许你硬盘上的Swap空间很少得到使用了,甚至根本不需要Swap分区。

但是,还有需要注意的就是,

并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap会不堪重负),有相当一部分的数据直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少打开一个文件,那就是运行程序本身),当这些程序的内存空间需要交换出去时,文件部分的数据就没有必要放到Swap空间中了,如果是读文件操作,那么内存数据直接就释放了,不需要交换出来,因为下次需要时,直接从文件系统就能恢复; 如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc(3C)和new函数生成的对象的数据则不同,需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称为“匿名”(Anonymous)的内存数据,这类数据还包括堆栈中的一些状态和变量数据等,所以说, Swap空间是“匿名”数据的交换空间。

看了一堆的理论解释,有点糊涂,还是用数字来说话吧,在Solaris下,swap命令是用来查看当前系统中的swap信息的。
之前一直理解的-l 参数和-s参数表达的是同样的意思,其实区别就在这里,一个查看的是物理的swap space,一个是当前系统的virtual swap space,弄清楚这个,前面的就好解释了。

# swap -l
查看的是物理交换分区
#swap -s
查看的是虚拟交换空间

虚拟交换空间=物理交换分区+部分物理内存 (这里的部分物理内存,我理解为当前free的physical内存,不知道是否确切?)

比如我一台机器,有8G物理内存(可以通过prtdiag | grep Mem得到)

# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c2t1d0s0 118,32 16 71127152 71127152
这里配置了一个swap device, 大小是36G,注意上面的单位是block, 1block=512byte

# swap -s
total: 1831680k bytes allocated + 546192k reserved = 2377872k used, 39440480k available
#
这里看到的系统当前的可用的virtual swap space是39G,已经使用2G多。从下面的计划可以验证这个

vmstat可以看到当前的的free memory

71127152/2 ( swap device ) + free physical memory (8G – 5237240) = 40800816 (virtual swap space)

从swap -s得到的结果是 2377872k+39440488k =41818360

两者是基本相等的。进一步验证了这个计算是正确的。

另外需要说明几点:

1 另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘I/O的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡I/O的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间位于等待状态,效率很低,用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢,这说明,瓶颈在I/O上,依靠提高CPU的速度是解决不了问题的。

2 虚拟Swap空间与 /tmp目录有相当大的关系。Sun在实现/tmp目录时,充分考虑了应用程序运行的效率。许多应用程序,特别是数据库服务都会频繁使用/tmp目录作为临时数据保存区,而Solaris将/tmp目录下的文件都放在内存中而不是硬盘里,这样会大大提高应用程序的效率。

当系统的swap 不够的时候,可以通过两种方式增加:swap device或者swap file,下面就说一下如何通过命令的方式增加swap file:

# mkdir /files
# mkfile 24m /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/c0t2d0s1 32,17 8 205624 192704
/files/swapfile – 8 40952 40952

相反的,删除一个swap file的方法在下面。

# swap -d /files/swapfile
# (Remove the deleted swap entry from the /etc/vfstab file)
# rm /files/swapfile
# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c0t2d0s1 32,17 8 205624 192720

详细的note,也可以参考这里或者Solaris的官方文档

This entry was posted in 主机 and tagged . Bookmark the permalink.

One Response to Solaris Swap Space Tips

  1. Pingback: Solaris IPMP

Leave a Reply

Your email address will not be published. Required fields are marked *