Invidious 缓存调优:3层方案,从转圈10秒到1秒打开

发布时间:2026/9/5 18:11:15
Invidious 缓存调优:3层方案,从转圈10秒到1秒打开 Invidious 缓存调优3层方案从转圈10秒到1秒打开【免费下载链接】invidiousInvidious is an alternative front-end to YouTube项目地址: https://gitcode.com/GitHub_Trending/in/invidious翻车现场转圈40秒是常态22:47你打开自己部署的 Invidious 实例视频页面转了40秒圈。更恼火的是它不偶尔发生每隔十来分钟只要有人点开同一个视频就转一次。你查出站流量请求全打向 YouTube。根源不是你的网络。是 Invidious 的缓存层一直按默认值在跑一行都没调过。诊断清单你的慢是哪一种症状根因哪节解决视频页每次转几秒周期约10分钟新鲜度窗口写死10分钟updated超过10分钟就重新抓 YouTubesrc/invidious/videos.cr 第308行第2层实例重启或长时间无人访问后首个请求最慢冷启动数据库select落空走fetch_video直连src/invidious/videos.cr 第303行第2层 / 第3层观看页注释反复解析API 响应慢cache_annotations默认false注释不进库src/invidious/config.cr 第147行第1层页面 CSS/JS 首次访问慢刷新后变快静态资源内存缓存上限 5MB超限后每次读盘src/ext/kemal_static_file_handler.cr 第123行第3层四种情况背后是同一套机制Invidious 用 PostgreSQL 当视频元数据的缓存层规则是10分钟新鲜度窗口 6小时存活期。窗口一过第一个请求去 YouTube 阻塞拉取其余并发请求全在等它。第1层只改1行yaml不用碰源码适合有服务器权限、但没空读源码的你。在配置里打开cache_annotations注释掉的示例在 config/config.example.yml 第570行默认值在config.cr第147行## 把视频注释缓存进数据库。默认 false未缓存时每次观看页/ ## API 请求都要重新向 YouTube 拉取并解析 ## 生效条件注释里含传统标注纯 card/branding 不会被存 cache_annotations: true说白了这个开关只省传统注释的麻烦源码里只把 branding、card、drawer 之外的注释写库src/invidious/helpers/helpers.cr 第53-61行。收益是实打实的命中一次就少一次 YouTube 请求加一次 XML 解析对反复拉同一个视频的 API 调用者收益最大。注意视频元数据那个10分钟窗口是源码里写死的配置改不动。想动它进第2层。第2层改2行源码先看这个 diff适合能git、能重新编译的你仓库根目录有现成的Makefile。两个改动都在一行级别。改动1新鲜度窗口从10分钟放宽到1小时src/invidious/videos.cr 第308行- (Time.utc - video.updated 10.minutes) || (Time.utc - video.updated 60.minutes) ||效果是整站每10分钟为每个热视频重新拉一次变成每小时最多一次。窗口内所有用户共用同一份缓存只有第一个请求付 YouTube 请求的钱。改动2存活期从6小时放宽到24小时src/invidious/database/videos.cr 第28行- WHERE updated (now() - interval 6 hours) WHERE updated (now() - interval 24 hours)别急着改。清理任务 src/invidious/jobs/clear_expired_items_job.cr 仍按每小时跑一次执行频率不变变的只是数据存活期。收益隔几小时再访问缓存大概率还在不再是冷启动。订阅源页面走同一份元数据缓存窗口放宽后feed 的刷新频率同步下降这对实例的出站请求量是最直观的减负。第3层给前面加一层反向代理适合多人共享的公共实例。思路两条点到为止在 Invidious 前挂 nginx用proxy_cache缓存/assets/和/api/v1/videos/id这类接口把静态资源与元数据挡在应用进程之外公共实例可再前置 CDN按路径只缓存/assets/让 Invidious 自带的CACHE_LIMIT内存缓存专心干它擅长的事。配套的一行 diff把静态资源内存缓存上限从 5MB 提到 50MBsrc/ext/kemal_static_file_handler.cr 第123行- CACHE_LIMIT 5_000_000 # 5MB CACHE_LIMIT 50_000_000 # 50MB一个前提先自查Postgres 挂掉时这些缓存全是空话get_video捕获DB::Error后直接绕过缓存直连 YouTubesrc/invidious/videos.cr 第326行。先修好数据库再谈调优。量化验证3个数字就够测三个数观看页 P95 首字节时间、单个视频的每日抓取次数、静态资产读盘占比看响应里的 304/内存命中比例。指标调优前典型值调优后预期值观看页 P95 首字节3~10s撞上刷新窗口时0.2~1s缓存命中热门视频每日抓取次数持续有人看的上限约144次/日每10分钟窗口一次约24次/日每小时窗口一次静态资产磁盘读取占比30%~60%10% 以下抓一次访问日志数fetch相关请求对比调整前后两小时窗口即可不用搭监控。⚠️ 边界与回滚什么情况下别动动了怎么退三种情况别改以直播为主的实例别把10分钟窗口放到1小时直播的观看数和状态变化快窗口一长就有人看到旧数据512MB 内存的 VPS别把 5MB 提到 50MB共享实例别擅自把存活期放到24小时别人投诉元数据旧找的是你。回滚一条命令git checkout -- src/invidious/恢复源码配置备份拷回config/config.yml重编译重启即可。先做第1层那1行见效之后再谈下一层。【免费下载链接】invidiousInvidious is an alternative front-end to YouTube项目地址: https://gitcode.com/GitHub_Trending/in/invidious创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考