博主在 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
# 临时把 swappiness 设置为 10,重启后失效
sysctl vm.swappiness=10
# 把 swappiness=10 写入 sysctl.conf 配置文件,重启后依旧有效
echo 'vm.swappiness=10' >> /etc/sysctl.conf
如何添加新的 Swap 分区?
添加新的 Swap 分区有两种方法:一种是将文件作为 Swap 分区,一种是将分区作为 Swap 分区。将分区作为 Swap 分区相比于文件更优。
将文件新建为 Swap 分区
第一步:创建文件
# if=input file,这里表示往文件中写 0
# of=output file,这是在根目录下创建 Swapfile 文件
# bs=bytes,设置每个块大小
# count 表示有多少个这种块
# 新建的 Swap 文件大小为 bs * count 的大小
dd if=/dev/zero of=/Swapfile bs=1024 count=512k
第二步:格式化并启用 Swap 文件
# 格式化根目录下的 Swapfile 文件
mkswap /Swapfile
# 启用根目录下的 Swapfile 文件
swapon /Swapfile
执行上面的 shell 后,可以再使用下面的命令查看 Swap 分区是否已被激活
# 当返回的信息有 Swapfile 表示成功
swapon -s
# 当 Swap 不为 0 时表示成功
free -m
第三步:开机自动挂载 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 分区”的方法。
# 以下请逐条输入
# /dev/sda是你要操作的磁盘
fdisk /dev/sda
# n 表示添加一个分区
n
# p 表示主分区,e 表示扩展分区,MBR 最多有 4 个主分区,请根据实际情况选择
p
# 由于之前只有 /dev/sda1,所以现在创建 /dev/sda2,请根据实际情况选择
2
# 开始的柱面,使用默认数值
回车
# 结束的柱面,回车表示使用默认数值,+大小表示直接设置大小,例如 +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 分区
# 以下请逐条输入
# /dev/sda 是你要操作的磁盘
fdisk /dev/sda
# t 表示修改分区类型
t
# 使用上一步使用新建的分区编号,请根据实际情况选择
2
# Linux 的 Swap 分区编号为 82
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
后找不到分区的情况。
# 格式化 /dev/sda2 分区
mkswap /dev/sda2
# 启用 /dev/sda2 分区
swapon /dev/sda2
执行上面的 shell 后,可以再使用下面的命令查看 Swap 分区是否已被激活
# 当返回的信息有 /dev/sda2 表示成功
swapon -s
# 当 Swap 不为 0 时表示成功
free -m
第四步:开机自动挂载 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
分区。
参考:
原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-895.html