博主在 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、仔细查看下面第二张图的红色方框部分,Start
到 End
中间有没有断开,最后的 End
是不是等于 cylinders
的值。
若有断开现象,表示磁盘还有未划分区域,可以继续“将分区新建为 Swap 分区”;
若数值是连续的,表示磁盘没有未划分区域,除非你懂得如何压缩磁盘或者知道怎么弄出一个新分区,博主建议还是使用之前的“将文件新建为 Swap 分区”的方法。
因为博主不会,原谅我_(:3」∠)_
既然你继续看下来了,那么请备份重要数据后操作!!
本文只包含使用 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/
原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-895.html