作者:CG 于 2023-09-06
一、问题表现
企业在用的内部系统,B/S架构,某个功能点击弹出的子页面加载时间 > 30 秒,严重影响使用体验和工作效率。
二、排查前的想法
接到问题反馈后,一些根据经验脑补的可能性:
1. 页面错误调用外网资源,例如 js 库、css、字体等等,解决方法:修改资源加载路径,重新指向服务器本地。
2. 页面调用后端接口超时或出错导致的多次重试,例如后端接口升级变动了没有同步更新前端页面,或者调用已作废的接口等等,解决方法:前后端联调排查修复。
3. 页面 js 出错,例如 调用浏览器不支持的高版本 HTML5 或者 JS 的 Api;解决方法:进入浏览器开发模式, 排查页面 js 错误。
4. 页面调用接口,返回数据时间过长,解决方法:排查后端接口服务,优化数据库查询语句和数据库表,减少耗时。
...
三、排查过程
1. 服务器端排查: .NET 全家桶, Windows Server 2016 + IIS 10.0 + SQLServer 2014, 服务器系统资源正常, 日志无报错。
2. 客户端排查:Windows 10 自带 Edge 浏览器,F12 进入开发者模式,清理缓存后,观察问题页面的网络加载时间:
结果,问题页面加载的前三个静态资源文件就已消耗了离谱的时间:
loading-1.gif 948B 用时 20.71 秒;
GridXqinfo.html 6.8kB 用时 20.54 秒;
icon.png 11.7kB 用时 9.69 秒;
后面若干静态文件也有类似的犯病表现,页面加载总用时50秒,看来直接的病因就在于此了,脑补果然是脑补,现实永远更魔幻。
四、解决过程
解决思路:加快 IIS 静态资源的响应速度
操作过程:打开 IIS 管理器,打开问题网站的配置页面,进入【缓存】配置页;把刚才排查到的静态文件后缀逐一添加到输出缓存列表中,包括 .html,.gif, .jpg, .png, .ttf; 勾选【用户模式策略】和【内核模式策略】,选择【发生更改前一直缓存】;最后重启网站。
五、效果
loading-1.gif 973B 用时 14 毫秒;
GridXqinfo.html 6.8kB 用时 34 毫秒;
icon.png 11.8kB 用时 43 毫秒;
以前同样的前三个静态资源文件为例,加载时间直接降到毫秒级,页面6秒多整体加载完毕,效果可谓立竿见影,至此问题已初步解决。
后端接口和数据库查询优化需要开发后续介入,估计能再榨出一定时间。
六、后话
直观上的问题已解决,但问题根源在于IIS返回静态资源文件耗时异常长,后续需进一步探寻。
几个猜测:
1. 网站配置了多个静态资源路径,且文件版本不一致,导致 IIS 需多次查询判断,证据:静态文件大小前后不一致。
2. 网站启用了静态内容压缩,从而影响了静态资源文件的响应速度,也许有BUG。
3. 网站静态资源路径权限配置问题,导致 IIS 无法用默认账号加载。
记录本次处理过程,望能为遇到类似问题的朋友提供思路,水平所限,如发现错漏或知道此问题的根源,请务必留言告知。