1. 简介
Swap 分区:在系统的物理内存不足时,将硬盘中的一部分空间供当前运行的程序使用。
单台服务器,当物理内存不够时会随机 kill 占用内存的进程,从而产生oom,临时使用 swap 可以解决。
生产环境中,已经不怎么启用swap了,而云服务器中,已经没有swap分区了,这是因为,当启用swap后,系统会变得非常慢非常卡顿,我们的目的是为了让服务器尽可能快。而且我们可以用分布式集群架构来防止进程被kill。即使kill掉,集群中还有好多节点支持此服务。
查看系统内存和swap大小
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 120 813 0 37 762
Swap: 2047 72 1975
[root@localhost ~]#
我们关闭swap模拟服务器OOM
[root@localhost ~]# swapoff -a
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 183 739 7 49 691
Swap: 0 0 0
[root@localhost ~]#
[root@localhost ~]# dd if=/dev/zero of=/dev/null bs=711M count=1000 #模拟内存占满
Killed # 发现被杀死,查看日志进一步确认
[root@localhost ~]# tail /var/log/messages
Jul 25 15:44:36 localhost kernel: [ 2887] 0 2887 209043 182041 367 0 0 dd
Jul 25 15:44:36 localhost kernel: Out of memory: Kill process 2887 (dd) score 710 or sacrifice child
Jul 25 15:44:36 localhost kernel: Killed process 2887 (dd), UID 0, total-vm:836172kB, anon-rss:728164kB, file-rss:0kB, shmem-rss:0kB
[root@localhost ~]#
然后我们又打开swap
[root@localhost ~]# swapon -a
[root@localhost ~]# dd if=/dev/zero of=/dev/null bs=1500M count=1000 # 继续写大数据
[root@localhost ~]# free -m # 再次查看内存使用情况 发现swap used已经有占用了。
total used free shared buff/cache available
Mem: 972 880 67 0 24 10
Swap: 2047 830 1217
[root@localhost ~]#
使用swapon -s命令查看swap分区文件
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
[root@localhost ~]#
2. Swap应用
1.用空余分区创建swap
- 创建分区
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 127 787 0 57 746
Swap: 2047 69 1978
[root@localhost ~]# fdisk /dev/sdb # 分出⼀个1G的硬盘空间给swap(大小任意指定)
......
- 格式化为swap分区
```c
[root@localhost ~]# mkswap /dev/sdb1 # 格式化为swap
mkswap: /dev/sdb1: warning: wiping old xfs signature.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=2de583e9-697c-482c-9dbb-9dc36d5b92eb
- 激活sdb1
[root@localhost ~]# swapon /dev/sdb1 # 激活sdb1
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 185 681 7 105 661
Swap: 3071 0 3071
[root@localhost ~]#
[root@localhost ~]#
使用swapon -s命令查看swap分区文件
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/dev/sdb1 partition 1048572 0 -3
[root@localhost ~]#
关闭swapoff '分区名'
[root@localhost ~]# swapoff /dev/sdb1
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
[root@localhost ~]# swapoff -a # 关闭所有
2.如果磁盘没有过多的分区可⽤,也可以通过⽂件增加SWAP空间,本质上还是磁盘
# 制造虚拟文件
root@localhost ~]# dd if=/dev/zero of=/opt/new_disk bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 1.92694 s, 163 MB/s
# 制作swap
[root@localhost ~]# mkswap /opt/new_disk
Setting up swapspace version 1, size = 307196 KiB
no label, UUID=3956dd81-4b26-4723-95c8-16acb79be5d4
[root@localhost ~]# swapon /opt/new_disk
swapon: /opt/new_disk: insecure permissions 0644, 0600 suggested. #提示不安全
# 修改权限
[root@localhost ~]# chmod 600 /opt/new_disk
[root@localhost ~]# swapon /opt/new_disk # 不用管,这时候其实已经挂载上了
swapon: /opt/new_disk: swapon failed: Device or resource busy
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 187 357 7 427 637
Swap: 2347 0 2347
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
/opt/new_disk file 307196 0 -3
[root@localhost ~]#
前面的都是临时挂载,开机自动挂载新swap分区需要修改配置文件。
任选一种即可。
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID="a8077647-7f14-4bcf-b96b-60a0f9176c05" TYPE="swap"
[root@localhost ~]# blkid /opt/new_disk
/opt/new_disk: UUID="3956dd81-4b26-4723-95c8-16acb79be5d4" TYPE="swap"
[root@localhost ~]# vim /etc/fstab
[root@localhost ~]# tail -1 /etc/fstab
UUID="a8077647-7f14-4bcf-b96b-60a0f9176c05" swap swap defaults 0 0
UUID="3956dd81-4b26-4723-95c8-16acb79be5d4" swap swap defaults 0 0