Solaris性能监控的Swap空间管理
网络整理 - 06-30
随着电子商务如火如荼的开展网站服务器的性能变得尤其重要一旦服务器的能力不能满足用户的需要就会对用户的服务大打折扣那么就需要对服务器进行升级扩容但是有些时候只需对服务器进行一些适当的性能调整便可以越过性能的瓶颈大大提高服务器的吞吐能力从而减少服务器升级的费用
本文介绍了在Solaris平台上Swap(交换)空间的基本概念实现的原理以及对Swap(交换)空间进行监控的方法和调整的策略
什么是SWAP(交换)空间
对于一般的Solaris系统管理员来说很少会接触Swap(交换)空间在他们看来Swap区只不过是磁盘上的一两个分区或是几个Swap(交换)文件当系统没有足够的物理内存来处理当前进程的时候就利用Swap(交换)空间作为虚拟内存的临时存储空间这种说法从技术角度来说是没有错的但Solaris在实现Swap时有其非常独特的地方
SWAP空间作用
众所周知现代操作系统都实现了虚拟内存这一技术不但在功能上突破了物理内存的限制使程序可以操纵大于实际物理内存的空间更重要的是虚拟内存是隔离每个进程的安全保护网使每个进程不受其他程序的干扰
Swap空间的作用可简单描述为当系统的物理内存不够用的时候就需要将物理内存中的一部分空间释放出来以供当前运行的程序使用那些被释放的空间可能来自一些很长时间没有什么操作的程序这些被释放的空间被临时保存到Swap空间中等到那些程序要运行时再从Swap中恢复保存的数据到内存中这样系统总是在物理内存不够时才进行Swap交换这种现象对于计算机使用者是经常遇到的
有一点要声明的是并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话Swap会不堪重负)有相当一部分的数据直接交换到文件系统例如有的程序会打开一些文件对文件进行读写(其实每个程序都至少打开一个文件那就是运行程序本身)当这些程序的内存空间需要交换出去时文件部分的数据就没有必要放到Swap空间中了如果是读文件操作那么内存数据直接就释放了不需要交换出来因为下次需要时直接从文件系统就能恢复;如果是写文件只需要将变化的数据保存到文件中以便恢复但是那些用malloc(C)和new函数生成的对象的数据则不同需要Swap空间因为它们在文件系统中没有相应的储备文件因此被称为匿名(Anonymous)的内存数据这类数据还包括堆栈中的一些状态和变量数据等所以说Swap空间是匿名数据的交换空间
Swap的配置对性能的影响
太多的Swap空间会浪费磁盘的空间而太少的Swap空间系统则会发生错误
如果系统的物理内存用光了你的系统就会跑得慢但仍能运行如果Swap空间用光了那么系统就会发生错误例如Web服务器能根据不同的请求数量衍生出多个服务进程(或线程)如果Swap空间用完则服务进程无法进动通常会出现application is out of memory的错误严重时会造成服务进程的死锁因此Swap空间的分配是很重要的
通常情况下Swap空间应大于或等于物理内存的大小最小不应小于M通常Swap空间的大小应是物理内存的-倍(Solaris 以上的版本有所变化见下文)但根据不同的应用应有不同的配置如果是小的桌面系统只需要较小的Swap空间而大的服务器系统则视情况不同需要不同大小的Swap空间特别是数据库服务器和Web服务器会随着访问量的增加对Swap 空间的要求也会增加具体配置参见各自服务器产品的说明
另外Swap分区的数量对性能也有很大的影响因为Swap交换的操作是磁盘I/O的操作如果有多个Swap交换区Swap空间的分配会以轮流的方式操作于所有的Swap这样会大大均衡I/O的负载加快Swap交换的速度如果只有一个交换区所有的交换操作会使交换区变得很忙使系统大多数时间位于等待状态效率很低用性能监视工具就会发现此时的CPU并不很忙而系统却慢这说明瓶颈在I/O上依靠提高CPU的速度是解决不了问题的
性能监视
Swap空间的分配固然很重要而系统在运行时的性能监控却更加有价值通过性能监视工具可以检查系统的各项性能指标找到系统性能的瓶颈本文只介绍一下在Solaris下和Swap相关的一些命令和用途
最常用的是Vmstat命令在大多数Unix平台下都有此命令此命令可以查看大多数性能的指标
另外使用swap -s 也能简单的查看当前swap资源的使用情况例如
# swap -s
total: k bytes allocated + k reserved = k used k available
能够方便的看出swap空间的已用和未用资源的大小应该使Swap保持%的负载以下才能保证系统的良好性能
Solaris中Swap的特点
虚拟Swap空间
本来Swap空间就是为虚拟内存服务的现在Solaris的Swap空间也成为虚拟这到底是怎么回事呢?
让我们看一个例子就明白了当在Solaris 以前版本的Solaris(或其它Unix 如Linux)上编程时经常会出现一个问题
假设系统当前还有可用的内存空间为M而只剩下M的Swap空间了这时如果有一个进程开始运行并企图执行Malloc(**)的命令(分配M空间)这个进程会因为这个命令而失败
为什么呢?系统不是有M可用的内存空间吗?原因在于你的Swap空间不足系统认为你在分配空间以后没有能力(空间)在发生页面交换时将这部分数据保存起来因此认为你没有资格分配这块空间这不是太不公平了吧!也许这M空间根本不用交换当前系统可是还有M内存空间的富余啊!
还有更不公平的呢?有些大型系统配备了海量的内存G或G配了这么多内存就是为了避免交换提高运行速度可是系统还要为这个系统分配并不需要的Swap空间占用了大量磁盘资源
为了弥补这个缺陷Sun为Solaris 以后的版本设计了虚拟Swap空间所谓虚拟的Swap空间概念其实很简单swap空间再也不是单指硬盘的分区或文件虚拟Swap空间包含两个部分部分物理内存和传统上的Swap分区经过适当的配置可以使系统需要Swap空间时先使用内存部分的swap空间如果内存部分的swap空间不够再使用磁盘部分的Swap空间这样也许你硬盘上的Swap空间很少得到使用了甚至根本不需要Swap分区
Swap空间与TMPFS文件系统的关系
你知道吗?虚拟Swap空间与 /tmp目录有相当大的关系Sun在实现/tmp目录时充分考虑了应用程序运行的效率许多应用程序特别是数据库服务都会频繁使用/tmp目录作为临时数据保存区而Solaris将/tmp目录下的文件都放在内存中而不是硬盘里这样会大大提高应用程序的效率
但是/tmp目录的空间是从系统虚拟空间里挤出来的是虚拟Swap空间的一部分如果说你用完了/tmp空间也就是用完了Swap空间所以要小心监视系统的/tmp目录的使用情况千万别用光了否则系统会瘫痪!下面两点建议作为参考
在Mount /tmp目录时使用(-o Size)选项来控制/tmp目录的大小
当使用编译器编译文件时如果不想占用Swap空间则用TMPDIR环境变量指向另外一个临时目录而不是/tmp目录
有关Swap空间操作的系统命令
增加Swap空间
成为超级用户 $su - root
创建Swap文件 #mkfile nnn[klblm] filename
如#mkfile m swapfile
激活Swap文件
Swap文件必须以绝对路径来指定filename指的是上一步创建的文件
现在新加的Swap文件已经起作用了但系统重新启动以后并不会记住前几步的操作因此要在/etc/vfstab文件中记录文件的名字和Swap类型如
/path/filename - - Swap - no -
效验Swap文件是否加上 /usr/sbin/swap -l
删除多余的Swap空间
成为超级用户
使用swap -d 命令收回swap空间
#/usr/sbin/swap -d /path/filename
编辑/etc/ufstab文件去掉此Swap(交换)文件的实体
从文件系统中回收此文件
#rm swap-filename
当然如果此Swap(交换)空间不是一个文件而是一个分区则需创建一个新的文件系统再挂接到原来的文件系统上