大纲
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