热门轻量博客 × MiniBlog × WordPress | 基础功能 · 技术路线 · 1000 篇文章压力测试
基准环境:Docker 容器(统一 --cpus=4 --memory=2g),1000 篇中文 Markdown 语料(~12MB),自研 Python 并发压测引擎
下列结论均来自本报告在统一基准环境下的实测数据。
综合网上检索与 GitHub 星标(截至 2026-07)。本报告对其中 7 个覆盖不同架构的代表项目做了深度部署与压测,并以 MiniBlog(本项目,AI 生成)与 WordPress 为对照锚点。
| 项目 | 技术栈 | 存储 | Stars |
|---|---|---|---|
| Hugo ★参测 | Go / SSG | 无 | 89,252 |
| Ghost ★参测 | Node.js / SQLite | SQLite | 54,608 |
| Astro | TypeScript / SSG | 无 | 61,407 |
| Jekyll | Ruby / SSG | 无 | 51,604 |
| Hexo | Node.js / SSG | 无 | 41,764 |
| Halo | Java / 应用 | MySQL | 39,428 |
| Grav | PHP / Flat-File | 无 | 15,599 |
| Typecho ★参测 | PHP / 轻量 | MySQL | 12,412 |
| WordPress ★参测·锚点 | PHP / 重型 CMS | MySQL | 21,301 |
| WriteFreely | Go / 轻量 | SQLite/MySQL | 5,208 |
| VanBlog | Go / 轻量 | SQLite | 3,565 |
| Bludit ★参测 | PHP / Flat-File | 无 | 1,461 |
| HTMLy ★参测 | PHP / Flat-File | 无 | 1,351 |
| Pico | PHP / Flat-File | 无 | 3,903 |
| MiniBlog ★参测·锚点 | PHP / Flat-File(本项目) | 无 | 1 |
部署方式与文章发布方式,是轻量博客“轻”的核心体现。
| 项目 | 语言/运行时 | 存储 | 缓存策略 | 部署方式 | 文章发布方式 | 关键特征 |
|---|---|---|---|---|---|---|
| MiniBlog | PHP 8.3 | 无(平面文件) | APCu + cache.json 文件缓存 | Docker 镜像(PHP-Apache)上传即运行 | 写 Markdown 到 content 目录,自动索引 | AI 生成;搜索按文件名(即标题),无正文检索 |
| HTMLy | PHP 8.3 | 无(Flat-File) | 文件缓存 | PHP 上传即运行 | 后台编辑器 / 直接放 .md | 全文搜索对中文(CJK)因分词失效 |
| Bludit | PHP 8.3 | 无(JSON 平面文件) | JSON 文件缓存 | PHP 上传即运行 | 后台 Web 编辑器写 Markdown | 搜索全量扫描 ~9.3MB/次,中文查询 0 命中 |
| Typecho | PHP 8.3 | MySQL(轻量) | MySQL 查询缓存 | PHP + MySQL(安装向导建库) | 后台编辑器 | MySQL 全文检索,中文正常 |
| WordPress | PHP 8.3 | MySQL | MySQL + 对象缓存(插件) | LAMP / Docker | Gutenberg 编辑器 / WP-CLI / REST API | 重型 CMS,功能最全 |
| Ghost | Node.js | SQLite | SQLite + 内存 | Docker(Node) | Koenig 编辑器 / Admin API | 搜索仅标题(Content API) |
| Hugo | Go | 无(构建期) | 静态产物 + 客户端索引(index.json) | 构建为静态文件 → nginx/任意静态托管 | 写 Markdown + hugo build(CLI/CI) | 静态站点生成器(SSG);搜索在客户端 |
语言、存储、缓存策略决定性能上限与资源占用;右侧为实测资源与规模指标。
| 项目 | GitHub Stars | 磁盘占用 | 常驻内存 | 核心代码量 | 导入 1000 篇耗时 |
|---|---|---|---|---|---|
| MiniBlog | 1 | 12 MB | 37 MB | 3,790 | 直接写文件(瞬时) |
| HTMLy | 1351 | 25 MB | 38 MB | 20,427 | 直接写文件(瞬时) |
| Bludit | 1461 | 24 MB | 54 MB | 17,045 | 直接写文件(瞬时) |
| Typecho | 12412 | 14 MB + DB 16.8 MB | 30 MB | 36,130 | 21.3 s(脚本导入) |
| WordPress | 21301 | 101 MB + DB 17.7 MB | 90 MB | 596,449 | 76 s(WP-CLI 导入) |
| Ghost | 54608 | 49.3 MB (SQLite) | 187 MB | — | 85.6 s(Admin API 导入) |
| Hugo | 89252 | 64 MB (public/) | 24 MB | — | 4.6 s(hugo build) |
统一用 Python 并发引擎(10 并发 / 300 请求)压测,消除 ab 对分块编码的兼容偏差。指标:页面响应时间、吞吐(RPS)、每次点击磁盘文件读写。
| 项目 | 首页 均值 | 首页 p95 | 文章页 均值 | 列表2 均值 | 分类 均值 | 搜索 均值 |
|---|---|---|---|---|---|---|
| MiniBlog | 1.07 | 1.36 | 1.42 | 1.00 | 1.31 | 1.19 |
| HTMLy | 1.16 | 1.54 | 1.41 | 1.03 | 1.03 | 4.49 |
| Bludit | 8.51 | 9.51 | 6.11 | 8.15 | 8.26 | 309.02 |
| Typecho | 31.96 | 37.96 | 7.48 | 32.16 | 31.50 | 49.56 |
| WordPress | 55.23 | 60.23 | 45.36 | 56.08 | 56.45 | 77.85 |
| Ghost | 49.27 | 53.24 | 25.66 | 50.43 | 28.28 | 14.87 |
| Hugo | 0.34 | 0.50 | 0.30 | 0.34 | 0.34 | 0.40 |
| 项目 | 首页 | 列表2 | 分类 | 文章页 | 搜索 |
|---|---|---|---|---|---|
| MiniBlog | 2,427.7 | 2,785.7 | 2,943.3 | 3,105.4 | 3,399.4 |
| HTMLy | 3,091.0 | 3,039.9 | 2,793.8 | 2,424.3 | 741.9 |
| Bludit | 445.7 | 466.1 | 456.3 | 606.3 | 11.0 |
| Typecho | 92.8 | 94.0 | 93.7 | 389.8 | 64.1 |
| WordPress | 59.3 | 59.5 | 59.6 | 69.9 | 43.1 |
| Ghost | 21.3 | 20.5 | 39.4 | 43.1 | 68.8 |
| Hugo | 3,727.0 | 3,549.7 | 3,349.4 | 3,642.8 | 3,370.9 |
通过容器内 /proc/<pid>/io 精确计量。Docker overlay 建在内存盘上,真实块设备读写(read_bytes)恒为 0,故以 读系统调用次数(syscr) 与 读取字节数(rchar,含 page cache) 衡量“每次点击产生的文件读写量”。
| 项目 | 首页 读调用 | 首页 读字节 | 文章页 读调用 | 搜索 读调用 | 搜索 读字节 |
|---|---|---|---|---|---|
| MiniBlog | 3 | 108 | 6 | 3 | 127 |
| HTMLy | 12 | 27,423 | 12 | 21 | 237,977 |
| Bludit | 309 | 647,361 | 279 | 3,276 | 9,274,366 |
| Typecho | 5 | 282 | 5 | 5 | 336 |
| WordPress | 186 | 207,251 | 201 | 189 | 209,351 |
| Ghost | 18,388 | 75,137,556 | 9,207 | 2,369 | 9,634,174 |
| Hugo | 1 | 22,106 | 1 | 1 | 93,719 |
真实服务器“发请求→拿到文件”基线:mrga0.com 首页 TTFB 52–211ms(均值约 117ms)。 在 1G 内存 + 150ms 垃圾网络延迟下,模仿用户浏览“首页→文章页”的完整耗时 = 网络 RTT + 服务器处理(+ 慢盘读取)。
| 项目 | 首页完整耗时(ms) | 文章页完整耗时(ms) | 浏览(首页+文章) | 慢盘建模附加(ms, 按 2MB/s) |
|---|---|---|---|---|
| MiniBlog | 300 | 309 | 609 | 0.1 |
| HTMLy | 689 | 429 | 1118 | 14 |
| Bludit | 579 | 446 | 1025 | 324 |
| Typecho | 844 | 447 | 1291 | 0.1 |
| WordPress | 875 | 590 | 1465 | 104 |
| Ghost | 500 | 462 | 962 | 37569 |
| Hugo | 433 | 435 | 868 | 11 |
用正文专属词「吞吐」(仅出现在 1000 篇正文中,从不出现在标题)与标题词「缓存策略」(出现于 270 个标题)做探针,确认各系统是否检索标题 / 正文。
| 项目 | 搜索方式 | 标题检索 | 正文检索 | 搜索延迟(ms) | 搜索读调用 | 说明 |
|---|---|---|---|---|---|---|
| MiniBlog | 文件名即标题(slug) | ✓ | ✗ | 1.19 | 3 | 直接解析 md 文档,文件名即标题;源码 mb_stripos(slug) 命中标题,但无正文检索 |
| HTMLy | 文件全文(CJK 分词失效) | ✗(中文) | ✗(中文) | 4.49 | 21 | ASCII 查询正常(10 命中),中文因无词边界返回 0 |
| Bludit | 全量文件扫描 | ✗ | ✗ | 309.02 | 3276 | 每次扫描 ~9.3MB;本部署中英文/中文均 0 命中 |
| Typecho | MySQL 全文索引 | ✓ | ✓ | 49.56 | 5 | 标题+正文均可检,中文正常 |
| WordPress | MySQL 全文索引 | ✓ | ✓ | 77.85 | 189 | 标题+正文均可检,中文正常 |
| Ghost | Content API 标题过滤 | ✓ | ✗ | 14.87 | 2369 | 仅按标题过滤;无正文检索 |
| Hugo | 客户端索引(index.json) | 客户端 | 客户端 | 0.40 | 1 | 无服务端检索,浏览器加载 index.json 后本地过滤 |
mb_stripos($a['slug'], $q) 命中标题;无正文检索;HTMLy/Bludit 对中文(CJK)因无词边界分词失效;Ghost 受 Content API 限制仅按标题过滤。--cpus=4 --memory=2g;PHP 系共用同一 bench-php:8.3 镜像(PHP 8.3 + Apache + opcache + APCu + MySQL 8.0)。hugo build 产出静态站。/proc/<pid>/io 的 rchar/wchar/syscr/syscw;因 overlay 在内存盘,read_bytes 恒 0,故以 syscr/rchar 表征“每次点击的磁盘文件读写”。