当前位置:首页 > 科研成果库

你刷小程序时等的那3秒,全是Serverless冷启动在搞鬼

2026-10-18 22:03:57小研科研成果库11
上周帮做宠物寄养小程序的朋友排查问题,他说最近总有用户反馈,第一次打开小程序点‘预约上门喂猫’按钮,要转三四秒的圈,第二次点就秒开,他一开始以为是用户家网不好,换了CDN节点也没解决。

真不是网的问题。

这是Serverless冷启动在作祟。

你遇到的"第一次加载慢",根本不是网的锅



很多人刚接触Serverless的时候,销售拍着胸脯说‘不用管服务器,写好代码直接上线,按实际调用量付钱’,听着确实香。但很少有人会告诉你,这套模式的核心逻辑是——纯弹性缩容的Serverless实例,在连续15分钟没有请求的情况下,会被云厂商直接回收。

啥意思?就像你租的共享自习室,没人来的时候,老板直接把所有房间的灯关了、空调停了、门反锁,一分钱成本都不花。等你第一次推门进来,老板得提前给你开门、开灯、连WiFi、给你找对应的插座,等你把书包放下、电脑打开,才能开始干活,对吧?这个‘从空房间到能正常学习’的准备过程,就是Serverless冷启动。

Serverless冷启动全链路流程示意图Serverless冷启动全链路流程示意图

别觉得这是小事。上次跟做电商的朋友喝酒,他说去年618零点冲第一波流量的时候,有15%的用户点进活动页直接卡在加载圈,跳失率高到老板当场把茶杯摔了。后来排查才发现,他的活动接口全用了纯弹性的Serverless配置,零点之前的半小时根本没有用户访问,所有实例全被回收了,第一波用户涌进来的时候,全在触发冷启动。

冷启动的时间到底花在哪?真不是云厂商故意磨洋工。首先得从底层资源池里切一块隔离的计算环境,然后把你打包的代码从对象存储拉到这个环境里,要是你用的是Python或者Node.js,还得把你依赖的那一堆第三方库全装好,再读入你配置的数据库连接串、环境变量,最后跑一遍初始化的健康检查,所有环节都顺了,才能接住你的第一个请求。

我见过最夸张的冷启动,是一个客户的函数冷启动要8秒。点进去一看,他把整个node_modules文件夹、还有120M的测试用宠物图片全打进了代码包,光拉取代码包的时间就占了4秒。后来我们把生产环境用不到的依赖全删掉,把大图片全移到对象存储按需读取,冷启动直接降到1.2秒。

那些被吹上天的"零运维",其实一半的坑都在冷启动里



说实话,我见过太多人刚用Serverless的时候,踩的都是同一个坑。一开始算成本,觉得比自己买固定服务器省70%,结果上线才发现,自己的用户群体本来就分散,隔半小时才来一个访问,几乎每次用户进来都要触发冷启动,平均等个3-5秒,用户早就划走了。

云厂商当然知道这个问题,所以也给了对应的解决方案。比如你可以买几个‘预留实例’——说白了就是给你留几个24小时不关机的固定工位,不管有没有人访问,都给你保持就绪状态,但是这个要额外花钱。还有个更便宜的玩法,就是写个定时任务,每隔10分钟给你的接口发个空请求,不让实例被回收,相当于你自己远程按一下自习室的灯,不让老板把房间锁了。但算算账就知道,要是你本身流量就不高,这套操作的成本,跟你自己买个小服务器也差不了多少。

Serverless冷启动优化前后耗时对比柱状图Serverless冷启动优化前后耗时对比柱状图

去年帮一个做在线手账工具的客户做架构优化,一开始他们全量用纯弹性Serverless,算下来一个月成本才几百块,结果上线第一周7日留存直接掉了20%。为啥?他们的核心用户都是高中生,平时上课的时候根本没人用,下课铃一响全涌进来,每个请求都触发冷启动,平均加载3.8秒,学生哪有这个耐心等?

后来我们做了拆分:核心的手账编辑接口,留2个常驻的预留实例,保证用户点进来的时候不用等;非核心的分享、评论、历史记录接口,还是用纯弹性缩容。同时把代码包从230M砍到18M,把冷启动时根本用不到的大模型SDK、字体文件全改成按需加载。最后测出来的结果,核心接口的平均响应时间从3.8秒降到了400毫秒,整体成本只比一开始的纯弹性方案高了15%,过了半个月,留存就回到了之前的水平。

不过话说回来,当时客户一开始还觉得我们是浪费钱,直到看到后台的留存数据涨上来,才拍大腿说早知道当初就不该听销售吹‘纯Serverless零成本’。

别把冷启动当洪水猛兽,它其实是个成本和体验的天平



我发现很多人对冷启动有个特别极端的误解,觉得只要有冷启动,就是Serverless不好用。

真不是。

你想啊,要是所有的Serverless实例都24小时不关机,那你跟自己买一堆固定服务器有啥区别?冷启动本质上是把闲置的资源成本,折算成了用户偶尔一次的等待时长。对于那种流量波峰波谷特别大的场景,比如你做个临时的产品发布会报名页,平时根本没人看,发布会当天一秒钟涌进来几万用户,那用纯弹性的Serverless就太合适了。哪怕第一次访问要等个1秒,总比你提前买几十台服务器放那空着,活动结束全当垃圾扔了强吧?

还有那种每天半夜跑一次的定时数据处理任务,比如每天凌晨2点跑一遍用户账单结算,跑完就直接把资源回收,冷启动个几秒根本没人在意——毕竟是半夜跑的,用户根本感知不到。

那什么场景不适合纯弹性的Serverless?就是那种用户量特别稳定、对响应速度要求极高的系统,比如企业内部的OA登录、员工打卡接口,大家每天上班第一时间就要登系统打卡,要是每次打开都要等个两三秒,员工早就闹翻天了。

之前跟一个云厂商的资深架构师吃饭,他说现在遇到的冷启动慢的问题里,80%根本不是云平台的锅,是开发者自己的代码写得太糟。比如有人在函数初始化的时候,就把所有的数据库连接、所有的大模型SDK、所有的大文件全加载到内存里,哪怕用户只是调用个最简单的‘获取用户头像地址’的接口,也要把那几MB的东西全跑一遍初始化,那冷启动能不慢吗?我上次见一个更离谱的,有人在函数初始化的时候,先读了个100M的日志文件到内存里,就为了给用户返回一句固定的‘欢迎回来’,冷启动直接6秒,我让他把那个文件移到对象存储里,真需要的时候再去读,直接快了4秒。

上周那个做宠物小程序的朋友给我发消息,说他把代码包里塞的那一堆测试用的猫狗高清图全删了,冷启动从4秒降到了1.1秒,现在后台再也没有用户吐槽加载慢了。

他说现在才明白,哪有什么万能的技术啊。Serverless也不是什么银弹,冷启动也不是什么十恶不赦的bug。不过是你得摸透每个技术的脾气——想省成本,就得接受偶尔的等待;想体验拉满,就得在成本上多留一点余地。

哪有什么天上掉下来的零运维。不过是有人在你看不见的地方,把天平的砝码调来调去而已。