1. 先聊聊我为什么盯上了存储配置这件事
早些年调时序数据库,大家的习惯是"先装上、跑起来再说",存储这块基本靠默认值打天下。等到数据量真涨上去了,写入开始变慢,查询变卡,才回头翻配置文件,结果发现瓶颈根本不在数据库本身,而是磁盘I/O被默认参数活活拖死了。TDengine作为一款专为时序场景设计的数据库,单机写入吞吐本来很能打,但如果你用的是普通机械盘、默认WAL策略、文件块大小也没调过,那高并发写入时八成会看到磁盘使用率直接飙到100%,而CPU还在那儿闲着。
这篇文章不聊怎么装TDengine,也不讲SQL怎么写,只聚焦一件事:存储配置。具体来说,是高吞吐写入场景下,怎么通过合理设置WAL(预写日志)、缓存、文件块、磁盘选型这些底层参数,把磁盘I/O这个瓶颈给打通。适合正在做IoT数据采集、工业实时监控、或者任何“每秒要灌进去几万条甚至几十万条时间序列数据”的团队参考。
先说一个反直觉的结论:很多人以为写入慢是数据库不行,其实在TDengine的场景里,80%以上的写入性能问题都出在存储层配置和磁盘选型上。你把配置调对了,同样的机器,吞吐翻倍是常有的事。
2. 理解TDengine的写入链路,才能看懂瓶颈在哪
2.1 一条数据从进入到落盘的完整路径
要调存储配置,首先得知道数据是怎么写进去的。这里我不堆架构图,就用大白话拆一下TDengine的写入链路:
- 客户端通过REST API、JDBC或者taosc(TDengine客户端驱动)把数据发到taosd(服务端进程)。
- taosd收到数据后,先做解析、表名校验、schema匹配,然后写入内存中的Hash表结构,同时按表组织数据。
- 关键一步:数据在写入内存的同时,会先追加到WAL(Write-Ahead Log,预写日志)文件里。这个WAL存在的意义是防止进程崩溃时丢数据——内存里的数据还没刷盘,但WAL已经把操作记录下来了。
- 内存缓冲攒到一定量,或者到一定时间,触发落盘操作,把数据合并写入数据文件。
- 数据文件按时间分片(vnode),内部又按时间顺序排列,配合元数据索引,查询时才能快速定位。
看到没有,写入路径上真正和磁盘I/O发生关系的有两处:WAL写入和数据文件落盘。这两处的配置直接决定了你的写入吞吐极限。
2.2 为什么WAL会成为第一个瓶颈
WAL的设计逻辑是:每次写入请求都要“顺序写”一次日志文件,用来保证数据不丢。顺序写在机械盘上其实不算慢,但问题在于——默认配置下,TDengine的WAL刷盘策略可能是每次写入都强制fsync。
fsync意味着操作系统把数据真正写到磁盘物理介质上才返回,而不仅是写到页缓存里。一次fsync在普通SATA SSD上大约0.1~1ms不等,在机械盘上可能2~10ms。如果每条请求都触发一次fsync,换算下来单线程每秒最多写几百条记录,这基本上就把吞吐锁死了。
提示:这里说的“刷盘策略”对应TDengine配置项里的
walLevel和fsyncInterval,后面会具体讲怎么调。
2.3 数据文件落盘:顺序写和合并的博弈
数据从内存缓冲刷到数据文件时,正常情况下是顺序写的,顺序写在磁盘上效率很高。但如果你的表非常多,每个表的数据量又不大,vnode内部的文件碎片化就会加剧,导致写入从“顺序追加”退化成“随机写”。随机写在机械盘上的性能是灾难性的,在SSD上也会明显影响寿命和吞吐。
所以存储配置里有个核心思路:尽量减少数据文件的碎片化,尽量让写入变成大块顺序追加,而不是零散小写。
3. 高吞吐写入下最关键的三个存储配置项
3.1 WAL策略:walLevel、fsyncInterval与walBufferSize的取舍
TDengine的WAL相关配置是老生常谈,但很多人要么不敢动,要么一刀切全关掉。我的建议是:关闭WAL保性能,那是走极端;完全不调,那是浪费硬件。合理的配置取决于你对数据丢失的容忍度。
配置项有三个关键参数:
| 配置项 | 默认值 | 作用 | 高吞吐建议 |
|---|---|---|---|
walLevel | 1 | WAL级别:0=关闭WAL,1=写WAL但不强制fsync,2=写WAL且强制fsync | 可容忍少量数据丢失时设1,不能容忍设2 |
fsyncInterval | 3000(毫秒) | 周期性fsync的时间间隔 | 3000~10000,越大写入性能越好,但崩溃恢复时丢的数据越多 |
walBufferSize | 512(MB) | WAL缓冲区大小 | 建议根据单条记录大小和并发线程数适当调大 |
这里要解释清楚walLevel=1和walLevel=2的区别:
walLevel=2:每条写入都调用fsync,数据安全性最好,但写入吞吐直接打骨折。如果你用机械盘,这个模式基本告别高并发写入。walLevel=1:写入只到操作系统页缓存,靠fsyncInterval周期性的把脏页刷到磁盘。这个模式下,操作系统帮你把多次零散写入合并成一次大块刷盘,吞吐能提升一个数量级。
实测过一个案例:同样一台8核16G的服务器,配SATA SSD,walLevel=2的时候单节点写入大概2万条/秒,改成walLevel=1、fsyncInterval=5000之后,直接跑到15万条/秒。代价是如果机器突然断电,可能丢失最近几秒的写入数据。
3.2 内存缓冲:buffer、cache与pagesize的联动关系
TDengine的内存缓冲分几层:buffer(每个vnode的内存缓冲大小)、cache(结果缓存,主要影响查询)、pagesize(内存页大小,影响刷盘粒度)。
先说buffer。这个参数直接决定了数据在内存里能攒多大才落盘。默认值可能很小,如果你写入压力大,buffer太小会导致频繁落盘,每次落盘都触发磁盘I/O,写得细碎,效率低。建议先把buffer调大到能容纳至少10秒的写入数据量。
算一下:假设你每秒钟写入10万条记录,每条记录平均100字节,那10秒就是100MB。这种情况下buffer至少要设到128MB以上,最好256MB。但这个值不是越大越好——buffer太大意味着崩溃时内存中的数据全部丢失,恢复时间也长。
pagesize是数据页的大小,默认4KB还是8KB取决于版本。对于时序数据,每条记录通常很小(几十到几百字节),page太小会导致每页存不了多少条数据,索引和元数据膨胀;page太大会导致读取时加载无用数据。我的经验是:如果你的记录以几十字节的小记录为主,pagesize选4KB;如果记录里有较多字符串或长字段,选8KB或16KB会更合适。
3.3 文件块和vnode规划:别让一个vnode扛下所有
TDengine把数据按vnode(虚拟节点)切分,每个vnode是一个独立的数据管理单元。vnode数量、每个vnode的数据文件块大小,都会影响写入的并发粒度。
vnodeGroups这个参数控制每个dnode上的vnode组数量。高并发写入时,多个vnode可以并行落盘,所以vnode太少会形成写入瓶颈。但vnode也不是越多越好——每个vnode都有自己的元数据和内存结构,vnode数量太多会导致内存碎片化和管理开销增大。
具体规划建议:
- 单节点场景,建议
vnodeGroups设为CPU核心数的1~2倍。 - 每个vnode的
days参数(数据文件按多少天切分一次)不要设太大,默认10天左右可以,数据量特别大的场景建议缩小到3~7天,防止单个数据文件过大影响落盘和查询效率。 minRows和maxRows(每个数据文件块的最小/最大记录数)要保持默认值,不要随便调——这个参数和压缩率、索引效率都有关系,新手容易改崩。
4. 磁盘选型:HDD、SATA SSD还是NVMe SSD,预算怎么花
4.1 不同盘在高吞吐写入场景下的表现差异
很多人觉得“时序数据库嘛,写得多读得少,机械盘便宜容量大就够了”。这个想法在数据量很小的时候没错,但高吞吐写入场景下,机械盘和固态盘的差距不是用“快一点”能形容的。
我用同一套TDengine配置,分别在三种盘上做了写入压测,结果大致如下:
| 磁盘类型 | 顺序写带宽 | 随机写4K IOPS | TDengine单节点实测写入(walLevel=1) |
|---|---|---|---|
| 7200转HDD | 约180MB/s | 约80~120 | 3~5万条/秒 |
| SATA SSD | 约500MB/s | 约8000~15000 | 10~15万条/秒 |
| NVMe SSD | 约3500MB/s | 约50000以上 | 25万条/秒以上 |
注意,上面是单盘的数据。生产环境如果做了RAID或者多盘数据目录,数字还会变。
4.2 数据目录拆分的两种实践方案
磁盘选型之外,更便宜的优化手段是把不同的I/O路径拆到不同的物理盘上。具体来说:
- 方案A:WAL目录放一块小容量但高性能的盘(比如128G NVMe),数据文件目录放一块大容量普通盘(比如4T SATA SSD或者HDD)。WAL是高频顺序写,需要低延迟;数据文件是批量落盘,顺序写为主,对延迟不敏感。
- 方案B:多块数据盘做数据目录配置,让TDengine把不同的vnode数据自动分布到不同盘上,提升并行落盘能力。
方案A是我个人最推荐的组合。WAL体积不大,但每次写入都碰它,给它一块NVMe盘能立竿见影;数据文件是大头,用大容量盘把成本压下来。
4.3 文件系统选型与挂载参数
这一块容易被忽略,但影响很大。TDengine官方支持ext4和XFS,实测在XFS上的大文件顺序写性能略优于ext4,而且XFS对并发写入的锁竞争处理更好,建议新环境直接用XFS。
挂载参数上有几个建议:
- 使用
noatime挂载选项,减少文件访问时间更新带来的额外I/O。 - 如果用的是SSD,确保开启了TRIM,防止长期写入后性能衰减。
- 不要用LVM的默认配置做条带化,它的条带宽度对数据库文件写入不友好;如果一定要用LVM,务必把条带大小调大(比如1MB以上)。
5. 从默认配置到高吞吐配置:一套可以直接抄的调整清单
5.1 基于常见硬件的推荐配置模板
下面这套配置是基本盘,适配大多数单节点或两节点起步的场景。硬件参考:8核16G、1块NVMe 512G做系统盘和WAL、1块SATA SSD 2T做数据盘。
# TAOS.CFG 关键配置 # 内存总量的一半给buffer,这里是8G buffer 4096 # WAL级别:生产环境可容忍少量丢失时用1 walLevel 1 # fsync间隔:5000ms fsyncInterval 5000 # WAL缓冲区大小:256MB walBufferSize 256 # 缓存大小:给查询留点余量 cache 1024 # 每dnode的vnode组数:CPU核心数的1.5倍左右 vnodeGroups 12 # 数据按7天一个文件分片 days 7 # 文件块最小/最大行数维持默认 minRows 100 maxRows 4096注意几个细节:
buffer的单位是MB,不是字节。上面写4096表示4GB。walBufferSize在部分版本的单位是MB,老版本可能是KB,升级迁移时留意单位变化。- 如果你的内存只有16G,
buffer给4G已经比较大,查询缓存别给太多,否则内存会被吃紧。
5.2 参数调整后的验证方法
改配置不能凭感觉,必须用数据说话。验证分三步:
第一步,看写入吞吐。用taosBenchmark压测工具跑一个高并发写入场景,对比调整前后的吞吐和延迟百分位(P99尤其重要)。
第二步,看磁盘I/O。压测的同时用iostat -x 1观察磁盘的%util和await,如果%util长期在90%以上,说明磁盘还是瓶颈;如果%util只有60%而吞吐上不去了,说明瓶颈转移到了CPU或网络。
第三步,看落盘频率。日志里或者通过监控看flush操作的频率,理想情况下是“攒一批、刷一次”,刷得越少效率越高。
5.3 调整过程中最容易踩的坑
配置调优这件事,最怕的不是调错参数,而是只调一个参数然后觉得万事大吉。我列几个亲历过的坑:
- 只关WAL不调buffer:有人为了性能直接把
walLevel设成0,写入确实快,但一旦进程崩溃,最近内存里的数据全部丢失。对于IoT数据采集场景,这种丢法有时候比数据库不可用还严重。 - buffer给太大导致OOM:
buffer参数并不是越大越好,它要和你的写入速度、落盘频率匹配。给太大,内存被占用过多,其他进程或者查询进程就容易OOM。 - vnodeGroups和实际写入表数量不匹配:表特别多但vnode太少,每个vnode要管理的表数量过大,内部索引变大,写入时要更新多个表,CPU消耗反而上去了。
- SSD不开启TRIM:长期高负载写入后,SSD的垃圾回收机制如果没有TRIM辅助,写入放大越来越严重,吞吐逐步下降,看起来像是数据库变慢了,实际上是SSD没做保养。
6. 时序数据特征对存储配置的反作用力
6.1 不同写入模型下的配置差异
并非所有“高吞吐写入”场景长得都一样。我总结四种常见的写入模型,它们的存储配置侧重完全不同:
| 写入模型 | 数据特征 | 主要瓶颈 | 存储配置重点 |
|---|---|---|---|
| 高频小记录 | 每秒百万级、每条<50字节 | WAL写入频率 | 加大WAL缓冲区,walLevel设1 |
| 大批量攒批 | 每分钟一次、每次百万条 | 数据文件落盘带宽 | 提高buffer,降低落盘频率 |
| 多表稀疏写入 | 几十万个设备、每台每秒一条 | 表数量与vnode管理 | 增加vnodeGroups,调整表结构 |
| 乱序补采数据 | 时间戳回退、延迟上报 | 数据文件合并 | 开启乱序数据支持,留意落盘策略 |
如果你拿同样的配置去套两种完全不同的写入模型,大概率有一方会吃亏。比如高频小记录场景下,WAL是命门;而大批量攒批场景下,WAL反而没压力,瓶颈在大文件刷盘带宽。
6.2 数据保留策略与磁盘空间的联动
时序数据库一般需要设置数据过期时间(keep),用来控制磁盘占用。这里有个容易忽略的联动关系——过期数据的清理动作本身也会占用I/O资源。
如果你的keep设得特别短(比如7天),那么每天都要清理大量数据文件,清理时会产生额外的磁盘I/O。在高吞吐写入的同时做数据清理,盘要是性能不够,写入就会被拉下来。
我建议:
keep不要设成“刚刚好”,留出20%~30%的余量。- 数据清理时段尽量和写入高峰错开,可以通过调度控制vnode的合并节奏。
- 如果数据量确实大,优先考虑分层存储,把热数据放SSD、冷数据放HDD或者对象存储,而不是让一套盘同时扛热写和冷清理。
6.3 压缩策略和I/O的隐藏关系
TDengine对时序数据有压缩能力,压缩比通常在3~10倍之间。压缩的好处不仅是省空间,更重要的是——数据文件变小了,落盘和读取的I/O量也变小了。
但压缩不是免费的,它消耗CPU。这里就存在一个“CPU换I/O”的权衡:
- CPU相对宽裕(比如8核以上但磁盘一般):保持默认压缩,用压缩率换I/O带宽。
- CPU紧张(比如2核小机器配NVMe):可以适当降低压缩级别,用I/O换CPU时间。
TDengine的压缩配置在服务端是自动的,但你可以通过调整compress参数控制压缩行为。注意,这个参数针对的是数据块级压缩,不是传输压缩(传输压缩另有参数)。
7. 从单节点到集群:存储配置要考虑的新维度
7.1 多节点写入的存储分布逻辑
单机调好之后,很多人天真地以为集群就是“多复制几份配置”,其实不然。TDengine的集群模式下,数据按vnode分布到不同dnode上,每个dnode的存储配置可以不同,但必须统一规划,否则会出现某个节点成为写入热点,拖累整体写入吞吐。
在多节点部署时,你需要额外关注:
- 各节点的vnode数量要均衡,避免某个节点vnode过多,导致数据倾斜。
- 副本数(replica)影响写入放大:副本数为3时,每条写入要在三个节点上落盘,总I/O量变成3倍。如果磁盘性能不足,写入性能会明显下降。
- 跨节点数据同步也走网络I/O,网络带宽和延迟同样会影响写入链路。
7.2 热点节点的存储配置微调
集群中偶尔会有某个节点的数据比其他节点多得多(比如某些设备上报频率特别高)。这种场景下,别指望“所有节点一致”的配置能自愈。
我的做法是:
- 监控各节点写入量,通过
taosMonitor或者接入Prometheus+Grafana的监控体系,找出热点节点。 - 如果热点节点长期存在,把热点表迁移到单独的vnode组,或者提高热点节点的
vnodeGroups数量,让热点有更多并行落盘通道。 - 如果热点集中在某几张超级表,考虑表结构设计层面做分片,比如按设备ID范围划分多个子表。
7.3 扩容和缩容时的存储参数重估
集群扩容不只是“加机器”这么简单。新增节点后,旧节点的vnode要重新分配一部分出去,这个迁移过程会带来额外的磁盘和网络I/O。迁移期间写入压力大,容易出现性能抖动。
实操建议:
- 扩容前先调低
fsyncInterval,降低WAL的压力(比如从5000降到2000),给迁移留出I/O余量。 - 迁移完成后,把参数调回高性能档位。
- 数据均衡期间,暂时关闭数据清理任务,避免清理I/O和迁移I/O叠加。
8. 实测记录:一次I/O瓶颈的完整排查与解决过程
8.1 现象描述:写入延迟陡增,磁盘利用率100%
去年我接手过一套TDengine集群,接入的设备大约12万台,每台每5秒上报一条数据,算下来峰值写入约2.4万条/秒。业务方反馈“最近一周每天下午写入延迟明显变大,偶尔还报写入超时”。
第一反应是看监控,结果发现三个节点中,有一个节点的磁盘%util长期在100%,其他两个节点磁盘利用率只有40%。典型的热点节点I/O瓶颈。
8.2 逐步排查:从应用层到存储层
排查思路分了四步:
第一步,排除应用层。检查客户端写入是否均匀分布到三个节点——结果发现连接配置里写死了某个节点的地址,所以这个节点接收的写入量天然比另外两个多。
第二步,查数据分布。用SQL查各vnode的数据量,发现热点节点上的vnode数量比另外两个多了一倍,原因是建库时指定了vnode数量和策略,但没有考虑后续扩容。
第三步,查配置差异。热点节点用的还是默认WAL配置,walLevel=2,而另外两个节点早就调成了walLevel=1。也就是说,热点节点不仅要承受更多的数据量,还用了最耗I/O的WAL策略。
第四步,查磁盘老化情况。这块SSD已经用了两年多,固件较老,没有开启TRIM,有效写入吞吐比新盘低了差不多30%。
8.3 解决动作与效果对比
调整动作:
- 更新客户端连接配置,让写入均匀负载到三个节点。
- 热点节点的
walLevel改成1,fsyncInterval设5000。 - 单独给热点节点的WAL目录挂了一块NVMe盘。
- 对SSD做了一次安全擦除后重新挂载并开启TRIM(这一步操作风险较高,务必有备份)。
调整前后对比:
| 指标 | 调整前 | 调整后 |
|---|---|---|
| 热点节点磁盘%util | 100% | 62% |
| P99写入延迟 | 850ms | 120ms |
| 整体写入吞吐 | 2.4万条/秒(已到顶) | 4.6万条/秒(还有余量) |
这个案例说明,I/O瓶颈往往不是单个原因造成的,而是应用层、配置层、硬件层三个层面的问题叠加。逐一排查,比拍脑袋调一个参数靠谱得多。
9. 监控I/O的日常工具和指标,别等问题爆发才想起来
9.1 必须盯住的几个I/O指标
高吞吐写入环境里,日常巡检I/O指标比出了问题再救火重要得多。我建议至少盯住这几项:
| 指标 | 含义 | 警戒线 |
|---|---|---|
%util | 磁盘繁忙程度 | 长期>80%需要关注 |
await | I/O请求平均等待时间 | SSD>10ms、HDD>50ms要查 |
iowait | CPU等待I/O时间占比 | 持续>20%说明I/O压力大 |
svctm | I/O服务时间 | 和await差距大说明队列拥堵 |
| 写入吞吐 | 每秒写入的记录数 | 下降趋势可能说明磁盘老化 |
9.2 用iostat和taosMonitor组合排查
排查I/O问题,我的标配命令是:
iostat -x 1重点关注w_await(写等待时间)和w_util(写利用率)。如果w_util在写高峰期冲到90%以上,基本可以确定磁盘是瓶颈。
同时用taosMonitor看数据库内部的写入延迟和落盘频率。两者对照,能快速判断瓶颈是“数据库在等磁盘”还是“数据库自身处理不过来”。
9.3 磁盘寿命和写入放大的监控
SSD的写入放大问题是隐藏杀手。正常的SSD写入放大比(WAF)在1~3之间,如果超过5,说明SSD的垃圾回收压力很大,寿命在加速消耗。
查看SSD的WAF需要借助smartctl:
smartctl -x /dev/nvme0n1注意看nvm日志中的写入量(total bytes written)和主机写入量的比值。如果WAF异常高,优先检查是否频繁小写落盘——这正是数据库配置不合理导致的(比如buffer太小、落盘太频繁)。
10. 基于当前版本和生态的一些补充实践
10.1 免费版和商业版的存储特性差异
TDengine的免费版已经提供了相当完整的能力,存储配置相关的核心参数没有做阉割,这一点对大多数中小团队来说足够用。商业版在存储层增加的主要是更细粒度的多级存储策略和更完善的企业级监控告警。
如果团队预算有限,先用免费版把WAL、buffer、vnode这些基础配置调明白,大概率能满足业务需求;等数据量真正大到需要分层存储、冷热分离这一层时,再考虑商业版的能力也不迟。
10.2 使用TDengine Explorer做存储状态的日常观察
新版本里TDengine Explorer提供了可视化的集群监控面板,存储相关能看到每个dnode的数据量、vnode分布、磁盘使用率等。虽然不是性能调优的万能工具,但它能让“数据分布是否均衡”“哪些vnode增长特别快”这类问题一目了然。
建议运维团队的日常巡检流程里加一步:每周看一次Explorer里的存储分布视图,趁数据倾斜还没扩大之前处理掉。
10.3 社区里关于存储配置的一些值得尝试的做法
TDengine的社区讨论里,关于存储配置有几种值得参考的思路:
- 有人把WAL文件放到tmpfs(内存文件系统)上,写入完全不碰磁盘,性能直接拉满。这招适合数据丢失容忍度极高的场景,但机器重启等于丢WAL,内存里的数据也会受影响,风险很大,不建议生产使用。
- 有人建议对数据文件做周期性整理(defrag),降低碎片化。TDengine本身的merge机制能处理一部分,但如果你的数据有大量乱序写入,碎片化会更严重,定期整理确实有效。
- 还有人尝试用多块NVMe盘做vnode手动分片,实现写入通道的硬隔离。这个方案配合vnodeGroups规划,效果很好,但对运维要求较高。
我个人比较认可的做法是:优先把WAL从数据盘上拆出去,再考虑其他花活。这一步带来的收益最大,操作风险也最低。
11. 几个值得反复验证的细节:单位、版本与参数作用域
11.1 配置项单位在不同版本中的差异
TDengine不同版本的配置单位并不完全一致,这是踩坑高发区。比如buffer在2.x版本里单位是MB,但早期1.x版本是KB;walBufferSize在不同小版本里也可能不同。
建议每次升级后做一次全量配置备份,并对照官方文档核对单位变化。另外,配置项如果写错单位,启动时不一定会报错,但实际内存占用和预期相差很大,这种问题最难排查。
11.2 参数作用域:全局参数与库级参数
TDengine中部分存储参数是全局的,比如walLevel、walBufferSize;但也有库级别(database)可以覆盖的参数,比如创建数据库时可以指定BUFFER、PAGES、DAYS等。
实际项目中要做到全局和库级两层规划:
- 全局配置定基准,保证所有库能跑。
- 重要的业务库单独设置,针对它的写入模型做精细化调整。
比如同一实例下,一个库是高频小记录采集(需要大buffer、walLevel=1),另一个库是低频大包写入(不需要那么大buffer),就应该在两个库级别分别设置,而不是全局一刀切。
11.3 配置热更新与需要重启的参数
TDengine部分参数支持在线修改,但存储相关的参数大部分需要重启taosd才能生效。生产环境改配置前,务必:
- 先备份原配置文件。
- 在测试环境验证参数合法性和预期效果。
- 安排维护窗口低峰期重启。
- 重启后立刻检查日志和写入指标,确认没有引入新问题。
我见过不止一次“改一个参数不重启,以为生效了,结果性能没变”的情况。配置改完要确认日志里是否加载了新值,别凭感觉判断。
12. 关于这套实践,我最后想说的
存储配置调优这件事,没有什么银弹。每个团队的数据量、写入模型、硬件条件都不一样,直接抄别人的配置能跑,但往往不是最优解。我这套实践的核心逻辑就三句话:
第一,理解写入链路,知道数据在哪个环节会和磁盘发生关系,才知道要调什么。 第二,WAL是写入性能的第一道关卡,把它单独放高性能盘上,收益最大。 第三,任何配置调整都要用监控数据做验证,不要凭感觉。
如果你刚开始调TDengine存储配置,可以从最简单的实验做起:把walLevel从2改成1,观察写入吞吐的变化。这个实验能让你直观地理解WAL对性能的钳制作用,也是后续所有调优的基础。
最后分享一个习惯:每次调整完存储配置,我都会在配置文档里记录“改了什么、为什么改、压测数据是多少、半个月后运行表现如何”。时间长了,这份文档就是团队排查性能问题最宝贵的参考。调优不是一次性工作,是随着数据量增长、硬件变化不断迭代的过程。