博主在 DigitalOcean 上有一个月付 5 刀的VPS,内存只有 512M 。之前编译安装 PHP 的时候,出现了进程被 kill 的情况,网上搜了下,发现是因为内存被耗尽了,所以有必要手动创建一下 Swap 分区。

 

什么是 Swap 分区?

百度百科的回答是:Swap 分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 Swap 分区中,等到那些程序要运行时,再从 Swap 分区中恢复保存的数据到内存中。

 

Swap 分区大小应该设置为多少?

有很多说法是:交换分区 Swap 的大小应该是内存的两倍。这是很片面的说法,其实正确的做法是:根据系统内存的大小,以及所使用的程序,决定交换分区的大小。

系统中 Swap 分区的大小不是取决于物理内存的大小,而是取决于系统中程序对内存的占用量。Swap 分区设置太大,对性能没有什么提升,还会平白浪费硬盘空间;设置太小,又可能出现不够用的情况。

RHEL 6 的建议如下,当然还是需要根据实际情况进行适当调整:

4GB of RAM requires a minimum of 2GB of swap space              4GB以下内存建议2GB以上Swap空间
4GB to 16GB RAM requires a minimum of 4GB of swap space         4GB-16GB内存建议4GB以上Swap空间
16GB to 64GB of RAM requires a minimum of 8GB of swap space     16GB-64GB内存建议8GB以上Swap空间
64GB to 256GB of RAM requires a minimum of 16GB of swap space   64GB-256GB内存建议16GB以上Swap空间

 

系统何时会使用 Swap 分区?

系统并不是在消耗了全部的物理内存后才使用 Swap 分区,我们可以通过设置 swappiness 参数进行控制。

该值默认为 60

cat /proc/sys/vm/swappiness

swappiness 的取值在 0-100 之间。0 时表示最大限度使用物理内存之后才使用 Swap 分区;100 时表示及时搬运内存里的数据到 Swap 分区。

这个值并不是越高越好, 因为 Linux 会最大程度地使用内存,将一些数据保存在内存中,系统下一次调用数据就不需要从文件读取而是直接从内存中获得,从而提高系统的性能,但是如果每次都把内存中的数据保存到 Swap 分区,读取就相当于从文件中读取一样,反而会有性能损失。所以这个值反而小一些比较好。

 

如何调整 swappiness?

调整 swappiness 有两种方法,一种是临时的,重启后失效,一种是永久的。

#这里博主将swappiness的值设置为10
sysctl vm.swappiness=10
#临时把swappiness设置为10,重启后失效

echo 'vm.swappiness=10' >> /etc/sysctl.conf
#把swappiness=10写入sysctl.conf配置文件,重启后依旧有效

 

如何添加新的 Swap 分区?

添加新的 Swap 分区有两种方法:一种是将文件作为 Swap 分区,一种是将分区作为 Swap 分区。将分区作为 Swap 分区相比于文件更优。

 

将文件新建为 Swap 分区的方法:

第一步:创建文件

dd if=/dev/zero of=/Swapfile bs=1024 count=512k
#if=input file,这里表示往文件中写0
#of=output file,这是在根目录下创建Swapfile文件
#bs=bytes,设置每个块大小
#count表示有多少个这种块
#新建的Swap文件大小为bs*count的大小

第二步:格式化并启用 Swap 文件

mkswap /Swapfile
#格式化根目录下的Swapfile文件
swapon /Swapfile
#启用根目录下的Swapfile文件

执行上面的 shell 后,可以再使用下面的命令查看 Swap 分区是否已被激活

swapon -s
#当返回的信息有Swapfile表示成功
free -m
#当Swap不为0时表示成功

第三步:开机自动挂载 Swap 文件

执行完上诉步骤后 Swap 文件并不会开机自动挂载,接下来要编辑文件 /etc/fstab

使用 vim /etc/fstab 命令进入 vim,再按 a 开始编辑,在最下面一行添加 /Swapfile swap swap defaults 0 0,与上面的对齐,最后按 Esc 退出编辑模式,输入 :wq 保存并退出。

或者执行以下 shell,不过可能对不齐

echo '/Swapfile               swap                    swap    defaults        0 0' >> /etc/fstab

 

将分区新建为 Swap 分区的方法:

注意:接下来要调整分区,调整有风险,操作需谨慎,磁盘有价,数据无价,各位好自为之。

以下步骤博主在 CentOS 上实践可行,其他系统未作测试。

第一步:新建一个新的分区

fdisk -l
#查看挂载的磁盘

执行完这步就会有两个问题:

1、查看是否出现下面第一张图的 WARNING 字样,若出现则表示磁盘为 GPT 格式,不能使用 fdisk 划分磁盘。

磁盘为 MBR 格式,没有任何问题,可以继续使用 fdisk;磁盘为 GPT 格式,fdisk 无法为 GPT 磁盘分区,需要使用 parted,就算强制使用 fdisk,大于 2 TB 的部分将无法使用。

2、仔细查看下面第二张图的红色方框部分,StartEnd 中间有没有断开,最后的 End 是不是等于 cylinders 的值。

若有断开现象,表示磁盘还有未划分区域,可以继续“将分区新建为 Swap 分区”;

若数值是连续的,表示磁盘没有未划分区域,除非你懂得如何压缩磁盘或者知道怎么弄出一个新分区,博主建议还是使用之前的“将文件新建为 Swap 分区”的方法。

因为博主不会,原谅我_(:3」∠)_

WARNING
WARNING
确认是否还有为划分区域
确认是否还有为划分区域

既然你继续看下来了,那么请备份重要数据后操作!!

本文只包含使用 fdisk 为 MBR 格式硬盘分区的方法,GPT 磁盘格式的请使用“将文件新建为 Swap 分区”的方法。

#以下请逐条输入
fdisk /dev/sda
#/dev/sda是你要操作的磁盘
n
#n表示添加一个分区
p
#p表示主分区,e表示扩展分区,MBR最多有4个主分区,请根据实际情况选择
2
#由于之前只有/dev/sda1,所以现在创建/dev/sda2,请根据实际情况选择
回车
#开始的柱面,使用默认数值
回车/+大小
#结束的柱面,回车表示使用默认数值,+大小表示直接设置大小,例如+1G、+512M之类
w
#写入分区表信息
fdisk -l
#查看写入后的信息

博主的过程:

[root@ttlamp ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (3789-3916, default 3789):
Using default value 3789
Last cylinder, +cylinders or +size{K,M,G} (3789-3916, default 3916): +512M

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

[root@ttlamp ~]# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c23d3

   Device  Boot  Start    End     Blocks  Id  System
/dev/sda1   *        1   3789   30432256  83  Linux
/dev/sda2         3789   3854     523975  83  Linux

第二步:将新建的分区格式化为 Swap 分区

#以下请逐条输入
fdisk /dev/sda
#/dev/sda是你要操作的磁盘
t
#t表示修改分区类型
2
#使用上一步使用新建的分区编号,请根据实际情况选择
82
#Linux的Swap分区编号为82
w
#写入分区表信息
fdisk -l
#查看写入后的信息

博主的过程:

[root@ttlamp ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

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): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@ttlamp ~]# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c23d3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        3789    30432256   83  Linux
/dev/sda2            3789        3854      523975   82  Linux swap / Solaris

第三步:格式化并启用 Swap 分区

博主这里建议 reboot 重启一下,因为博主这里遇到了创建了 /dev/sda2 后找不到分区的情况。

mkswap /dev/sda2
#格式化/dev/sda2分区
swapon /dev/sda2
#启用/dev/sda2分区

执行上面的 shell 后,可以再使用下面的命令查看 Swap 分区是否已被激活

swapon -s
#当返回的信息有/dev/sda2表示成功
free -m
#当Swap不为0时表示成功

第四步:开机自动挂载 Swap 分区

执行完上诉步骤后 Swap 分区并不会开机自动挂载,接下来要编辑文件 /etc/fstab

使用 vim /etc/fstab 命令进入 vim,再按 a 开始编辑,在最下面一行添加 /dev/sda2 swap swap defaults 0 0,与上面的对齐,最后按 Esc 退出编辑模式,输入 :wq 保存并退出。

或者执行以下 shell,不过可能对不齐

echo '/dev/sda2               swap                    swap    defaults        0 0' >> /etc/fstab

 

如何删除 Swap 分区?

将文件作为 Swap 分区的情况:

使用 swapoff /Swapfile 命令停用 Swap 分区;使用 vim /etc/fstab 命令,将光标移动到 /Swapfile 一行,输入 dd 删除该行,再输入 :wq 保存并退出;使用 rm -f /Swapfile 命令删除 /Swapfile 文件。

将分区作为 Swap 分区的情况:

使用 swapoff /dev/sda2 命令停用 Swap 分区;使用 vim /etc/fstab 命令,将光标移动到 /dev/sda2 一行,输入 dd 删除该行,再输入 :wq 保存并退出;之后根据情况使用 fdisk /dev/sda 命令,进入后依次输入 d 2 w 删除 /dev/sda2 分区。

 

参考:

http://blog.csdn.net/tianlesoftware/article/details/8741873

http://smilejay.com/2012/09/new-or-add-swap/


原创文章,转载请以链接形式注明出处:http://blog.ttionya.com/article-895.html