Comment

面向静态博客的自托管评论系统:Go 单二进制 + SQLite 单文件数据库 + 零依赖原生前端,没有 Node 常驻、没有 Redis、没有 MySQL——一台 1 核 512MB 的小机器就能跑。

它天生为「极致自定义」而设计:代码简单直白,你可以自由修改功能与外观,甚至把需求直接丢给 AI(如 ChatGPT / Claude),让它帮你定制出独一无二的评论系统。

开源地址:github.com/FXnadu/dwxcmt

以下用真实数据说话——2026-08-13 完整可复现压测(hey / pprof / 逐秒采样),图表均由原始数据渲染,非估算。

SUMMARY

核心数据一览

指标数值说明
读路径吞吐 ≈ 44,481 req/s 5 实例合计、限流放宽后的真实容量(见 §01 口径说明)
读路径延迟 p50 0.4 / p99 2.2 ms 独立逐请求采样 n=605,354;单实例平均 2.2~2.3 ms
压测峰值内存 29.2 MB 单实例 WorkingSet 峰值(pprof 实测),HeapInuse 峰值 7.7 MB
压测质量 0 读路径 0 错误 / 写路径 0 业务异常、0 HTTP 错误 / 0 协程泄漏
01

本地压测结果(2026-08-13 实测)

口径说明 读接口同样受全局限流约束,被限流的请求仍返回 HTTP 200;早期报告按 HTTP 状态码统计,把限流响应计入了 QPS,故有「7.9 万」。本次使用限流放宽配置(100 万/秒,等效不限流)测量真实容量,即下表数据。

读压测:评论列表查询(5 实例 × 20 并发 × 30s,空库,20 个页面)

实例QPS平均延迟p99响应数状态码
worker18,8492.3 ms11.5 ms265,527全部 200
worker28,9502.2 ms11.4 ms268,550全部 200
worker38,7592.3 ms11.7 ms262,815全部 200
worker48,7232.3 ms11.8 ms261,760全部 200
worker59,1992.2 ms11.4 ms275,992全部 200
合计≈ 44,4812.2~2.3 ms≤ 11.8 ms1,334,6440 错误
读路径真实容量 · 各压测实例 QPS(5 实例 × 20 并发 × 30s,累计 1,334,644 次响应,0 错误)
各实例读路径 QPS 条形图
5 个实例 QPS 稳定在 8.7k~9.2k 窄带内,无调度偏斜;合计 ≈ 44,481 req/s,p99 ≤ 11.8ms(< 14ms)。
读路径延迟 CDF(hey -o csv 逐请求采样,n=605,354,p99 = 2.2ms / p99.9 = 8.2ms / max = 79.1ms,非 200 = 0)
读路径延迟累计分布曲线
平均 0.49ms,p50 0.4ms / p90 0.8ms / p95 1.1ms / p99 2.2ms;绝大多数请求在 3ms 内完成。

写压测:提交评论(单 IP 最坏场景,32 并发 × 25s,攻击速率 ≈ 800 req/s)

业务码数值说明
成功入库(code=0)1,000 条精确触顶每日上限 1000 条
每秒限流(code=2001)18,19750 req/s 精确生效,HTTP 仍为 200
每日配额(code=2002)250通过每秒限流但超出日配额
重复拦截(code=2003)0
业务错误(code=1xxx)/ HTTP 错误0 / 0全程无异常,服务端日志 0 字节
单 IP 最坏场景 · 每秒接受/拒绝分布(上限 50 req/s、1000 条/日,限流精确生效)
单 IP 写压测逐秒分布折线图
前 20 秒每秒成功 50 条(code=0),第 20 秒每日上限触顶后转为每秒 50 次日配额拒绝(2002);每秒限流拒绝(2001)全程 ≈ 720/s 恒定;HTTP 错误逐秒为 0。
单 IP 最坏场景 · 响应业务码分布(HTTP 全部 200,限流拦截属设计内行为)
写压测业务码分布柱状图
业务错误 = 0,HTTP 错误 = 0;理论校验:50/s × 25s = 1,250 个放行 = 1,000 成功 + 250 日配额拒绝,与逐秒数据完全吻合。

写路径真实吞吐(限流放宽,32 并发 × 10s,不限速)

写路径真实吞吐 · 每秒成功写入(10s 合计 10,144 条 ≈ 1,008 条/s,首秒峰值 1,433,0 错误)
写吞吐逐秒柱状图
早期报告「158 条/s」是 curl 逐进程客户端瓶颈;改用持久连接压测客户端后实测真实写吞吐约 1,000 条/s(平均延迟 31.6ms,业务/HTTP 错误均 0)。

内存与 goroutine(pprof heap?gc=0 每 ~0.9s 采样)

采样对象WorkingSet 峰值HeapInuse 峰值goroutine 峰值
严格实例(Phase A 写压测)26.4 MB4.6 MB43
bench 实例(Phase B/C/D 全程)29.2 MB7.7 MB147(读压测期)
压测全程内存 · WorkingSet 与 HeapInuse 时间序列
压测全程内存时间序列图
读压测期间 goroutine 在 112~147 间波动(连接池/处理器并发),压测结束后回落至 31,无协程泄漏;单实例整机 WorkingSet ≤ 29.2MB。

防失真措施

这些数字会不会是"蒙的、抄的、老师放水的"? 不会。压测全程由一键脚本 scripts/bench-all.ps1 自动采集,原始 CSV 全部留档、任何人可复现;用业界标准 hey + Go pprof 记录,大样本取数并剔除异常值,修复压测工具自身干扰,服务端日志全程落底,并主动注明空库、本机、放宽口径等前提。
02

线上部署实测

可达性与延迟

健康检查 HTTP 200,版本 0.1.0;TTFB 稳定后中位数 ≈ 58ms(范围 50~73ms),网络 RTT 约 22ms,服务端处理毫秒级,TTFB 主要由网络链路决定。

功能与安全验证

评论列表返回真实 roots + children 树结构(含站长回复 isAdmin=1);CORS 白名单精确生效,预检 OPTIONS 204;12 连发同 IP → 6 成功 + 6 被限流,5 req/s 精确生效;外部伪造 X-Forwarded-For 无效(从右向左取首个非可信 IP)。

检查项结果
TLS 证书通过 ssl_verify_result=0
静态资源缓存Cache-Control: max-age=604800, public, immutable + ETag(7 天强缓存)
线上小并发hey 40 请求 / 并发 5:平均 14.3ms,HTTP 全部 200,无 5xx
限流行为被限流请求以业务码 2001 返回(HTTP 200),毫秒级响应,不拖垮服务
03

资源占用对比

组件预估占用实测表现
Go 后端(单实例)25~45MB压测峰值 WorkingSet 29.2MB、HeapInuse 7.7MB(pprof 实测)
SQLite(WAL + 内存映射)5~10MB压测库 bench.db 含 WAL 合计 ≈ 23MB(磁盘,非驻留内存)
goroutine峰值 147,压测后回落 31,无泄漏
整机合计≤ 100MB单实例实测 ≤ 29.2MB,1 核 512MB 达标(占用约 5%)
04

结论(基于实测数据)

结论依据
性能达标读路径真实容量 ≈ 44,481 req/s(5 实例并行,限流放宽口径),单实例 8.7k~9.2k req/s、平均 2.2~2.3ms、p99 ≤ 11.8ms,1,334,644 次响应 0 错误;写路径单 IP 最坏场景限流与每日上限精确生效,0 业务异常、0 HTTP 错误。
内存稳定单实例 WorkingSet 峰值 29.2MB、HeapInuse 7.7MB,goroutine 无泄漏,1 核 512MB 机器实测达标。
线上运行健康TTFB ~58ms(以网络 RTT 为主),限流、CORS、TLS、静态缓存、IP 伪造防护全部按设计生效,业务数据读写正常。
数据严谨全部图表由原始压测数据渲染(scripts/bench-all.ps1 + gen-perf-charts.py),原始 CSV/JSON 归档于产物目录,可复现;读路径真实容量为 44,481 req/s(约 4.45 万)。