跳到正文

Lite、Core 与 Full

比较 Lite、Core 和 Full 的功能、体积、资源预算与发布方式,选择适合的版本。

更新于 Markdown 版本

Kiln 提供 Lite、Core 和 Full 三个版本。三者使用相同的配置模型和原生媒体模块,区别在于管理功能、是否内置 FFmpeg,以及资源预算。

三个变体

维度 Lite Core Full
默认 packager native native auto
原生 HLS / DASH
FFmpeg 不包含 不包含 内置 9.0
登录、M3U、播放
SQLite 数据库
管理控制台与管理 API
EPG
OTLP 与 pprof
基础镜像 scratch Alpine Alpine 加 FFmpeg
定位 固定配置的低资源播放节点 完整的纯原生部署 完整的兼容部署

kiln:latest 是同版本 kiln:full 的别名,不是第四种运行时实现。

镜像提供的默认 packager 通过 KILN_DEFAULT_PACKAGER_ENGINE 注入,只在配置里没有写 [packager].engine 时生效。同一份配置不会因为换了镜像标签而悄悄改变行为,详见 媒体引擎

构建与分发方式

Core 与 Full 使用完全相同的标准构建入口和编译参数,产出的应用二进制大小一致,差别只有镜像里是否存在 ffmpeg 以及注入的环境变量。Lite 是唯一一个在编译期就不同的变体:

# Core 与 Full 共用的标准构建
CGO_ENABLED=0 go build -trimpath -o kiln ./apps/server

# Lite 通过构建标签换掉整个入口与控制面
CGO_ENABLED=0 go build -tags=lite -trimpath -o kiln ./apps/server

lite 标签让编译器选中另一份 main,SQLite、管理控制台、EPG、遥测导出这些控制面依赖根本不会进入依赖闭包,因此 Lite 不是“把功能关掉”,而是没有编译进去。

三个镜像对应 Dockerfile 里的三个 target:

docker build --target lite -f deploy/docker/Dockerfile -t kiln:lite .
docker build --target core -f deploy/docker/Dockerfile -t kiln:core .
docker build --target full -f deploy/docker/Dockerfile -t kiln:full .

Core 的多架构构建覆盖 linux/amd64linux/arm64linux/arm/v7linux/arm/v6。二进制分发方面,安装脚本的 --lite 只提供 Linux 构建,其它平台安装的都是完整版,参见 安装脚本

Lite 的边界

Lite 的公开接口只有 /healthz/readyz/v1/auth/login/v1/playlist.m3u/v1/play/*。它不创建 SQLite,data_dir 里只有自动生成的登录密钥和临时媒体文件,因此可以配合只读根文件系统运行。

配置里出现下面任何一项时,Lite 会在启动时直接拒绝,而不是静默忽略:

  • 全局或任一频道的 packager 引擎不是 native
  • 存在已启用的 EPG 源
  • 配置了 OTLP 导出端点
  • 启用了 pprof

Lite 的固定资源预算

Core 与 Full 按容器实际内存挑选内部档位,Lite 则不管宿主机多大,都固定使用同一组预算,以保证跨机器的低内存特征一致:

生效值 Lite 对比:受限档位的 Core / Full
Go 软内存目标 24 MiB 48 MiB
原生 inflight 上限 24 MiB 32 MiB
单段上限 20 MiB 20 MiB
启动 / 预取流水线 1 / 1 1 / 1
GOGC 50 75
主动回收媒体页缓存

这组数字在 resource_modeautoconstrained 时都成立,只有 performance 会让 Lite 完全退出自适应、改用配置里写的值。预算是 Go 堆与媒体工作集的软目标,不是容器总 RSS 的保证。

性能对比

下面的数字来自仓库内的受控实测,测试日期 2026-07-23,架构 linux/arm64,三个变体在相同宿主机、相同容器限制(1 CPU、128 MiB)、相同配置和相同媒体 fixture 下各跑 5 轮、共 100 次完整链路。

体积(MB 为十进制字节):

变体 Docker 本地镜像 Kiln 二进制 额外 FFmpeg
Lite 3.84 MB 9.31 MB
Core 13.27 MB 22.22 MB
Full 66.41 MB 22.22 MB 109.57 MB

内存与链路稳定性:

变体 负载后 RSS 中位数(范围) 成功链路 OOM
Lite 13.01 MiB(11.48 到 13.33) 100 / 100 0
Core 25.17 MiB(25.11 到 25.27) 100 / 100 0
Full 25.21 MiB(21.03 到 25.35) 100 / 100 0

结论性的几条:

  • Lite 的镜像比 Core 小 71.1%,比 Full 小 94.2%;二进制比 Core 与 Full 小 58.1%。
  • Lite 的负载后 RSS 中位数比 Core 低 48.3%、比 Full 低 48.4%。这个下降来自运行时结构和预算共同变化,不只是二进制变小。
  • Core 与未启动 ffmpeg 子进程的 Full 在原生路径上没有可解释的内存差异,两者相差约 0.14%。把 ffmpeg 放进镜像主要增加分发与磁盘成本。
  • 官方验收里,Lite 在 1 CPU、64 MiB 的容器中完成 10 次链路,负载后 RSS 为 12.80 MiB,无 OOM。

测试环境与方法

宿主机为 Apple M1 Max(10 核、64 GiB),容器运行在 OrbStack 的 linux/arm64 环境,每个 Kiln 容器限制 1 CPU、128 MiB,swap 与内存相同,根文件系统只读,移除全部 Linux capabilities 并启用 no-new-privileges。三个变体按交叉顺序执行,以减弱固定顺序带来的缓存偏差。

工作负载使用仓库内的确定性媒体 fixture 而不是外部源站:320×180、25 fps、4 秒、约 120 kbit/s 的 H.264 测试图,配 32 kbit/s 双声道 AAC 测试音。每次迭代完整抓取加密 DASH 转 HLS 的 master、media、init 与分片,以及 HLS 代理的 playlist、init 与分片。Full 默认走 auto,但该 fixture 可由原生引擎完整处理,日志确认为原生路径且进程表中没有 ffmpeg 子进程,因此这组数字隔离的是变体本身的开销。

内存以每轮第 20 次迭代后 PID 1 的 VmRSS 快照为准。cgroup 的 memory.peak 同时记账匿名内存和文件页缓存,跨轮波动明显更大,只用于确认容器边界与 OOM 安全性,不用于变体之间的排名。每个指标报告 5 轮的中位数与范围;样本量小,只作描述性比较。

复现

先从目标修订构建并检查镜像,检查会验证变体标签、默认 packager、非 root 用户、ffmpeg 边界以及 Lite 的依赖闭包和体积上限:

make docker-images docker-verify-images

单轮比较使用 deploy/docker/native-media-runtime-smoke.sh,通过环境变量固定容器限制、迭代次数和预期资源档位:

KILN_SMOKE_CHECK_RESOURCES=1 \
KILN_SMOKE_CPUS=1 \
KILN_SMOKE_MEMORY=128m \
KILN_SMOKE_ITERATIONS=20 \
KILN_SMOKE_VARIANT=lite \
KILN_SMOKE_EXPECTED_PROFILE=lite \
  sh deploy/docker/native-media-runtime-smoke.sh kiln:lite-local

Core 与 Full 把 KILN_SMOKE_VARIANTKILN_SMOKE_EXPECTED_PROFILE 换成 core / fullcompact。正式复测至少重复 5 轮并轮换执行顺序,跨提交比较时还要保持 Docker 版本、宿主负载、容器限制、fixture 和迭代数不变。真实频道的验收另有 scripts/live-performance.sh,用于测量冷启动、首个 manifest、吞吐实时比、RSS 与 CPU。

怎么选

选 Lite

节点只需要登录、M3U 和播放,频道完全由原生引擎处理,配置用文件管理不需要运行时数据库和管理台,并且资源预算、镜像拉取速度或攻击面是首要考虑。

选 Core

需要完整的管理控制台、数据库、EPG 和观测能力,并且已经确认所有 DASH 频道都能被原生引擎处理。相比 Full 显著减少镜像体积,但在同样的原生路径上不要指望进程内存明显更低。

选 Full

输入兼容性优先,需要保留 ffmpeg 回退。原生可处理时它的内存表现与 Core 接近;真正发生回退时,容器限制要按“Kiln 进程加 ffmpeg 子进程加页缓存”来设。

不确定时从 Full 起步,把频道跑通、确认日志里都是原生路径之后再换 Core;需要边缘播放节点时再单独部署 Lite。三者共用同一份配置模型,迁移只需要换镜像,参见 Docker 部署

Windows

Windows 发行版不含 ffmpeg,也没有 Lite 构建。[packager].engineauto 时会自动走原生引擎,确实需要兼容回退时自行安装 ffmpeg 并加入 PATH。其它方面 Windows 版与完整版一致,包含管理控制台、数据库、EPG 与观测能力,安装与服务注册见 二进制安装

导航

输入以搜索…

↑↓ 移动↵ 打开Esc 关闭