8.2 性能基准与 db_bench 实测


8.2 性能基准与 db_bench 实测:让数字说话的规矩

本节摘要:基准测试最大的敌人不是工具,是自欺:没到稳态就采样、改了参数没冻结变量、只看均值不看分位。本节以引擎自带的基准工具为标尺,讲清五个负载模式各考什么科目、一次可信的实测怎么跑、指标输出怎么读,最后把「改前改后各测一遍」落成一套可复用的实验流程。本节配有完整命令行示例,可直接照抄改造。

没到稳态的数字都是噪声

先立一条铁律:引擎是多时间尺度的活物。内存表插入在微秒尺度,刷盘在秒尺度,压缩在十秒到分钟尺度,大归并可以拖上小时。刚灌完数据的库和跑了三小时的库,同样的负载能测出完全不同的成绩——前者是压缩积压正在消化,后者才是稳态。没到稳态的基准是噪声,拿噪声做决策不如不测。

稳态怎么判定?两个信号缺一不可:其一,吞吐曲线进入窄幅波动,抖动幅度收窄到几个百分点以内;其二,后台积压指标归零并稳定——待压缩字节清空、零层文件数回到阈值以下。两个信号都出现,再等几分钟,才开始正式采样。急躁是基准测试的第一宗罪。

五个考试科目

引擎自带的基准工具不是测速器,是一套标准化考卷,每个模式对应一类真实负载的科目。

写入灌库(fillrandom 或 fillseq)考写路径的极限:内存表切换、日志同步、刷盘吞吐都在这一科见真章,批量导入前先跑它摸底。随机点查(readrandom)考读路径与折扣券:缓存命中率、过滤器有效性、多层查找的成本全在里面,是点查型业务的主科目。读写混合(readwhilewriting)考两面作战:前台写入与后台压缩抢资源时的互相拖累,这最接近生产真相,也最能暴露停顿问题。范围扫描(seekrandom)考索引与迭代器:导航图的效率、预取的收益都在这一科。随机更新(updaterandom)考覆盖写场景:多版本堆积、墓碑清理、写放大的实际水平都由它暴露。

五个科目对应五类业务形态。给自己的负载选主科目,其余做副科目——全跑当然好,但决策权重应该压在你业务的真实形态上。

一次可信的实测怎么跑

把流程落成命令。第一步,灌库到目标规模,规模要贴近生产数据量——百万键和亿级键的读成绩没有可比性,层级深度都不一样:

# 灌一亿个键,值 1KB,16 线程 —— 规模必须贴近生产 db_bench --benchmarks=fillrandom --num=100000000 \ --value_size=1024 --threads=16 # 灌完不急着测:等待后台压缩清空积压,进入稳态 # 判定信号:待压缩字节归零 · 零层文件数回落 · 吞吐抖动收窄

第二步,正式采样,开启统计与直方图,分位数据是主角:

# 随机点查主科目 · 开统计开直方图 · 限时五分钟 db_bench --benchmarks=readrandom --num=100000000 \ --threads=16 --duration=300 --histogram --statistics

第三步,读输出。末尾的性能摘要给出吞吐与延迟分布,重点看三个数:吞吐值(ops per second)、中位延迟(median)、分位延迟(percentile 一栏)。均值与中位差距大说明分布歪,分位之间的落差说明有长尾——长尾才是调优的主战场。统计输出里另有几百个计数器,最值得盯的是缓存命中/未命中、过滤器有效否决次数、压缩与刷盘的字节量,它们分别对应第 6 章与第 5 章的账本。

第四步,交叉验证:换一个副科目再跑一遍。参数调整常有「按下葫芦浮起瓢」的效应——写路径调顺了,读路径跌了——只测单科就下结论,是第二宗罪。

实验纪律:变量冻结与前后对照

一次可信的调优实验, checklist 只有五条。变量冻结:除被调参数外,机器、数据规模、负载模式、线程数、运行时长全部不变——换了台更闲的机器测出的「提升」是环境的功劳。前后对照:调之前跑一遍、调之后跑一遍,两次都要过稳态——「改前」的数字没有留存的,等于白改。一次一族:第 8.1 节的纪律在这里再次生效,多参数同时改无法归因。重复三次:单次结果有偶然性,关键结论至少三次采样取中位。留档:命令行、配置快照、两次的输出全文归档——下一个人接手时,这是唯一的现场。

把这套纪律沉淀成团队的变更模板,长这个样子:

变更编号:OPT-2041 动机:写入 P99 傍晚时段从 3ms 恶化至 9ms(详见监控链接,纯内部系统) 假设:写缓冲 64MB 过小,傍晚写入速率下刷盘过于频繁 变更:write_buffer_size 64MB → 128MB,其余参数冻结 基准:fillrandom + readwhilewriting,改前/改后各三次,取中位 结果:写 P99 中位 8.7ms → 4.2ms;点查吞吐变化在噪声范围内;内存总预算翻倍已确认可承受 归档:命令行与完整输出见内部基准库对应编号

一次对照实验的完整记录

把实验纪律落成一份可直接抄改的记录模板,比讲十遍纪律都管用。以下是一次真实参数对照实验的归档摘要。

动机:傍晚写入分位延迟恶化,假设写缓冲六十四兆过小、刷盘过频。变量:写缓冲六十四兆改一百二十八兆,其余全部冻结。科目:灌库与读写混合,改前改后各三轮。环境:同机型同数据集,均在稳态后采样。

结果读法示范——改前灌库吞吐每秒二十一万笔、混合科目写分位八点七毫秒;改后灌库二十二万、混合写分位四点二毫秒,点查科目变化在噪声带内。结论写法也值得照抄:写分位改善约一半,来源判断为刷盘频率减半;读科目无回退;内存总预算增加一档已确认可承受;建议保留该变更并纳入季度复核。

这份记录里最容易被省略、又最不能省的是「改前」两轮——没有它,四点二毫秒这个数字没有意义。另一条经验藏在环境行里:两次实验恰逢业务流量形态不同(改后那周有促销预热),第二轮补跑了一次等流量的对照才定稿——环境漂移是实验结论最常见的污染源,留档的命令行与时间戳就是为复核这一条准备的。

本节要点

  • 引擎是多时间尺度的活物,稳态判定两信号:吞吐收窄、后台积压归零,没稳态的数字是噪声;
  • 五个科目对五类负载:灌库考写、点查考读、混合考争抢、扫描考索引、更新考放大;
  • 实测四步:贴近生产的规模灌库、稳态后开直方图采样、读分位不读均值、换副科目交叉验证;
  • 实验纪律五条:冻结变量、前后对照、一次一族、重复三次、全程留档;
  • 调优的证据等级:社区文章给方向、源码注释给机制、自己的基准给结论,生产只认第三种。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U