大纲
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 大小更实际一些:
1 2 3 4 |
4GB 或 4GB 以下内存的系统,最小需要 2GB 交换空间; 大于 4GB 而小于 16GB 内存的系统,最小需要 4GB 交换空间; 大于 16GB 而小于 64GB 内存的系统,最小需要 8GB 交换空间; 大于 64GB 而小于 256GB 内存的系统,最小需要 16GB 交换空间。 |
但是不建议超过32G,这样操作系统误认为有很多物理内存,反而导致性能下降。
4、手动创建swap分区
想想以下情况:
系统安装时,没有创建swap分区
服务器无法添加物理内存,而且swap分区不够用
此时,我们就需要手动的创建或者增大swap分区了。注意,虚拟内存必须是独立的文件系统,那么我们也必须为其提供单独的分区。
1、创建一个单独的分区,并调整分区类型为Linux swap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
[root@localhost ~]# fdisk /dev/sdb Command (m for help): p # 打印分区表 Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 123 987966 83 Linux Command (m for help): n # 创建新分区 Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (124-652, default 124): Using default value 124 Last cylinder or +size or +sizeM or +sizeK (124-652, default 652): +512M Command (m for help): p Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = 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 Linux Command (m for help): t # 调整分区类型 Partition number (1-4): 2 Hex code (type L to list codes): 82 Changed system type of partition 2 to 82 (Linux swap / Solaris) Command (m for help): p Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = 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 / Solaris Command (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文件系统
1 2 |
[root@localhost ~]# mkswap /dev/sdb2 Setting up swapspace version 1, size = 518184 kB |
3、使用swapon命令激活swap分区
# swapon [device]
# swapon -a # 开启所有标识为swap的分区
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost ~]# free -m total used free shared buffers cached Mem: 122 103 18 0 1 33 -/+ buffers/cache: 68 53 Swap: 1027 70 957 [root@localhost ~]# swapon /dev/sdb2 [root@localhost ~]# free -m total used free shared buffers cached Mem: 122 103 18 0 1 33 -/+ buffers/cache: 68 53 Swap: 1521 70 1451 |
4、使用swapoff命令关闭swap分区
# swapoff [device]
# swapoff -a
1 |
[root@localhost ~]# swapoff /dev/sdb2 |
5、设置开机自动挂载swap分区
我们可以编辑/etc/fstab配置文件,在文件末尾增加:
1 |
/dev/sda5 swap swap defaults 0 0 |
当前系统上,没有任何磁盘空间可以创建分区了,但是又必须要扩展swap时,该如何是好呢?
在类Unix系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
那么意味着我们可以通过创建本地回环设备,来模拟磁盘分区使用。那么下面就来看看如何使用文件来模拟swap分区。
1、查看系统swap分区
1 2 3 |
[root@localhost ~]# cat /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 1052248 71776 -1 |
2、使用dd命令创建大文件
使用下面这条命令,就可以创建一个512M大小的文件,名为swapfile
1 2 3 4 |
[root@localhost ~]# dd if=/dev/zero of=swapfile bs=1M count=512 512+0 records in 512+0 records out 536870912 bytes (537 MB) copied, 15.0813 seconds, 35.6 MB/s |
3、使用mkswap命令创建swap文件系统
1 2 |
[root@localhost ~]# mkswap swapfile Setting up swapspace version 1, size = 536866 kB |
4、使用swapon命令启用swap分区
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost ~]# cat /proc/swaps Filename Type Size Used Priority /dev/sda2 partition 1052248 71792 -1 [root@localhost ~]# free -m total used free shared buffers cached Mem: 122 119 2 0 0 50 -/+ buffers/cache: 68 54 Swap: 1027 70 957 [root@localhost ~]# swapon swapfile [root@localhost ~]# cat /proc/swaps Filename 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 cached Mem: 122 119 2 0 0 50 -/+ buffers/cache: 68 53 Swap: 1539 70 1469 |
5、使用swapoff关闭swap分区
1 |
[root@localhost ~]# swapoff swapfile |
6、设置开机自动挂载swap分区
编辑/etc/fstab文件,写入下面这一行
1 |
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
via.http://skypegnu1.blog.51cto.com/8991766/1429558