周末在家打算安装学习下grpc,发现安装到一半oom内存不足,于是有了这篇文章.
Swap 是 Linux 下的交换分区,类似 Windows 的虚拟内存,当物理内存不足时,系统可把一些内存中不常用到的程序放入 Swap,解决物理内存不足的情况。但是如果开始使用 SWAP 的时候系统通常都会变得十分缓慢,因为硬盘 IO 占用的十分厉害,除非是 SSD 的情况下,速度才有可能稍微快一点。
下面是创建使用 SWAP 的方法:
一、创建文件

dd if=/dev/zero of=/swapfile bs=1024 count=8096000

SSH 执行以上命令,创建一个名为 swapfile 的 8G 空文件.
二、制作为 Swap 文件

mkswap /swapfile

SSH 执行以上命令,将生成的 swapfile 制作为 SWAP 文件.

三、让 Swap 文件生效
swapon /swapfile
SSH 执行以上命令,使 “swapfile” 这个 Swap 文件生效,并叠加进当前 swap 空间中。

四、查看当前 SWAP
swapon -s

五、开机自动挂载
编辑/etc/fstab文件,追加如下行

/swapfile swap    swap    defaults      0    0

再编译grpc我们看到内存的使用情况:

Every 5.0s: free -m                                                                                                                                                    Sat Jul 10 23:34:04 2021

              total        used        free  shared  buff/cache   available
Mem:           3830        3470         197           0         163         153
Swap:         11967        3562        8405

经历了4个小时候,grpc终于在这台老款笔记本上成功安装,WTF,早上出门,中午回来还在编。
峰值内存占用:

Every 5.0s: free -m                                                                                                                                                    Sun Jul 11 03:59:31 2021

              total        used        free  shared  buff/cache   available
Mem:           3830        3648         103           0          79          17
Swap:         11967       10199        1768

有点小夸张,grpc编译要占用这么多内存,开始还想加一个4g的swap。
六、停用swap分区

/sbin/swapoff /swapfile

删除swap分区文件

rm -rf /swapfile

删除/etc/fstab追加行

/swapfile swap swap defaults 0 0

七、常见问题
1.物理内存充足却使用了swap
内核参数swappiness决定linux何时开始使用swap:
swappiness=0 时表示尽最大可能的使用物理内存以避免换入到swap.
swappiness=100 时候表示最大限度使用swap分区,并且把内存上的数据及时的换出到swap空间里面.
在centos7中swappiness这个值默认为60,这个值我理解是物理内存使用40%之后开始使用swap(100是尽量使用swap,90是物理内存使用10%之后开始使用swap,以此类推)。

可以调整参数大小:
重启前有效:

[root@localhost ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@localhost ~]# cat /proc/sys/vm/swappiness
10

重启后有效:

[root@localhost ~]# cat /etc/sysctl.conf
vm.swappiness = 10
[root@localhost ~]# sysctl -p

2.buffer/cache为何占用这么多内存?
buffer/cache使用过高通常是程序频繁存取文件后,物理内存会很快被用光,
当程序结束后,内存不会被正常释放,而是成为cache状态.
通常我们不需要手工释放swap,Linux会自动管理.