Linux【6】-硬盘管理4-3-centos7下swap分区创建(添加),删除以及相关配置

我们都知道,直接从内存读写数据要比从硬盘读写数据快得多,因此更希望所有数据的读取和写入都在内存中完成,然而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称 swap 空间)。

作为物理内存的扩展,Linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样一来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

要深入了解 Linux 内存运行机制,需要知道下面提到的几个方面:

  • 首先,Linux 系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不用的内存页面,因为这样可以大大节省等待交换所需的时间。
  • 其次,Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux 内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存。

有时我们会看到这么一个现象,Linux 物理内存还有很多,但是交换空间也使用了很多,其实这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。

最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。

因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,但大致遵循这样一个基本原则:

  1. 如果内存较小(根据经验,物理内存小于 4GB),一般设置 swap 分区大小为内存的 2 倍;
  2. 如果物理内存大于 4GB,而小于 16GB,可以设置 swap 分区大小等于物理内存;
  3. 如果内存大小在 16GB 以上,可以设置 swap 为 0,但并不建议这么做,因为设置一定大小的 swap 分区是有一定作用的。

系统的物理内存用光了,整个进程就会跑的很慢,但仍能运行;如果sawp空间用光了,系统就发生错误。 例如,Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的,通常Swap空间的大小应是物理内存的2-2.5倍.

以下命令均需在root帐号下操作

一、增加swap

1.先用free -m查看一下swap的大小

[sam@c01 /]$ free -m
              total        used        free      shared  buff/cache   available
Mem:         128743      102959        2242         270       23540       24026
Swap:         16383       11900        4483

2.使用dd命令创建/home/swap这么一个分区文件。文件的大小是250000000个block,一般情况下1个block为1K,所以这里空间是250G。

dd  if=/dev/zero  of=/home/swap  bs=1024  count=250000000

if(即输入文件,input file),of(即输出文件,output file)。dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目。 bs=1024 :单位数据块(block)同时读入/输出的块字节大小为1024 个字节即1KB,bs(即block size)。count=2048000 :数据块(block)数量为2048000 ,即2048000个1KB。可以计算swap分区的容量为:1KB *2097152=1KB *1024(k)*1024*2=2097152=2G。(dd命令里的单位M表示1024*1024,k表示1024)。

回车后,会执行250g的读写操作,系统会卡一段时间,耐心等待执行结果。

250000000+0 records in
250000000+0 records out
256000000000 bytes (256 GB) copied, 1759.29 s, 146 MB/s

3.接着再把这个分区变成swap分区。

/sbin/mkswap /home/swap

Setting up swapspace version 1, size = 249999996 KiB
no label, UUID=9c338d18-90fc-4f30-be8b-80b9cf9939af

4.再接着使用这个swap分区。使其成为有效状态。

/sbin/swapon /home/swap

swapon: /home/swap: insecure permissions 0644, 0600 suggested.

执行以上命令可能会出现:“不安全的权限 0644,建议使用 0600”类似提示,不要紧张,实际上已经激活了,可以忽略提示,也可以听从系统的建议修改下权限:

chmod -R 0600 /home/swap 

5.现在再用free -m命令查看一下内存和swap分区大小,就发现增加了512M的空间了

[root@c01 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:         128743       23445       53187         147       52110      104044

6.开机自动挂载

注意当计算机重启了以后,发现swap还是原来那么大,新的swap没有自动启动,还要手动启动。那我们需要修改/etc/fstab文件,增加如下一行

#vi /etc/fstab

/home/swap swap swap defaults 0 0 

二、删除某swap分区

先停止正在使用swap分区:

swapoff  /var/swapfile

删除swap分区文件

rm -rf   /var/swapfile  

删除或注释掉我们之前在fstab文件里追加的开机自动挂载配置内容:

/var/swapfile   swap  swap  defaults  0  0

三、更改Swap配置(进阶级)

swappiness值(0-100),系统对swap分区的依赖程度,越高则越倾向于使用swap分区。

当然,高度依赖swap会造成物理内存远未使用完,就使用swap分区,我们知道swap分区性能远不如物理内存,这反而降低了系统性能,违背了我们创建swap分区的初衷。 我们希望在物理内存即将满荷时再使用swap,这就决定了swappiness值一般为10-60为宜,固态硬盘可以偏高些。

查看当前的swappiness数值:

cat   /proc/sys/vm/swappiness   

修改swappiness值,这里以50为例。

sysctl vm.swappiness=50   

若希望vm.swappiness=50永久生效,则需要修改sysctl配置文件,直接echo追加配置内容,重启系统后即可生效:

echo "vm.swappiness = 50"  >>  /etc/sysctl.conf  

参考资料:

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学