Swap 分割槽,即交换区,Swap 空间的作用可简单描述为:当系统的实体内存不够用的时候,就需要将实体内存中的一部分空间释放出来,以供当前执行 的程式使用。那些被释放的空间可能来自一些很长时间没有什么操作的程式,这些被释放的空间被临时储存到 Swap 空间中,等到那些程式要执行时,再从 Swap 中恢复储存的资料到内存中。这样,系统总是在实体内存不够时,才进行 Swap 交换。其实,Swap 的调整对 Linux 站群服务器,特别是 Web 站群服务器 的效能至关重要。通过调整 Swap,有时可以越过系统效能瓶颈,节省系统升级费用。
众所周知,现代操作系统都实现了 “虚拟内存” 这一技术,不但在功能上突破了实体内存的限制,使程式可以操纵大于实际实体内存的空间,更重要的是,“虚拟内存” 是隔离每个程序的安全保护网,使每个程序都不受其它程式的干扰。
计算机使用者会经常遇这种现象。例如,在使用 Windows 系统时,可以同时执行多个程式,当你切换到一个很长时间没有理会的程式时,会听到硬碟 “哗 哗” 直响。这是因为这个程式的内存被那些频繁执行的程式给 “偷走” 了,放到了 Swap 区中。因此,一旦此程式被放置到前端,它就会从 Swap 区取回自己的数 据,将其放进内存,然后接著执行。
需要说明一点,并不是所有从实体内存中交换出来的资料都会被放到 Swap 中 (如果这样的话,Swap 就会不堪重负),有相当一部分资料被直接交换到 档案 系统。例如,有的程式会开启一些档案,对档案进行读写 (其实每个程式都至少要开启一个档案,那就是执行程式本身),当需要将这些程式的内存空间交换出去 时,就没有必要将档案部分的资料放到 Swap 空间中了,而可以直接将其放到档案里去。如果是读档案操作,那么内存资料被直接释放,不需要交换出来,因为下 次需要时,可直接从档案系统恢复;如果是写档案,只需要将变化的资料储存到档案中,以便恢复。但是那些用 malloc 和 new 函式生成的物件的资料则不 同,它们需要 Swap 空间,因为它们在档案系统中没有相应的 “储备” 档案,因此被称作 “匿名”(Anonymous) 内存资料。这类资料还包括堆叠中的一 些状态和变数资料等。所以说,Swap 空间是 “匿名” 资料的交换空间。
突破 128M Swap 限制
经常看到有些 Linux(国内汉化版) 安装手册上有这样的说明:Swap 空间不能超过 128M 。为什么会有这种说法?在说明 “128M” 这个数字的来历之前,先给问题一个回答:现在根本不存在 128M 的限制!现在的限制是 2G!
Swap 空间是分页的,每一页的大小和内存页的大小一样,方便 Swap 空间和内存之间的资料交换。旧版本的 Linux 实现 Swap 空间时,用 Swap 空 间的第一页作为所有 Swap 空间页的一个 “位对映”(Bit map) 。这就是说第一页的每一位,都对应著一页 Swap 空间。如果这一位是 1,表示此页 Swap 可用;如果是 0,表示此页是坏块,不能使用。这么说来, 第一个 Swap 对映位应该是 0,因为,第一页 Swap 是对映页。另外,最后 10 个对映位也被占用,用来表示 Swap 的版本 (原来的版本是 Swap_space ,现在的版本是 swapspace2) 。那么,如果说一页的大小为 s,这种 Swap 的实现方法共能管理 “8 * ( s – 10 ) – 1” 个 Swap 页。对于 i386 系统来说 s=4096,则空间大小共为 133890048,如果认为 1 MB=2^20 Byte 的话,大小正好为 128M 。
Swap 配置对效能的影响
分配太多的 Swap 空间会浪费磁碟空间,而 Swap 空间太少,则系统会发生错误。
如果系统的实体内存用光了,系统就会跑得很慢,但仍能执行;如果 Swap 空间用光了,那么系统就会发生错误。例如,Web 站群服务器能根据不同的请求数 量衍 生出多个服务程序 (或执行绪),如果 Swap 空间用完,则服务程序无法启动,通常会出现 “application is out of memory” 的错误,严重时会造成服务程序的死锁。因此 Swap 空间的分配是很重要的。
通常情况下,Swap 空间应大于或等于实体内存的大小,最小不应小于 64M,通常 Swap 空间的大小应是实体内存的 2-2.5 倍。但根据不同的应 用,应 有不同的配置:如果是小的桌面系统,则只需要较小的 Swap 空间,而大的站群服务器系统则视情况不同需要不同大小的 Swap 空间。特别是资料库站群服务器和 Web 站群服务器,随著访问量的增加,对 Swap 空间的要求也会增加,具体配置参见各站群服务器产品的说明。
另外,Swap 分割槽的数量对效能也有很大的影响。因为 Swap 交换的操作是磁碟 IO 的操作,如果有多个 Swap 交换区,Swap 空间的分配会以轮流 的方 式操作于所有的 Swap,这样会大大均衡 IO 的负载,加快 Swap 交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间 处于等待状态,效率很低。用效能监视工具就会发现,此时的 CPU 并不很忙,而系统却慢。这说明,瓶颈在 IO 上,依靠提高 CPU 的速度是解决不了问题的。

建立一个有连续空间的空白档案
站群服务器的实体内存是 512MB,按照 1.5~2 倍原则,我将 swap 档案设定为 1GB 。

#root @aliyun :/srv# dd if=/dev/zero of=SWAPFILE bs=1024 count=1048576 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 59.7957 s, 18.0 MB/s
#root@aliyun :/srv# dd if=/dev/zero of=SWAPFILE bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 59.7957 s, 18.0 MB/s

使用 swap 档案
使用 swapon 命令让系统使用这个档案作为 swap 档案。但是这个档案不能直接使用,否则会报错:

root @aliyun :/srv# swapon swapfile swapon: /srv/swapfile: read swap header failed: Invalid argument
root@aliyun:/srv# swapon swapfile
swapon: /srv/swapfile: read swap header failed: Invalid argument

必须先使用 mkswap 将档案格式化成 swap 格式(不知道为什么会少了 4KB):

root @aliyun :/srv# mkswap SWAPFILE 1048576 Setting up swapspace version 1, size = 1048572 KiB no label, UUID=1aaed031-33ef-479b-a9a4-2f008a7bbb2f
root@aliyun:/srv# mkswap SWAPFILE 1048576
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=1aaed031-33ef-479b-a9a4-2f008a7bbb2f

使用格式化完毕的档案:

root @aliyun :/srv# swapon SWAPFILE
root@aliyun:/srv# swapon SWAPFILE

检视档案使用情况:

root@aliyun:/srv# swapon -s Filename Type Size Used Priority /srv/SWAPFILE file 1048572 95852 -1
root@aliyun:/srv# swapon -s
Filename                                Type            Size    Used    Priority
/srv/SWAPFILE                           file            1048572 95852   -1

加入自动启用
为避免重启后 swapfile 生效,可以将启用 swap 的程式码加入启动档案中,对于 ubuntu server,编辑/etc/rc.local 档案,加入以下内容(具体档案路径自定):

swapon /srv/SWAPFILE
swapon /srv/SWAPFILE

或者
修改/etc/fstab 档案,加入以下内容:

/srv/SWAPFILE swap swap defaults 0 0
/srv/SWAPFILE   swap    swap    defaults        0       0

原文连结:http://my.oschina.net/renguijiayi/blog/299150