大纲

1、swap分区是什么?

2、为什么需要swap分区?

3、关于swap分区大小

4、手动创建swap分区

1、swap分区是什么?

    swap,即交换分区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器以及数据库服务器,如Oracle的性能至关重要。

    众所周知,现代操作系统都实现了“虚拟内存”这一技术,不但在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间,更重要的是,“虚拟内存”是隔离每个进程的安全保护网,使每个进程都不受其它程序的干扰。  

    Swap 空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换,这就是所谓的“换页”。

2、为什么需要swap分区?

    如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。通常情况下,服务器应用场景中,为安全起见,都会使用swap,防止内存溢出。

3、关于swap分区大小

    几乎所有Linux 系统管理的书上或者很多资料上都推荐设置swap交换分区大小为物理内存的2倍。这些建议到了现在就不是那么适用了,现在的服务器动不动就是 16GB/32GB 内存,难道相应的交换分区也要扩大到 32GB/64GB?根据 OpenBSD 的安装建议:

    Many people follow an old rule of thumb that your swap partition should be twice the size of your main system RAM. This rule is nonsense. On a modern system, that’s a LOT of swap, most people prefer that their systems never swap. You don’t want your system to ever run out of RAM+swap, but you usually would rather have enough RAM in the system so it doesn’t need to swap. If you are using a flash device for disk, you probably want no swap partition at all. Use what is appropriate for your needs.

再看看 RHEL 5 推荐的 swap 分区大小:

    Swap should equal 2x physical RAM for up to 2 GB of physical RAM, and then an additional 1x physical RAM for any amount above 2 GB, but never less than 32 MB. For systems with really large amounts of RAM (more than 32 GB) you can likely get away with a smaller swap partition (around 1x, or less, of physical RAM).

    上面说的是一般情况,在安装系统的时候很难决定多大的交换空间,往往需要根据服务器实际负载、运行情况、以及未来可能应用来综合考虑 swap 分区的大小,所以这里参考推荐最小 swap 大小更实际一些:

4GB 或 4GB 以下内存的系统,最小需要 2GB 交换空间;大于 4GB 而小于 16GB 内存的系统,最小需要 4GB 交换空间;大于 16GB 而小于 64GB 内存的系统,最小需要 8GB 交换空间;大于 64GB 而小于 256GB 内存的系统,最小需要 16GB 交换空间。

但是不建议超过32G,这样操作系统误认为有很多物理内存,反而导致性能下降。

4、手动创建swap分区

想想以下情况:

  • 系统安装时,没有创建swap分区

  • 服务器无法添加物理内存,而且swap分区不够用

    此时,我们就需要手动的创建或者增大swap分区了。注意,虚拟内存必须是独立的文件系统,那么我们也必须为其提供单独的分区。

1、创建一个单独的分区,并调整分区类型为Linux swap

[root@localhost ~]# fdisk /dev/sdb        Command (m for help): p                # 打印分区表Disk /dev/sdb: 5368 MB, 5368709120 bytes255 heads, 63 sectors/track, 652 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes   Device Boot      Start         End      Blocks   Id  System/dev/sdb1               1         123      987966   83  LinuxCommand (m for help): n                # 创建新分区Command action   e   extended   p   primary partition (1-4)pPartition number (1-4): 2First cylinder (124-652, default 124): Using default value 124Last cylinder or +size or +sizeM or +sizeK (124-652, default 652): +512MCommand (m for help): pDisk /dev/sdb: 5368 MB, 5368709120 bytes255 heads, 63 sectors/track, 652 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes   Device Boot      Start         End      Blocks   Id  System/dev/sdb1               1         123      987966   83  Linux/dev/sdb2             124         186      506047+  83  LinuxCommand (m for help): t                # 调整分区类型Partition number (1-4): 2Hex code (type L to list codes): 82Changed system type of partition 2 to 82 (Linux swap / Solaris)Command (m for help): pDisk /dev/sdb: 5368 MB, 5368709120 bytes255 heads, 63 sectors/track, 652 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes   Device Boot      Start         End      Blocks   Id  System/dev/sdb1               1         123      987966   83  Linux/dev/sdb2             124         186      506047+  82  Linux swap / SolarisCommand (m for help): w                # 写入到磁盘The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@localhost ~]# partprobe /dev/sdb

OK,/dev/sdb2就是我们新创建的分区。

2、使用mkswap命令创建swap文件系统

[root@localhost ~]# mkswap /dev/sdb2Setting up swapspace version 1, size = 518184 kB

3、使用swapon命令激活swap分区

# swapon [device]

# swapon -a        # 开启所有标识为swap的分区

[root@localhost ~]# free -m             total       used       free     shared    buffers     cachedMem:           122        103         18          0          1         33-/+ buffers/cache:         68         53Swap:         1027         70        957[root@localhost ~]# swapon /dev/sdb2[root@localhost ~]# free -m             total       used       free     shared    buffers     cachedMem:           122        103         18          0          1         33-/+ buffers/cache:         68         53Swap:         1521         70       1451

4、使用swapoff命令关闭swap分区

# swapoff [device]

# swapoff -a

[root@localhost ~]# swapoff /dev/sdb2

5、设置开机自动挂载swap分区

我们可以编辑/etc/fstab配置文件,在文件末尾增加:

/dev/sda5      swap       swap    defaults        0 0

当前系统上,没有任何磁盘空间可以创建分区了,但是又必须要扩展swap时,该如何是好呢?

    在类Unix系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。

    那么意味着我们可以通过创建本地回环设备,来模拟磁盘分区使用。那么下面就来看看如何使用文件来模拟swap分区。

1、查看系统swap分区

[root@localhost ~]# cat /proc/swaps Filename				Type		Size	Used	Priority/dev/sda2                               partition	1052248	71776	-1

2、使用dd命令创建大文件

使用下面这条命令,就可以创建一个512M大小的文件,名为swapfile

[root@localhost ~]# dd if=/dev/zero of=swapfile bs=1M count=512512+0 records in512+0 records out536870912 bytes (537 MB) copied, 15.0813 seconds, 35.6 MB/s

3、使用mkswap命令创建swap文件系统

[root@localhost ~]# mkswap swapfileSetting up swapspace version 1, size = 536866 kB

4、使用swapon命令启用swap分区

[root@localhost ~]# cat /proc/swapsFilename				Type		Size	Used	Priority/dev/sda2                               partition	1052248	71792	-1[root@localhost ~]# free -m             total       used       free     shared    buffers     cachedMem:           122        119          2          0          0         50-/+ buffers/cache:         68         54Swap:         1027         70        957[root@localhost ~]# swapon swapfile[root@localhost ~]# cat /proc/swapsFilename				Type		Size	Used	Priority/dev/sda2                               partition	1052248	71792	-1/root/swapfile                          file		524280	0	-6[root@localhost ~]# free -m             total       used       free     shared    buffers     cachedMem:           122        119          2          0          0         50-/+ buffers/cache:         68         53Swap:         1539         70       1469

5、使用swapoff关闭swap分区

[root@localhost ~]# swapoff swapfile

6、设置开机自动挂载swap分区

编辑/etc/fstab文件,写入下面这一行

echo "/root/swapfile swap swap defaults 0 0" >> /etc/fstab

总结:

1. dd if=/dev/zero of=/path/swapfile bs=1k count=2048000

2. mkswap /path/swapfile

3. swapon /path/swapfile

4. 修改/etc/fstab使其启动时自动mount:

在/etc/fstab中增加如下语句:

/path/swapfile  swap  swap    defaults 0 0