如何给LINUX服务器分配SWAP分区
LINUX服务器的SWAP分区就是交换分区,它类似于WINDOWS的虚拟内存,当服务器内存不足的时候,系统自动把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。当然服务器也允许自动设置SWAP分区的使用策略,这个后面会提到。既然是相当于虚拟内存,如果你的服务器内存确实不足并经常因此而产生程序错误进而导致数据库或PHP解析服务异常停止,那么可以考虑通过分配一个合适的SWAP分区来缓解。
SWAP分区的大小
说到分配SWAP分区,首先必然要考虑多大的空间合适。早期服务器的内存偏小,以致于一般教科书上都是建议SWAP分区大小设为物理内存的两倍,但对于服务器内存动不动就是32G、64G甚至128G的今天,这种设置建议已然不合适了。下面是RHEL关于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).
按照上面文字的意思,就是根据服务器的物理内存大小来设置,假设物理内存大小为nG:
- 物理内存nG小于等于2G,则SWAP分区分配物理内存2倍的空间,即2*nG;
- 物理内存nG大于2G而小于32G,则SWAP分区在4G(2*2G)的基础上再加一个大于32MB小于物理内存M超出2G的空间,即:4G+32M ~ 4G+(n-2)G;
- 物理内存nG大于32G,则可以忽略掉小的SWAP分区,也就是分配小于等于物理内存的SWAP分区,即:<=nG。
知道如何决定SWAP分区的空间大小,就可以开始分配SWAP分区了。
分配SWAP分区
下面在UBUNTU16.04下演示如何分配SWAP分区。在分配SWAP分区之前,先要确认目前服务器上SWAP分区的具体情况。用swapon命令就可以查看SWAP分区的分配情况:
- sudo swapon –show
如果没有任何输出,那就说明服务器没有分配SWAP分区。
当然你也可以用free命令来查看内存详情:
- free -h
输出结果类似这样:
- total used free shared buff/cache available
- Mem: 488M 36M 104M 652K 348M 426M
- Swap: 0B 0B 0B
如上所示,SWAP一行均为0,即:服务器上没有分配SWAP分区。
查看你的硬盘使用情况
通常,SWAP分区是从物理硬盘上划分出一个独立的分区来实现的,但是修改已有的硬盘分区机制并不总是可行。幸运的是,我们可以很容易地从一个已经存在的分区新建一个SWAP分区。
在此之前,我们需要先通过下面的命令来检查一下硬盘的使用情况:
- df -h
输出结果类似这样:
- Filesystem Size Used Avail Use% Mounted on
- udev 238M 0 238M 0% /dev
- tmpfs 49M 624K 49M 2% /run
- /dev/vda1 20G 1.1G 18G 6% /
- tmpfs 245M 0 245M 0% /dev/shm
- tmpfs 5.0M 0 5.0M 0% /run/lock
- tmpfs 245M 0 245M 0% /sys/fs/cgroup
- tmpfs 49M 0 49M 0% /run/user/1001
在这里/dev/vda1就是我们的硬盘设备了,硬盘空间一共有20G,现在才使用了1.1G,还有18G可用。我们可以在此创建SWAP分区。因为我的物理内存只有512MB,我决定创建1G的SWAP分区。
创建SWAP分区文件
明确了硬盘分区情况,我们可以继续创建SWAP分区了,我们首先要创建一个大小为1GSWAP文件,就在根目录创建,取名为swapfile。命令如下:
- sudo fallocate -l 1G /swapfile
我们可以通过下面的命令来验证一下它的大小:
- ls -lh /swapfile
- -rw-r–r– 1 root root 1.0G Apr 25 11:14 /swapfile
OK,一切正常,我们可以继续下一步。
启用SWAP分区文件
SWAP分区文件已经准备好了,接下来就是启用它了。首先从安全角度考虑,我们需要锁定仅有root可以有SWAP分区文件的读写权限。
- sudo chmod 600 /swapfile
然后再次验证一下权限
- ls -lh /swapfile
- -rw——- 1 root root 1.0G Apr 25 11:14 /swapfile
这样就只有root用户有权限访问SWAP分区文件了。现在我们可以通过下面的命令把SWAP分区文件标记为SWAP分区。
- sudo mkswap /swapfile
- Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
- no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
然后我们需要启用SWAP分区并开始使用它。
- sudo swapon /swapfile
我们可以通过下面的命令来验证一下服务器上的SWAP分区是否已经生效。
- sudo swapon –show
- NAME TYPE SIZE USED PRIO
- /swapfile file 1024M 0B –1
当然,你喜欢的话,用free命令也是一样可以看到内存分配情况。
- free -h
- total used free shared buff/cache available
- Mem: 488M 37M 96M 652K 354M 425M
- Swap: 1.0G 0B 1.0G
SWAP分区已经成功创建了,服务器已经开始使用它了,我们已经接近完工了。说接近完工的意思就是还差那么一点。
固化SWAP分区设置
在前面的步骤中,我们已经完成了SWAP分区的设置,但还差一点,那就是固化SWAP分区设置。如果没有固化SWAP分区设置,在服务器重启后,系统将不能自动保留SWAP的分区设置,我们可以通过修改/etc/fstab文件来固化分区设置。
为避免发生意外,先备份一下fstab文件。
- sudo cp /etc/fstab /etc/fstab.bak
然后修改fstab文件,将相关信息添加到fstab文件末尾。
- echo ‘/swapfile none swap sw 0 0‘ | sudo tee -a /etc/fstab
OK,SWAP分区创建的工作就完成了。
调整SWAP分区的使用策略
SWAP分区是有了,但如何制定有效的使用策略对提高服务器的性能至关重要。SWAP分区使用的是硬盘,其读写性能肯定比不上内存和缓存,对服务器而言肯定是在迫不得已的情况下才使用。在UBUNTU16.04下,如何使用SWAP分区是由参数swappiness决定的,它的取值范围为0~100,标识从物理内存转移到SWAP分区内容的百分比,这个值越接近0就意味着越少的内容会被转移到SWAP区。由于UBUNTU早期是作为桌面系统,也许你可以在服务器上看到像下面这样的结果,默认的swappiness设置为60
- $ cat /proc/sys/vm/swappiness
- 60
对桌面系统而言,60是一个可以接受的值,但对服务器而言,需要设置得接近0,比如设为10,会更合理。通过下面的命令可以将swappiness的值设为10。
- sudo sysctl vm.swappiness=10
- vm.swappiness = 10
同样的道理,为了让修改在系统重启后仍然有效,需要编辑sysctl.conf文件
- sudo vi /etc/sysctl.conf
在文件结尾处加上
- vm.swappiness=10
关闭文件,并保存修改。
好了,通过上面的例子,相信你已经拥有了自己的SWAP分区,并能有效地使用它了。SWAP分区对于避免服务器出现因为内存耗光而崩溃的情况能起到一定的缓解作用,但需要注意的是SWAP分区毕竟是用硬盘虚拟出来的,性能上远不如内存,所以如果服务器的内存确实不够用了,最佳选择还是增加物理内存。