当前位置 : 首页 » 文章分类 :  开发  »  Linux-Swap交换空间

Linux-Swap交换空间

Linux Swap 交换空间笔记

什么是swap?

swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。

设置swap带来的好处

  • 对于一些大型的应用程序(如LibreOffice、video editor等),在启动的过程中会使用大量的内存,但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到这些内存。有了swap后,系统就可以将这部分不这么使用的内存数据保存到swap上去,从而释放出更多的物理内存供系统使用。
  • 很多发行版(如ubuntu)的休眠功能依赖于swap分区,当系统休眠的时候,会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度,所以如果要使用休眠的功能,必须要配置swap分区,并且大小一定要大于等于物理内存
  • 在某些情况下,物理内存有限,但又想运行耗内存的程序怎么办?这时可以通过配置足够的swap空间来达到目标,虽然慢一点,但至少可以运行。
  • 虽然大部分情况下,物理内存都是够用的,但是总有一些意想不到的状况,比如某个进程需要的内存超过了预期,或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的OOM killer,根据OOM killer的配置,某些进程会被kill掉或者系统直接重启(默认情况是优先kill耗内存最多的那个进程),不过有了swap后,可以拿swap当内存用,虽然速度慢了点,但至少给了我们一个去debug、kill进程或者保存当前工作进度的机会。
  • Linux系统会尽可能多的将空闲内存用于cache,以加快系统的I/O速度,所以如果能将不怎么常用的内存数据移动到swap上,就会有更多的物理内存用于cache,从而提高系统整体性能。

设置swap的弊端

swap是存放在磁盘上的,磁盘的速度和内存比较起来慢了好几个数量级,如果不停的读写swap,那么对系统的性能肯定有影响,尤其是当系统内存很吃紧的时候,读写swap空间发生的频率会很高,导致系统运行很慢,像死了一样,这个时候添加物理内存是唯一的解决办法。

由于系统会自动将不常用的内存数据移到swap上,对桌面程序来说,有可能会导致最小化一个程序后,再打开时小卡一下,因为需要将swap上的数据重新加载到内存中来。

swap分区和swap文件

Linux下有两种类型的swap空间,swap分区和swap文件,他们有各自的特点:

  • swap分区上面由于没有文件系统,所以相当于内核直接访问连续的磁盘空间,效率相对要高点,但由于swap分区一般安装系统时就分配好了了,后期要缩减空间和扩容都很不方便。
  • swap文件放在指定分区的文件系统里面,所以有可能受文件系统性能的影响,但据说2.6版本以后的内核可以直接访问swap文件对应的物理磁盘地址,相当于跳过了文件系统直接访问磁盘,不过如果swap文件在磁盘上的物理位置不连续时,还是会对性能产生不利影响,但其优点就是灵活,随时可以增加和移除swap文件。

设置swap

swap大小设置多少?

下面是ubuntu给出的建议:

  • 当物理内存小于1G且不需要休眠时,设置和内存同样大小的swap空间即可;当需要休眠时,建议配置两倍物理内存的大小,但最大值不要超过两倍内存大小
  • 当物理内存大于1G且不需要休眠时,建议大小为round(sqrt(RAM)),其中RAM为物理内存大小;当需要休眠时,建议大小是RAM+round(sqrt(RAM)),但最大值不要超过两倍内存大小
  • 如果两倍物理内存大小的swap空间还不够用,建议增加内存而不是增加swap

查看swap

使用 free 命令可查看swap大小和使用情况

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3711        2019         166         480        1525         836
Swap:           819         222         597

或者使用 swapon -s 命令:

$ swapon -s
文件名             类型      大小    已用   权限
/dev/nvme0n1p2  partition    839676    227688    -1

其实 swapon -s 命令查看的是 /proc/swaps 文件的内容,等价于:
cat /proc/swaps

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile1                              file        1048572    142592    -2

添加交换分区

添加一个交换分区,步骤如下:
1、使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区)
2、使用 mkswap 命令来设置交换分区:
mkswap /dev/sdb2
注意:指定分区上的所有数据会丢失。

3、启用交换分区:
swapon /dev/sdb2

4、写入/etc/fstab,以便在系统启动时自动加载交换分区:
/dev/sdb2 none swap defaults 0 0

添加交换文件

添加一个交换文件,步骤如下:
1、创建大小为512MB的交换文件:
dd if=/dev/zero of=/swapfile1 bs=1M count=512

sudo dd if=/dev/zero of=/swapfile1 bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,14.7397 秒,72.8 MB/秒

2、修改文件的权限,避免其他用户对这个文件进行误操作:
chmod 600 /swapfile1

3、使用mkswap命令来设置交换文件:
mkswap /swapfile1

sudo mkswap /swapfile1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=b30e9371-0e0b-40b4-bd85-624aeb173aa1

4、启用交换文件:
swapon /swapfile1

5、写入/etc/fstab,以便在系统启动时自动加载交换文件:
/swapfile1 none swap defaults 0 0

$ cat /etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/swapfile1 none swap defaults 0 0

新添了交换分区并启用它之后,请查看 cat /proc/swapsfreeswapon -s 命令的输出来确保交换分区已被启用了。

$ free -m
             total       used       free     shared    buffers     cached
Mem:           481        469         12          0         44        353
-/+ buffers/cache:         71        410
Swap:         1023          0       1023
$ swapon -s
文件名                类型        大小    已用    权限
/swapfile1  file    1048572    0    -2

删除交换文件

如果要删除一个交换文件,必须先停用它。
作为root运行:
swapoff -a
-a 即关闭配置文件“/etc/fstab”中所有的交换空间。

然后即可删除它:
rm -rf /swapfile

当然我们还需要修改 /etc/fstab,否则下次重启后,系统又会重新挂载相应的swap分区和文件
最后从 /etc/fstab 中删除相关条目

Linux交换空间(swap space)
https://segmentfault.com/a/1190000008125116

Swap (简体中文)
https://wiki.archlinux.org/index.php/Swap_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

vm.swappiness

swappiness 的值的大小对如何使用 swap 分区是有着很大的联系的。swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap 空间,swappiness=100 的时候表示积极的使用 swap 分区,并且把内存上的数据及时的搬运到 swap 空间里面。
查看 swappiness 的值 cat /proc/sys/vm/swappiness,centos 7 中默认是 30

$ cat /proc/sys/vm/swappiness
30

swappiness 的值为 30 的意思是,内存在使用到 100-30=70% 的时候,就开始出现有交换分区的使用。

内存的速度会比磁盘快很多,这样子会加大系统 IO,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

临时调整的方法如下,我们调成 10:

sysctl vm.swappiness=10
#vm.swappiness=10
cat /proc/sys/vm/swappiness
#10

系统重启后会回复默认值。

要想永久调整的话,需要在 /etc/sysctl.conf 修改,加上:

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296 #这一个可以不用设置
vm.swappiness = 10

然后使生效 sudo sysctl -p

上一篇 Hexo博客(26)自建博客评论系统之邮件通知

下一篇 AWS Lightsail CentOS6 使用记录

阅读
评论
2,213
阅读预计9分钟
创建日期 2019-07-16
修改日期 2020-06-26
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论