【疑难杂症2024-007】内存/缓存充足的情况下,为什么却无法命中缓存呢?

本文由Markdown语法编辑器编辑完成。
封面图由豆包AI, 文生图像生成.

1. 背景

近日产品在某家三甲医院上线后,在收图阶段,遇到了巨大的性能瓶颈。由于该三甲医院体量比较大,一天的胸肺检查量,大概在1000 ~ 1500之间。由于有一些患者,是随访病人。因此,这些患者在医院的PACS中,还存有过去的检查影像记录。
因此,实际每天需要接收图像的检查量,在1500 ~ 2000左右。
而升级新版本后,医生反馈,我们产品出现了很大的延迟。最大可能会延迟2个小时左右。也就是说,病人在8点拍摄的检查,我们的系统得10点,才能看到片子。这会严重影响医生出报告的时间,因此,反馈比较激烈。

为了解决这个问题,开始对收图模块的各个环节,进行问题定位。最终发现了一个比较奇怪的现象。
就是,在读取图像到内存中的过程,这个时间,有点超乎平时正常时间的很多倍。
在这里插入图片描述
比如,平时读1个序列,约300张的序列,一般不到1s完成;但是这家医院,读图的速度,却是几十秒。这样,一个序列的处理速度,就会慢几十秒。那么,当然随着医院高峰期的到来,堆积着需要处理的序列就会越来越多。那么,当然,医院的医生就会等待更长的时间,才能看到AI的结果。

一般,一张非压缩的CT图像,它的大小是500KB左右。如果每秒钟读4~10张图,那么也就是2 ~ 5M/s. 即使是从数据盘(机械硬盘)读图,也不应该这么慢。

而且,更奇怪的是,在同一台服务器上面,另一个服务,也需要读图。但是它读图的速度,却奇快无比,读图速度达到了几百张每秒,换算下来就是: 200M/s. 那么,这肯定就不是从机械盘读图的速度了,而是从SSD或内存中读图的速度了。
在这里插入图片描述
为什么在同样一台服务器,两个服务的读图速度,会有天壤之别呢?
那这肯定不是服务器磁盘的问题了。如果是磁盘的问题,那为什么一个服务读图像蜗牛,而另一个服务读图像猎豹呢。

那么,到底是什么原因,造成这样的结果呢?

2. 问题定位:

通过找公司的IT专家帮忙定位,是不是服务器磁盘的问题。给到的答复,也是否定的。数据磁盘没问题,它至少可以有50M/s的读图速度,但不知道为什么我的服务,却无法达到这样的速度,更别提200M~300M/s的速度了。真的很令人绝望!

眼看着医生每天都要在群里催,问题解决的进度。因为已经严重影响了他们阅片和出报告的效率。我也心急如焚。盯着那个像蜗牛一样的读图速度。有时候重启服务,可能会好一两分钟,但是马上就要降下来了。

我想不通的问题是,明明内存非常充足。因为总内存有180G, 而实际被占用的,也就85.6/189G, 还有充足的内存,可以缓存下服务需要读取的图像。
在这里插入图片描述
这里就是要提到一点,linux的缓存机制(cache)。
linux系统,为了加快文件读取的速度,它会把最近从机械硬盘/SSD读过的文件,先存放到内存的缓存区中。
这样,如果有别的服务,需要读这个文件的话,就不需要再次从硬盘读取了,而是可以直接从缓存中读。而从缓存中读文件,速度是非常快的,能够达到几百兆/s。
而如果缓存区被占满后,那么新来的文件,就会被缓存区中的旧文件,替换掉。这样,缓存中存放的,始终都是最近要读取的文件。这样,就最大限度地优化了读图的速度。

而这也是令我比较困惑的。
在这里插入图片描述
通过查看 free -m, 可以看到当前服务器的内存状态。
(总内存) total: 193032M,
(被使用) used: 89327M,
(空闲) free: 5460M,
(缓存) buff/cache: 99466M,
两者加起来,可用内存是: 103704M.
难道,将近100G的内存,还不够缓存我要读的图吗?

带着这样的疑问,我使用sudo iotop的命令,再看一下,当前占用IO较高的进程,以及服务器当前IO的一个情况。
可以看到,磁盘总的读图速度,只有13.33K/s, 有时候能达到十几兆/s.
在这里插入图片描述

索性,我就一直盯着那个龟速的日志。随机挑了一个正在读图的文件夹,然后在服务器看了一下,它是什么时候的文件。
这一看,吓了我一大跳。
原来第一个服务,当前正在读的文件,实际上已经是2~3个小时前,存在磁盘上的文件了。那么由于这个文件,距离它第一次的读取,已经过了2 ~ 3小时,缓存里面,关于它的记录,可能早就被后来新的文件给替换掉了。
这也就能解释,为什么第二个服务,读图又非常快了。
因为虽然第一个服务读图如龟速,但是它毕竟又刚刚读了一次。而这时,第二个服务,正好也要读同样的一个文件,因此,第二个服务就是直接从缓存中读取文件,因此速度就飞快。
在这里插入图片描述

可以见上述的流程图。
流程描述如下:
1> 从CT/PACS的图Series123,第一次到达服务器,写入机械硬盘后,同时也在Cache中有缓存。
2> 由于A服务需要处理的数据太多,当它去读取Series123的文件时,Cache中的Series123已经过期,导致A服务,只能再次从机械硬盘读取Series123, 因此读图速度就非常慢;
3> 由于A服务刚读过Series123, 它再次被放在Cache里面;
4> 服务B读取Series123时,是先从Cache中读图,命中缓存,因此读图速度飞快。

明确了问题后,那么解决方案就是:
想尽一切办法,减少服务A, 需要处理的数据量。让它能够更及时地,从缓存Cache中读图。这样形成良性循环,服务A, 就总是可以从Cache中读图。

经过和前方同事的沟通,服务A, 确实处理了一些,服务B其实根本不需要的图像,比如一个序列张数小于100张的序列,是明确会被过滤掉的。但由于服务A在读图时,并未做限制,导致无端地读取了很多不必要的图像,占用了读图的进程和流量。

通过调整之后,服务A, 基本都可以从缓存中读图了。这样,服务A, 读图的速度,也可以达到200 ~ 300M/s了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值