你电脑里的“闪送小哥”:为啥你的手机越用越卡跟它脱不了干系

哎,我跟你说个真事儿。上个礼拜我表弟给我打电话,声音里头带着一股子绝望,说他新买那台顶配游戏本,打游戏刚开始跟飞一样,玩了半小时就跟幻灯片似的。他以为是中了病毒,差点就要重装系统。我问他,你知不知你这电脑里头住着个“闪送小哥”,这哥们儿要是累垮了,你电脑跑得比驴还慢?

其实咱大多数人,包括以前的我,都觉得电脑快不快全看那个叫CPU的大脑袋,或者内存条大不大。错啦!真正在背后玩命干活的,是那个默默无闻的高速缓存技术。这玩意儿就像是CPU身边的私人助理,把你接下来可能要用的东西,提前给你准备好了。

你想啊,CPU那家伙干活速度贼快,但它要的数据都存在内存里头。内存离它有点距离,来回跑一趟费老劲了。这时候,高速缓存技术就充当了这个“闪送小哥”的角色。它把CPU最常用、最可能马上要用的数据,提前揣兜里,CPU一要,立马掏出来递过去,那速度,快得跟变魔术一样。

但问题来了,为啥你的手机或者电脑用着用着,就感觉这“闪送小哥”不灵光了呢?这事儿咱得好好唠唠。

你那“闪送小哥”咋就怠工了?原来是“记性”不好给闹的

有段时间我特迷一个老游戏,想重温一下。结果发现我那老爷机打开游戏那叫一个慢。我寻思着,这CPU和内存虽然老了点,但不至于这么拉胯吧?后来我一琢磨,问题八成出在那位“闪送小哥”身上——也就是咱们说的高速缓存技术

这个小哥的记忆力,也就是它的“替换策略”出了问题。啥意思呢?就跟你手机里存的联系人一样,人多了,你得想着把谁删了给新人腾地方。这个小哥也有自己的一套删人逻辑。

我那老电脑里的“闪送小哥”,用的是个特死板的逻辑,叫啥“最近最少使用”,圈里人常说的LRU-1。咋理解呢?就好比这个小哥手里有个小本本,记录着谁最近老找他。有一天来了个新任务,兜里满了装不下,他怎么办呢?他就翻开小本本,看看哪个客户是最长时间没来麻烦过他的,二话不说,把那个客户的名片给扔了,换上新的。

听起来挺公平对吧?但问题就出在,有些数据是“周期性抽风”的。就像我那游戏,一开始加载场景的时候,需要疯狂读取某几个文件,读完暂时用不上了。结果这个小哥一看,哎,这几个主儿现在不找我了,后面再来新活儿,他啪叽一下给人名片扔了。结果没过几秒钟,游戏主循环又回来了,“把那谁给我叫来!”小哥傻眼了,扔了,得,又得跑回内存那个总部去取。这一来一回,时间全耽误在路上了,你不卡谁卡?

这就好比你有个习惯,每个月最后一天才还信用卡,结果你助理看你平时不吭声,以为你不用还了,把还款提醒的小纸条给你撕了。到了月底,你俩全抓瞎。

捅破那层窗户纸:有些卡顿,其实是“屋里人”太多给挤的

后来我换了个新电脑,心里美滋滋,觉得这回总该起飞了吧?嘿,还真别说,刚开始确实爽。但好景不长,有回我开了十几个网页,又挂着微信、钉钉,还开着个视频会议,电脑又开始喘上了。我当时就纳闷了,我这CPU可是最新款的,内存也加到了32G,凭啥还卡?

我找了个懂行的朋友一问,人家一句话点醒了我:“你那个‘闪送小哥’的办公室,也就那么大点地儿。”他说的这个,就是高速缓存技术里头的另一个关键点——“缓存容量”和“映射方式”。

咱别被这词儿唬住,你想象一下,这位小哥的办公室(也就是高速缓存)里头有一排排的柜子(缓存组),每个柜子里有好几个抽屉(缓存行)-1。CPU要数据的时候,不是随便哪个抽屉都能放的。得根据地址,算出来应该放哪个柜子,然后再看那个柜子里有没有空抽屉。

我朋友说,我那新电脑虽然配置高,但架不住我“使唤”的活儿太杂了。每个柜子就那么几个抽屉,比如说一组里头就4个抽屉-1。我这边开了几十个应用,每个应用都嗷嗷待哺,都要往这组柜子里塞数据。结果就是,这4个抽屉被抢来抢去,刚放进去A的数据,B的任务来了,为了腾地儿,只好把A的刚放进去还没焐热的数据给踢出去。等A下次再要的时候,发现没了,又得重新去内存取。

我那朋友打了个比方,特形象。他说这就像你们家小区大门口就那几个快递柜。平时你一个人的快递,放进去取出来,美滋滋。赶上双十一,整个小区几百号人的快递都往这几个柜子里塞,快递员刚把张三的包裹放进去,李四的又来了,柜子满了咋整?只好把张三的取出来扔回快递车上,塞李四的。结果张三下楼取件,发现柜子是空的,这不就炸了吗?我电脑当时就是这么个情况,活儿都让这来回折腾给耽误了。

这事儿给我的教训是啥呢?别光盯着CPU核心数、内存大小这些大件儿。这位低调的“闪送小哥”要是忙不过来,你配置再高,那也是高射炮打蚊子——有劲儿使不上。

怎么让这“小哥”干得舒坦,咱也用得顺心?

说了这么多吓人的,咱也得整点实在的。怎么才能让这位小哥不撂挑子,或者说,咱们平时用电脑、手机的时候,咋样能别净给人添乱?

有一回我琢磨服务器那点事儿,发现里头有个门道叫“写策略”,这玩意儿也跟咱们平时用软件的习惯有关系-1。啥意思呢?就是数据在缓存里改完了,啥时候同步回内存那个总部。有两种极端,一种叫“直写”,就是这边小哥一改,立马跑回总部汇报,“我改了啊!”,踏实,但跑腿累。另一种叫“写回”,就是小哥先记在小本本上,等哪天这块数据要被扔出去了,或者抽空了,再一块儿回去汇报。

你看,这不就跟咱们平时干活一样吗?有些人有点屁事就立马发群里@所有人,看似实时,其实把别人烦得要死,也打断了自己的工作流。有些人呢,攒一堆事儿,最后写个周报统一说,效率是高,但万一中间出了岔子,没及时同步,可能就捅娄子。

这事儿搁咱们用户身上能干啥呢?比如你用的是那种特别吃硬盘的软件,像什么视频剪辑、大型数据库,你会发现那些优化的文章老让你设置啥“缓存策略”,让你选“性能优先”还是“数据安全优先”-10。这其实就是让咱们给那位“闪送小哥”下指令,告诉他你是想让他跑快点(写回策略,性能好,但突然断电可能丢数据),还是跑稳点(直写策略,慢点但踏实)。你选明白了,他用起来就顺手,你也就觉得系统“跟手”了。

还比如,有些云服务厂商,为了省钱,会把数据放很远的地方存着。但为了让你访问快,他们会在你本地服务器边上,给你安排一个超快的固态硬盘当“缓存”-10。这就是咱今天聊的高速缓存技术在云上的一个活生生的应用。他们甚至发现,哪怕就巴掌大点儿的地方(512MB),只要策略对头,就能挡住95%的重复读取请求,省老鼻子钱了-10。你看,这不就是那位小哥的本事吗?地方不大,但只要脑子活,照样把事儿办得漂漂亮亮。

所以说啊,以后再觉得你手机电脑卡,别急着骂厂家。想想你那位“闪送小哥”,是不是你给人派了太多活儿,或者让人家记性不够用了?人艰不拆,互相理解一下,有时候关几个后台应用,清清灰,没准儿那位被累得半死的小哥又能喘口气,你的设备也就跟着神清气爽了。