vscode用ssh连接服务器后,明明内存还很富足,为什么却很卡顿

前言

  这两天由于需要跑实验,数据集比较大,因此我在vscode上通过ssh连接上我们实验室的服务器(两张A100的配置)开启我的实验之路。可是却碰到了一个很奇怪的问题,在运行实验过程中,通过vscode的resource monitor看到,服务器总共251.54GB的内存空间,我只占用25GB,但却十分地卡顿!今天的第一个问题出现了!

一、判断是否是服务器上其他用户同时在执行实验

1、执行free命令查看内存占用情况

  首先我通过该命令来查看当前服务器中内存的占用情况,其结果是这样的:

内存占用情况
  先介绍一下这里每个字段代表的意思:

1、total:总的内存容量
2、used:当前已被使用的内存容量
3、free:当前可以使用的内存容量
4、shared:多个进程之间共享的内存容量
5、buffer/cache:被用于缓存磁盘内容的内存大小(可以看出被用于缓存磁盘的内存占比很大,高达166G
6、available:可以被使用的内存容量

  其中,各个参数之间的关系和区别是:

	available = free + shared + buffer/cache
	total = used + available

  根据上面的等式可以看出,free是指总内存除去用于磁盘缓存、用户缓存、进程共享之后剩余的可用供用户继续使用的内存容量。
  最终,根据我的free结果可以看到,因为已使用的用户缓存是我当前占用的内存空间,所以当前其实没有其他用户在运行实验。但是!且看下文~

2、额外的发现

  从上图中可以看到,我的swap分区启用了!于是我去查了相关资料,发现这是由于我当前已用的内存占比超过了swappiness设置的参数值,因此swap分区启用,将一部分存储在内存空间中的数据搬迁到swap空间中。
  举个例子,通过查询得知我的swappiness数值为60,代表当服务器内存空间低于total * (100 - 60)%时,启用swap分区。根据这个命令可以查看到swappiness当前设置的数值:

	cat /proc/sys/vm/swappiness

  这便是导致我程序卡顿的一个原因,为什么启用了swap分区就会导致程序异常卡顿呢
  原因:swap分区其实是磁盘中的一个小区域,即它的本质就是磁盘,只是我们将其赋予指定的作用:当内存不足时,将内存中的一部分比较不常用的数据搬迁到这个分区中,空出新的内存区域继续使用。但是由于磁盘的IO远远低于内存的IO速度,这就会导致相当大的IO延迟。而当我们需要再一次使用到已经搬迁到swap分区的数据时,则需要将其再重新从磁盘中读回到内存,再次产生巨大的IO延迟,因此,程序的异常卡顿就是这么来的。

3、解决

方法一: 确保内存够用的情况下,可以直接关闭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

二、附加:buffer/cache和swap的先后顺序

  在了解free命令时,让我奇怪和困惑的是buffer/cache,官方定义是说这是磁盘缓存占用的空间,于是我思考,这里缓存的数据究竟是什么呢?为什么需要缓存这部分数据来占用内存?并且,当服务器中内存不够用户使用时,会释放部分buffer给用户继续使用,按照这个逻辑,触发buff/cache让出部分空闲空间给用户也应该有一个内存边界设置,下面开启解答:

  • buff/cache的作用:当我们对文件进行读写操作时,linux内核为了提高读写速度,就会将我们访问的这些文件全部缓存到buffer/cache这里,以供我们下次使用。如果我们连续不断地对不同的文件进行读写,则会将所有这些不同的文件都缓存到buffer/cache中,不会自动释放这部分内容。而且,由于linux服务的特点—万物皆文件,因此服务器产生的网络连接、用户协议的套接字等也都会被缓存到buffer/cache中【1】,再加上在内存够用的情况下,buffer/cache不会自动释放这部分内存,长期积累,buffer/cache就会长期处于高占比的状态。
  • buff/cache释放:当内存不够用时,buffer/cache就会自动释放部分空间,作为free空间给用户使用。
  • buff/cache大小空间:由于linux的内存管理机制,会将暂时不用的内存转为buff/cache,从而尽可能将全部被访问的磁盘数据缓存到内存中,提升系统的运行效率。所以,通过free命令观察内存分配时我们可以看到,在内存足够的情况下,buff/cache所占的比例要远远大于free的比例。

  那么当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官方文档来详细讲一下。至于为什么不今天讲完呢?因为,刚才开组会挨骂了呜呜,肝论文肝实验去了😭
  跟自己说声加油😭。永远相信自己,不要气馁 ❗️

reference

【1】https://www.cnblogs.com/lvzhenjiang/p/14047174.html

  • 32
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值