这两天由于需要跑实验,数据集比较大,因此我在vscode上通过ssh连接上我们实验室的服务器(两张A100的配置)开启我的实验之路。可是却碰到了一个很奇怪的问题,在运行实验过程中,通过vscode的resource monitor看到,服务器总共251.54GB的内存空间,我只占用25GB,但却十分地卡顿!今天的第一个问题出现了!
首先我通过该命令来查看当前服务器中内存的占用情况,其结果是这样的:
1、total:总的内存容量
2、used:当前已被使用的内存容量
3、free:当前可以使用的内存容量
4、shared:多个进程之间共享的内存容量
5、buffer/cache:被用于缓存磁盘内容的内存大小(可以看出被用于缓存磁盘的内存占比很大,高达166G)
6、available:可以被使用的内存容量
其中,各个参数之间的关系和区别是:
available = free + shared + buffer/cache
total = used + available
根据上面的等式可以看出,free是指总内存除去用于磁盘缓存、用户缓存、进程共享之后剩余的可用供用户继续使用的内存容量。
最终,根据我的free结果可以看到,因为已使用的用户缓存是我当前占用的内存空间,所以当前其实没有其他用户在运行实验。但是!且看下文~
从上图中可以看到,我的swap分区启用了!于是我去查了相关资料,发现这是由于我当前已用的内存占比超过了swappiness设置的参数值,因此swap分区启用,将一部分存储在内存空间中的数据搬迁到swap空间中。
举个例子,通过查询得知我的swappiness数值为60,代表当服务器内存空间低于total * (100 - 60)%时,启用swap分区。根据这个命令可以查看到swappiness当前设置的数值:
cat /proc/sys/vm/swappiness
这便是导致我程序卡顿的一个原因,为什么启用了swap分区就会导致程序异常卡顿呢?
原因:swap分区其实是磁盘中的一个小区域,即它的本质就是磁盘,只是我们将其赋予指定的作用:当内存不足时,将内存中的一部分比较不常用的数据搬迁到这个分区中,空出新的内存区域继续使用。但是由于磁盘的IO远远低于内存的IO速度,这就会导致相当大的IO延迟。而当我们需要再一次使用到已经搬迁到swap分区的数据时,则需要将其再重新从磁盘中读回到内存,再次产生巨大的IO延迟,因此,程序的异常卡顿就是这么来的。
方法一: 确保内存够用的情况下,可以直接关闭swap分区的启用
关闭swap分区:sudo swapoff -a
开启swap分区:sudo swapon -a
方法二: 如果还是有可能占用到swap分区,则可以将swappiness数值减小,尽可能避免使用
sysctl vm.swappiness=10
这是临时调整swappiness的方法,重启服务器之后还是会恢复到默认的数值,如果想要永久改变,则可以到/etc/sysctl.conf文件上进行编辑修改
sudo vim /etc/sysctl.conf
进入该文件后,修改以下内容:
vm.swappiness = 10
随后保存退出,运行以下命令使其生效:
sudo sysctl -p
在了解free命令时,让我奇怪和困惑的是buffer/cache,官方定义是说这是磁盘缓存占用的空间,于是我思考,这里缓存的数据究竟是什么呢?为什么需要缓存这部分数据来占用内存?并且,当服务器中内存不够用户使用时,会释放部分buffer给用户继续使用,按照这个逻辑,触发buff/cache让出部分空闲空间给用户也应该有一个内存边界设置,下面开启解答:
那么当buff/cache过大时又会导致另一个问题,就是很快就会启用swap分区,这就导致本末倒置了,本来增大buff/cache空间就是为了提升性能效率的,但是过大又会导致启用swap分区,需要进行磁盘数据的交互,严重降低IO性能。解决这个问题除了可以用上面的方法:禁用swap或者修改触发swap启用的数值,还可以手动释放buff/cache
linux官方文档提供了以下三种手动清空buff/cache的命令:
echo 1 > /proc/sys/vm/drop_caches # 仅清除页面缓存
echo 2 > /proc/sys/vm/drop_caches # 清除目录项和 inode
echo 3 > /proc/sys/vm/drop_caches # 清除页面缓存、目录项以及 inode
好了,今天先将到这里吧,对于最后一点附加内容,想再扩充一篇博文基于linux官方文档来详细讲一下。至于为什么不今天讲完呢?因为,刚才开组会挨骂了呜呜,肝论文肝实验去了
跟自己说声加油。永远相信自己,不要气馁 ❗️
【1】https://www.cnblogs.com/lvzhenjiang/p/14047174.html