# [Known Issues] Region 数量过多导致 TiKV 读写延迟

## Key Words

region 数量过多，长尾延迟，hibernate regions

## Description

集群在业务高峰时段有大量慢 SQL，包括 insert 和 select 语句长尾延迟超过 300ms。

## Root Cause

总体来说，由于单个 TiKV 实例 region peer 数量较多（超过30k），Raftstore 处理心跳消息占用大量时间，导致 Raft 队列排队时间较长，影响其他消息的处理。

1. insert 写入延迟：storage async write 长尾延迟在 200ms 左右，具体 Raft append log 长尾延迟在 32ms ～ 64ms，propose wait 长尾延迟在 64ms ～ 128ms。

2. select 查询延迟：async snapshot 长尾延迟在 128ms ～ 256ms，由于读写请求共用 Raft 队列，处理耗时高也会影响读请求。

## Diagnostic Steps

1. 单个 TiKV region 数量较多（超过 20k），Raft messages - Messages 面板可以看到大量 heartbeat/heartbeat_resp 消息。

2. Raft Propose - Propose wait duration 有明显的长尾延迟，且延迟占比高于 append log/apply log/commit log 等落盘延迟。

## Resolution

升级到 v5.0.x 及以上版本并开启[静默 region](https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file##hibernate-regions)。

## Workaround

1. 调大 store 线程数 store-pool-size，减少单个线程处理心跳过多导致的排队。

2. 调大 store batch 大小 [store-max-batch-size](https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file)，减少 flush messages 频次也可以改善排队时间。

备注：v4.0.9 版本开始 store-max-batch-size 默认值从 256 调大到 1024。v5.0.2 默认开启静默 region 后，store-max-batch-size 默认值为 256；如果关闭 hibernate-regions，默认值为 1024。

## Affected Versions

<v5.0，静默 region 还未 GA
