Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cpu and traffic into performance overview #19676

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
124 changes: 72 additions & 52 deletions dashboard/dashboard-monitoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,99 +21,119 @@ summary: 介绍如何通过 TiDB Dashboard 监控页面查看 Performance Overvi

Performance Overview 面板按总分结构对 TiDB、TiKV 和 PD 的性能指标进行了编排组织,包含以下三部分内容:

- 总的概览:数据库时间和 SQL 执行时间概览。通过颜色优化法,你可以快速识别数据库负载特征和性能瓶颈。
- 资源负载:关键指标和资源利用率,包含数据库 QPS、应用和数据库的连接信息和请求命令类型、数据库内部 TSO 和 KV 请求 OPS、TiDB 和 TiKV 的资源使用概况。
- 自上而下的延迟分解:Query 延迟和连接空闲时间对比、Query 延迟分解、execute 阶段 TSO 请求和 KV 请求的延迟、TiKV 内部写延迟的分解等。
- **总体概览**:数据库时间和 SQL 执行时间概览。通过颜色优化法,你可以快速识别数据库负载特征和性能瓶颈。
- **资源负载**:关键指标和资源利用率,包含数据库 QPS、应用和数据库的连接信息和请求命令类型、数据库内部 TSO 和 KV 请求 OPS、TiDB 和 TiKV 的资源使用概况。
- **自上而下的延迟分解**:Query 延迟和连接空闲时间对比、Query 延迟分解、execute 阶段 TSO 请求和 KV 请求的延迟、TiKV 内部写延迟的分解等。

以下为 Performance Overview 面板监控说明:

### Database Time by SQL Type

- database time: 每秒的总数据库时间
- sql_type: 每种 SQL 语句每秒消耗的数据库时间
- `database time`:每秒的总数据库时间
- `sql_type`:每种 SQL 语句每秒消耗的数据库时间

### Database Time by SQL Phase

- database time: 每秒的总数据库时间
- get token/parse/compile/execute: 4 个 SQL 处理阶段每秒消耗的数据库时间
- `database time`:每秒的总数据库时间
- `get token/parse/compile/execute`:4 个 SQL 处理阶段每秒消耗的数据库时间

execute 执行阶段为绿色,其他三个阶段偏红色系,如果非绿色的颜色占比明显,意味着在执行阶段之外数据库消耗了过多时间,需要进一步分析根源。

### SQL Execute Time Overview

- execute time: execute 阶段每秒消耗的数据库时间
- tso_wait: execute 阶段每秒同步等待 TSO 的时间
- kv request type: execute 阶段每秒等待每种 KV 请求类型的时间,总的 KV request 等待时间可能超过 execute time,因为 KV request 是并发的
- `execute time`:execute 阶段每秒消耗的数据库时间
- `tso_wait`:execute 阶段每秒同步等待 TSO 的时间
- `kv request type`:execute 阶段每秒等待每种 KV 请求类型的时间,总的 KV 请求等待时间可能超过 execute time,因为 KV 请求是并发的

绿色系标识代表常规的写 KV 请求(例如 Prewrite 和 Commit),蓝色系标识代表常规的读 KV 请求,其他色系标识需要注意的问题。例如,悲观锁加锁请求为红色,TSO 等待为深褐色。如果非蓝色系或者非绿色系占比明显,意味着执行阶段存在异常的瓶颈。例如,当发生严重锁冲突时,红色的悲观锁时间会占比明显;当负载中 TSO 等待的消耗时间过长时,深褐色会占比明显。

### QPS

QPS:按 `SELECT`、`INSERT`、`UPDATE` 等类型统计所有 TiDB 实例上每秒执行的 SQL 语句数量
- `QPS`:按 `SELECT`、`INSERT`、`UPDATE` 等类型统计所有 TiDB 实例上每秒执行的 SQL 语句数量

### CPS By Type

CPS By Type:按照类型统计所有 TiDB 实例每秒处理的命令数(Command Per Second)
- `CPS By Type`:按照类型统计所有 TiDB 实例每秒处理的命令数(Command Per Second)

### Queries Using Plan Cache OPS

Queries Using Plan Cache OPS:所有 TiDB 实例每秒使用 Plan Cache 的查询数量
- `Queries Using Plan Cache OPS`:所有 TiDB 实例每秒使用 Plan Cache 的查询数量

### KV/TSO Request OPS

- kv request total: 所有 TiDB 实例每秒总的 KV 请求数量
- kv request by type: 按 `Get`、`Prewrite`、 `Commit` 等类型统计在所有 TiDB 实例每秒的请求数据
- tso - cmd:所有 TiDB 实例每秒发送的 gRPC 请求的数量,每个 gRPC 请求包含一批 (batch) TSO 请求
- tso - request:所有 TiDB 实例每秒的 TSO 请求数量
- `kv request total`:所有 TiDB 实例每秒总的 KV 请求数量
- `kv request by type`:按 `Get`、`Prewrite`、 `Commit` 等类型统计在所有 TiDB 实例每秒的请求数据
- `tso - cmd`:所有 TiDB 实例每秒发送的 gRPC 请求的数量,每个 gRPC 请求包含一批 (batch) TSO 请求
- `tso - request`:所有 TiDB 实例每秒的 TSO 请求数量

通常 tso - request 除以 tso - cmd 等于 TSO 请求 batch 的平均大小。

### Connection Count

- total:所有 TiDB 的连接数
- active connections:所有 TiDB 总的活跃连接数
- 各个 TiDB 的连接数
- `total`:所有 TiDB 的连接数
- `active connections`:所有 TiDB 总的活跃连接数
- 各个 TiDB 实例的连接数

### TiDB CPU
### TiDB CPU/Memory

- avg:所有 TiDB 实例平均 CPU 利用率
- delta:所有 TiDB 实例中最大 CPU 利用率减去所有 TiDB 实例中最小 CPU 利用率
- max:所有 TiDB 实例中最大 CPU 利用率
- `CPU-Avg`:所有 TiDB 实例的平均 CPU 利用率
- `CPU-Delta`:所有 TiDB 实例中最大 CPU 利用率减去所有 TiDB 实例中最小 CPU 利用率
- `CPU-Max`:所有 TiDB 实例中最大 CPU 利用率
- `CPU-Quota`:TiDB 可以使用的 CPU 核数
- `Mem-Max`:所有 TiDB 实例中最大内存利用率

### TiKV CPU/IO MBps
### TiKV CPU/Memory

- CPU-Avg:所有 TiKV 实例平均 CPU 利用率
- CPU-Delta:所有 TiKV 实例中最大 CPU 利用率减去所有 TiKV 实例中最小 CPU 利用率
- CPU-MAX:所有 TiKV 实例中最大 CPU 利用率
- IO-Avg:所有 TiKV 实例平均 MBps
- IO-Delta:所有 TiKV 实例中最大 MBps 减去所有 TiKV 实例中最小 MBps
- IO-MAX:所有 TiKV 实例中最大 MBps
- `CPU-Avg`:所有 TiKV 实例的平均 CPU 利用率
- `CPU-Delta`:所有 TiKV 实例中最大 CPU 利用率减去所有 TiKV 实例中最小 CPU 利用率
- `CPU-Max`:所有 TiKV 实例中最大 CPU 利用率
- `CPU-Quota`:TiKV 可以使用的 CPU 核数
- `Mem-Max`:所有 TiKV 实例中最大内存利用率

### PD CPU/Memory

- `CPU-Max`:所有 PD 实例中最大 CPU 利用率
- `CPU-Quota`:PD 可以使用的 CPU 核数
- `Mem-Max`:所有 PD 实例中最大内存利用率

### Read Traffic

- `TiDB -> Client`:从 TiDB 到客户端的出站流量统计
- `Rocksdb -> TiKV`:TiKV 在存储层读操作过程中从 RocksDB 读取的数据流量

### Write Traffic

- `Client -> TiDB`:从客户端到 TiDB 的入站流量统计
- `TiDB -> TiKV: general`:前台事务从 TiDB 写入到 TiKV 的速率
- `TiDB -> TiKV: internal`:后台事务从 TiDB 写入到 TiKV 的速率
- `TiKV -> Rocksdb`:从 TiKV 写入到 RocksDB 的流量
- `RocksDB Compaction`:RocksDB compaction 操作产生的总读写 I/O 流量。

### Duration

- Duration:执行时间解释
- `Duration`:执行时间解释

- 从客户端网络请求发送到 TiDB,到 TiDB 执行结束后返回给客户端的时间。一般情况下,客户端请求都是以 SQL 语句的形式发送,但也可以包含 `COM_PING`、`COM_SLEEP`、`COM_STMT_FETCH`、`COM_SEND_LONG_DATA` 之类的命令执行时间。
- 由于 TiDB 支持 Multi-Query,因此,客户端可以一次性发送多条 SQL 语句,如 `select 1; select 1; select 1;`。此时的执行时间是所有 SQL 语句执行完成的总时间。

- avg:所有请求命令的平均执行时间
- 99: 所有请求命令的 P99 执行时间
- avg by type:按 `SELECT`、`INSERT`、`UPDATE` 类型统计所有 TiDB 实例上所有请求命令的平均执行时间
- `avg`:所有请求命令的平均执行时间
- `99`:所有请求命令的 P99 执行时间
- `avg by type`:按 `SELECT`、`INSERT`、`UPDATE` 类型统计所有 TiDB 实例上所有请求命令的平均执行时间

### Connection Idle Duration

Connection Idle Duration 指空闲连接的持续时间。

- avg-in-txn:处于事务中,空闲连接的平均持续时间
- avg-not-in-txn:没有处于事务中,空闲连接的平均持续时间
- 99-in-txn:处于事务中,空闲连接的 P99 持续时间
- 99-not-in-txn:没有处于事务中,空闲连接的 P99 持续时间
- `avg-in-txn`:处于事务中,空闲连接的平均持续时间
- `avg-not-in-txn`:没有处于事务中,空闲连接的平均持续时间
- `99-in-txn`:处于事务中,空闲连接的 P99 持续时间
- `99-not-in-txn`:没有处于事务中,空闲连接的 P99 持续时间

### Parse Duration、Compile Duration 和 Execute Duration

- Parse Duration:SQL 语句解析耗时统计
- Compile Duration:将解析后的 SQL AST 编译成执行计划的耗时
- Execution Duration:执行 SQL 语句执行计划耗时
- `Parse Duration`:SQL 语句解析耗时统计
- `Compile Duration`:将解析后的 SQL AST 编译成执行计划的耗时
- `Execution Duration`:执行 SQL 语句执行计划耗时

这三个时间指标均包含均所有 TiDB 实例的平均值和 P99 值。

Expand All @@ -127,25 +147,25 @@ Connection Idle Duration 指空闲连接的持续时间。

### PD TSO Wait/RPC Duration

- wait - avg:所有 TiDB 实例等待从 PD 返回 TSO 的平均时间
- rpc - avg:所有 TiDB 实例从向 PD 发送获取 TSO 的请求到接收到 TSO 的平均耗时
- wait - 99:所有 TiDB 实例等待从 PD 返回 TSO 的 P99 时间
- rpc - 99:所有 TiDB 实例从向 PD 发送获取 TSO 的请求到接收到 TSO 的 P99 耗时
- `wait - avg`:所有 TiDB 实例等待从 PD 返回 TSO 的平均时间
- `rpc - avg`:所有 TiDB 实例从向 PD 发送获取 TSO 的请求到接收到 TSO 的平均耗时
- `wait - 99`:所有 TiDB 实例等待从 PD 返回 TSO 的 P99 时间
- `rpc - 99`:所有 TiDB 实例从向 PD 发送获取 TSO 的请求到接收到 TSO 的 P99 耗时

### Storage Async Write Duration、Store Duration 和 Apply Duration

- Storage Async Write Duration:异步写所花费的时间
- Store Duration:异步写 Store 步骤所花费的时间
- Apply Duration:异步写 Apply 步骤所花费的时间
- `Storage Async Write Duration`:异步写所花费的时间
- `Store Duration`:异步写入过程中,在存储循环 (store loop) 中所花费的时间
- `Apply Duration`:异步写入过程中,在应用循环 (apply loop) 中所花费的时间

这三个时间指标都包含所有 TiKV 实例的平均值和 P99 值

平均 Storage async write duration = 平均 Store Duration + 平均 Apply Duration

### Append Log Duration、Commit Log Duration 和 Apply Log Duration

- Append Log Duration:Raft append 日志所花费的时间
- Commit Log Duration:Raft commit 日志所花费的时间
- Apply Log Duration:Raft apply 日志所花费的时间
- `Append Log Duration`:Raft append 日志所花费的时间
- `Commit Log Duration`:Raft commit 日志所花费的时间
- `Apply Log Duration`:Raft apply 日志所花费的时间

这三个时间指标均包含所有 TiKV 实例的平均值和 P99 值。
Binary file added media/performance/titan_disable.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/performance/titan_enable.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/performance/tpcc_cpu_memory.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/performance/tpcc_read_write_traffic.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
88 changes: 72 additions & 16 deletions performance-tuning-methods.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,34 +209,90 @@ StmtPrepare 每秒执行次数远大于 StmtClose,说明应用程序存在 pre
- 每秒总的 KV 请求数据是 35.5,Cop 请求次数是每秒 9.3。
- KV 处理时间主要来源为 `Cop-internal_stats`,说明 Cop 请求来源于内部的 analyze 操作。

#### TiDB CPU,以及 TiKV CPU 和 IO 使用情况
#### CPU 和内存使用情况

在 TiDB CPU 和 TiKV CPU/IO MBps 这两个面板中,你可以观察到 TiDB 和 TiKV 的逻辑 CPU 使用率和 IO 吞吐,包含平均、最大和 delta(最大 CPU 使用率减去最小 CPU 使用率),从而用来判定 TiDB 和 TiKV 总体的 CPU 使用率
在 TiDB、TiKV 和 PD 的 CPU/Memory 面板中,你可以监控它们各自的逻辑 CPU 使用率和内存消耗情况,例如平均 CPU 利用率、最大 CPU 利用率、CPU 利用率差值(最大 CPU 使用率减去最小 CPU 使用率)、CPU Quota(可以使用的 CPU 核数)以及最大内存使用率。基于这些指标,你可以确定 TiDB、TiKVPD 的整体资源使用情况

- 通过 `delta` 值,你可以判断 TiDB 是否存在 CPU 使用负载不均衡(通常伴随着应用连接不均衡),TiKV 是否存在热点
- 通过 TiDB 和 TiKV 的资源使用概览,你可以快速判断集群是否存在资源瓶颈,最需要扩容的组件是 TiDB 还是 TiKV
- 根据 `delta` 值,你可以判断 TiDB 或 TiKV 的 CPU 使用是否存在不均衡的情况。对于 TiDB,较高的 `delta` 值通常意味着应用程序的连接在 TiDB 实例之间分布不均衡;对于 TiKV,较高的 `delta` 值通常意味着集群中存在读写热点
- 通过 TiDB、TiKVPD 的资源使用概览,你可以快速判断集群是否存在资源瓶颈,以及是否需要对 TiKV、TiDB 或 PD 进行扩容或者硬件配置升级

**示例 1:TiDB 资源使用率高**
**示例 1:TiKV 资源使用率高**

下图负载中,每个 TiDB 和 TiKV 配置 8 CPU。
在以下 TPC-C 负载中,每个 TiDB 和 TiKV 配置了 16 核 CPU,PD 配置了 4 核 CPU。

![TPC-C](/media/performance/tidb_high_cpu.png)
![TPC-C](/media/performance/tpcc_cpu_memory.png)

- TiDB 平均 CPU 为 575%。最大 CPU 为 643%,delta CPU 为 136%。
- TiKV 平均 CPU 为 146%,最大 CPU 215%。delta CPU 为 118%。TiKV 的平均 IO 吞吐为 9.06 MB/s,最大 IO 吞吐为 19.7 MB/s,delta IO 吞吐为 17.1 MB/s。
- TiDB 的平均、最大和 delta CPU 使用率分别为 761%、934% 和 322%。最大内存使用率为 6.86 GiB。
- TiKV 的平均、最大和 delta CPU 使用率分别为 1343%、1505% 和 283%。最大内存使用率为 27.1 GiB。
- PD 的最大 CPU 使用率为 59.1%。最大内存使用率为 221 MiB。

由此可以判断,TiDB 的 CPU 消耗明显更高,并接近于 8 CPU 的瓶颈,可以考虑扩容 TiDB
显然,TiKV 消耗了更多的 CPU,在 TPC-C 这样的写密集场景中,这是符合预期的。建议通过扩容 TiKV 来提升性能

**示例 2:TiKV 资源使用率高**
#### 数据流量

下图 TPC-C 负载中,每个 TiDB 和 TiKV 配置 16 CPU
Read traffic 和 Write traffic 面板可以帮助你深入分析 TiDB 集群内部的流量模式,全面监控从客户端到数据库以及内部组件之间的数据流情况

![TPC-C](/media/performance/tpcc_cpu_io.png)
- Read traffic (读流量)
- `TiDB -> Client`:从 TiDB 到客户端的出站流量统计
- `Rocksdb -> TiKV`:TiKV 在存储层读操作期间从 RocksDB 读取的数据流量

- TiDB 平均 CPU 为 883%。最大 CPU 为 962%,delta CPU 为 153%。
- TiKV 平均 CPU 为 1288%,最大 CPU 1360%。delta CPU 为 126%。TiKV 的平均 IO 吞吐为 130 MB/s,最大 IO 吞吐为 153 MB/s,delta IO 吞吐为 53.7 MB/s。
- Write traffic (写流量)
- `Client -> TiDB`:从客户端到 TiDB 的入站流量统计
- `TiDB -> TiKV: general`:前台事务从 TiDB 写入到 TiKV 的速率
- `TiDB -> TiKV: internal`:内部事务从 TiDB 写入到 TiKV 的速率
- `TiKV -> Rocksdb`:从 TiKV 到 RocksDB 的写操作流量
- `RocksDB Compaction`:RocksDB compaction 操作产生的总读写 I/O 流量。如果 `RocksDB Compaction` 明显高于 `TiKV -> Rocksdb`,且你的平均行大小高于 512 字节,则可以进行以下配置以减少 compaction I/O 流量:启用 Titan,将 `min-blob-size` 设置为 `"512B"` 或 `"1KB"`,将 `blob-file-compression` 设置为 `"zstd"`。

由此可以判断,TiKV 的 CPU 消耗更高,因为 TPC-C 是一个写密集场景,这是正常现象,可以考虑扩容 TiKV 节点提升性能。
```toml
[rocksdb.titan]
enabled = true
[rocksdb.defaultcf.titan]
min-blob-size = "1KB"
blob-file-compression = "zstd"
```

**示例 1:TPC-C 负载中的读写流量**

以下是 TPC-C 负载中读写流量的示例。

![TPC-C](/media/performance/tpcc_read_write_traffic.png)

- 读流量
- `TiDB -> Client`:14.2 MB/s
- `Rocksdb -> TiKV`:469 MB/s。注意,在提交事务之前,读操作(`SELECT` 语句)和写操作(`INSERT`、`UPDATE` 和 `DELETE` 语句)都需要从 RocksDB 读取数据到 TiKV。

- 写流量
- `Client -> TiDB`:5.05 MB/s
- `TiDB -> TiKV: general`:13.1 MB/s
- `TiDB -> TiKV: internal`:5.07 KB/s
- `TiKV -> Rocksdb`:109 MB/s
- `RocksDB Compaction`:567 MB/s

![TPC-C](/media/performance/tpcc_read_write_traffic.png)

**示例 2:启用 Titan 前后的写流量**

以下示例展示了启用 Titan 前后的性能变化。对于 6 KiB 数据量的插入负载,Titan 显著降低了写流量和 compaction I/O,提高了 TiKV 的整体性能和资源利用率。

- 启用 Titan 前的写流量

- `Client -> TiDB`:510 MB/s
- `TiDB -> TiKV: general`:187 MB/s
- `TiDB -> TiKV: internal`:3.2 KB/s
- `TiKV -> Rocksdb`:753 MB/s
- `RocksDB Compaction`:10.6 GB/s

![Titan 禁用](/media/performance/titan_disable.png)

- 启用 Titan 后的写流量

- `Client -> TiDB`:586 MB/s
- `TiDB -> TiKV: general`:295 MB/s
- `TiDB -> TiKV: internal`:3.66 KB/s
- `TiKV -> Rocksdb`:1.21 GB/s
- `RocksDB Compaction`:4.68 MB/s

![Titan 启用](/media/performance/titan_enable.png)

### Query 延迟分解和关键的延迟指标

Expand Down
Loading