Linux-Swap交换空间
Linux Swap 交换空间笔记
Linux 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文件,他们有各自的特点:
1、swap 分区上面由于没有文件系统,所以相当于内核直接访问连续的磁盘空间,效率相对要高点,但由于swap分区一般安装系统时就分配好了了,后期要缩减空间和扩容都很不方便。
2、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
命令可查看 swap 大小和使用情况,但看不到具体的交换文件是哪个。
$ free -m
total used free shared buff/cache available
Mem: 3711 2019 166 480 1525 836
Swap: 819 222 597
swapon -s
查看每个swap使用情况
swapon -s
命令可以看到每个交换文件的使用情况
$ swapon -s
文件名 类型 大小 已用 权限
/dev/nvme0n1p2 partition 839676 227688 -1
/proc/swaps
文件
其实 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、创建大小为 2G 的交换文件sudo dd if=/dev/zero of=/swapfile1 bs=1M count=2048
$ sudo dd if=/dev/zero of=/swapfile2 bs=1M count=2048
记录了2048+0 的读入
记录了2048+0 的写出
2147483648字节(2.1 GB)已复制,30.7174 秒,69.9 MB/秒
2、修改文件的权限,避免其他用户对这个文件进行误操作:sudo chmod 600 /swapfile1
3、使用 mkswap
命令来设置交换文件:sudo mkswap /swapfile1
sudo mkswap /swapfile1
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=b30e9371-0e0b-40b4-bd85-624aeb173aa1
4、启用交换文件:sudo 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/swaps
或 free
或 swapon -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 中删除相关条目
如何增大交换空间/文件?
交换空间不够用时,如何扩大?
按照添加 交换文件 的步骤,再添加一个 /swapfile2
文件并设置为交换文件,再启用即可,
系统就会同时使用 swapfile1 和 swapfile2 这两个交换文件,总的交换空间大小是这两个文件大小之和。
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
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: