diff --git a/dashboard/top-sql.md b/dashboard/top-sql.md index 50118d6cfbe2..ca9402b97d06 100644 --- a/dashboard/top-sql.md +++ b/dashboard/top-sql.md @@ -1,16 +1,21 @@ --- title: TiDB Dashboard Top SQL 页面 -summary: 使用 Top SQL 找到 CPU 开销较大的 SQL 语句 +summary: 使用 Top SQL 找到消耗 CPU、网络和逻辑 IO 资源较多的查询 --- # TiDB Dashboard Top SQL 页面 -TiDB Dashboard 的 Top SQL 功能允许你可视化地监控和探索数据库中各个 SQL 语句在执行过程中的 CPU 开销情况,从而对数据库性能问题进行优化和处理。Top SQL 持续收集各个 TiDB 及 TiKV 实例每秒的实时 CPU 负载等数据(按 SQL 类型分别统计),并存储至多 30 天。你可以通过 Top SQL 展示的图表及表格快速分析某个 TiDB 或 TiKV 实例在某段时间中高 CPU 负载是来自于哪些 SQL 语句。 +在 TiDB Dashboard 的 Top SQL 页面,你可以查看和分析指定的 TiDB 或 TiKV 实例在一段时间内最消耗资源的 SQL 查询。 + +- 开启 Top SQL 后,该功能会持续采集各个 TiDB 和 TiKV 实例的 CPU 负载数据,并保留至多 30 天。 +- 从 v8.5.6 起,你还可以在 Top SQL 设置中开启 **TiKV 网络 IO 采集(多维度)**,以进一步查看指定 TiKV 实例的 `Network Bytes`、`Logical IO Bytes` 等指标,并按 `By Query`、`By Table`、`By DB` 或 `By Region` 维度进行聚合分析。 Top SQL 具有以下功能: -* 通过图表及表格,可视化地展示 CPU 开销最多的 5 类 SQL 语句。 -* 展示每秒请求数、平均延迟、查询计划等详细执行信息。 +* 通过图表和表格展示当前时间范围内资源消耗最高的 Top `5`、`20` 或 `100` 类 SQL 查询,其余记录自动汇总为 `Others`。 +* 支持按 CPU 耗时、网络字节数排序查看资源消耗热点;选择 TiKV 实例时,还支持按逻辑 IO 字节数排序。 +* 支持按 Query 查看 SQL 及其执行计划详情;选择 TiKV 实例时,还支持按 `By Table`、`By DB` 和 `By Region` 聚合分析。 +* 支持框选图表缩放时间范围、手动刷新、自动刷新以及导出 CSV。 * 支持统计所有正在执行、尚未执行完毕的 SQL 语句。 * 支持查看集群中指定 TiDB 及 TiKV 实例的情况。 @@ -18,15 +23,15 @@ Top SQL 具有以下功能: Top SQL 适用于分析性能问题。以下列举了一些典型的 Top SQL 适用场景: -* 通过监控图发现集群中有个别 TiKV 实例的 CPU 非常高,期望了解 CPU 热点来自于哪些 SQL 语句,以便对其进行优化、更好地利用上分布式资源。 -* 集群整体 CPU 占用率非常高、数据库查询缓慢,期望快速知悉目前哪些 SQL 语句开销了最多的 CPU 资源,以便对它们进行优化。 -* 集群整体 CPU 占用率突然发生了显著变化,期望了解变化前后主要的 SQL 资源开销区别。 -* 分析集群当前最消耗资源的 SQL 语句情况,希望对它们进行优化以便降低硬件开支。 +* 通过监控发现个别 TiDB 或 TiKV 实例 CPU 负载很高,希望快速定位是哪类 SQL 正在消耗大量 CPU 资源。 +* 集群整体查询变慢,希望找出当前最消耗资源的 SQL,或者对比负载变化前后最主要的查询差异。 +* 需要从更高维度定位热点,希望按 `Table`、`DB` 或 `Region` 聚合查看 TiKV 侧的资源消耗。 +* 需要从网络流量或逻辑 IO 角度排查 TiKV 热点,而不仅仅局限于 CPU 维度。 Top SQL 不适用于分析以下问题: - 不能用于解答与性能无关的问题,例如数据正确性或异常崩溃问题。 -- 暂不支持分析并非由于 CPU 负载高导致的数据库性能问题,例如锁冲突。 +- 不适合直接分析锁冲突、事务语义错误等并非由资源消耗导致的问题。 ## 访问页面 @@ -47,10 +52,10 @@ Top SQL 不适用于分析以下问题: Top SQL 开启后会对集群性能产生轻微的影响(平均 3% 以内),因此该功能默认关闭。你可以通过以下方法启用 Top SQL: 1. 访问 [Top SQL 页面](#访问页面)。 -2. 点击**打开设置** (Open Settings)。在右侧**设置** (Settings) 页面,将**启用特性** (Enable Feature) 下方的开关打开。 +2. 点击**打开设置** (Open Settings)。在右侧**设置** (Settings) 页面,将**启用功能** (Enable Feature) 下方的开关打开。 3. 点击**保存** (Save)。 -你仅能看到开启功能之后的 CPU 负载细节情况,在开启功能之前的 CPU 负载细节无法在界面上呈现。另外,数据有至多 1 分钟左右的延迟,因此你可能需要等待片刻才能看到数据。 +启用 Top SQL 后,你只能查看开启之后新采集到的数据;开启之前的数据不会补采。数据展示通常会有约 1 分钟的延迟,因此需要等待片刻才能看到新数据。关闭 Top SQL 后,如果历史数据尚未过期,Top SQL 页面仍然会展示这些历史数据,但不会再采集和展示新的数据。 除了通过图形化界面以外,你也可以配置 TiDB 系统变量 [`tidb_enable_top_sql`](/system-variables.md#tidb_enable_top_sql-从-v540-版本开始引入) 来启用 Top SQL 功能: @@ -60,6 +65,29 @@ Top SQL 开启后会对集群性能产生轻微的影响(平均 3% 以内) SET GLOBAL tidb_enable_top_sql = 1; ``` +### 开启 TiKV 网络 IO 采集(可选)从 v8.5.6 开始引入 + +针对 TiKV 实例,如需按照 `Order By Network`、`Order By Logical IO` 查看 Top SQL,或者使用 `By Region` 聚合,请在 Top SQL 设置面板中打开 **开启 TiKV 网络 IO 采集(多维度)** (Enable TiKV Network IO collection (multi-dimensional)) 开关并保存。 + +- **Order By Network**:按照 TiKV 请求处理过程中产生的网络字节数排序。 +- **Order By Logical IO**:按照 TiKV 请求在 TiKV 存储层处理的逻辑数据字节数排序,例如读取过程中扫描或处理的数据量,以及写请求写入的数据量。 + +如下图所示,右侧**设置** (Settings) 面板中会同时显示 **启用功能** (Enable Feature) 和 **开启 TiKV 网络 IO 采集(多维度)** (Enable TiKV Network IO collection (multi-dimensional)) 两个开关。 + +![开启 TiKV 网络 IO 采集](/media/dashboard/top-sql-settings-enable-tikv-network-io.png) + +**开启 TiKV 网络 IO 采集(多维度)**会增加一定的存储和查询开销。开启后,系统会将配置下发到当前所有 TiKV 节点;数据展示可能同样存在约 1 分钟延迟。如果部分 TiKV 节点未成功开启该功能,页面会给出告警提示,此时新数据可能不完整。 + +对于后续新扩容的 TiKV 节点,这个开关不会自动生效。你需要重新在 Top SQL 设置面板中手工操作一次 **开启 TiKV 网络 IO 采集(多维度)** 开关并保存,使配置重新下发到所有 TiKV 节点。如果你希望新节点自动开启该能力,可以在 TiUP 集群拓扑的 `server_configs.tikv` 下增加以下配置,并通过 TiUP 重新下发 TiKV 配置: + +```yaml +server_configs: + tikv: + resource-metering.enable-network-io-collection: true +``` + +关于 TiUP 拓扑配置的更多信息,请参见 [TiUP 集群拓扑文件配置](/tiup/tiup-cluster-topology-reference.md)。 + ## 使用 Top SQL 以下是 Top SQL 的常用步骤: @@ -70,47 +98,71 @@ SET GLOBAL tidb_enable_top_sql = 1; ![选择实例](/media/dashboard/top-sql-usage-select-instance.png) - 如果你不知道要观察哪一个 TiDB 或 TiKV 实例,可以选择任意一个实例。在集群 CPU 开销非常不均衡的情况下,你可以首先通过 Grafana 中的 CPU 监控来确定具体期望观察的实例。 + 如果你不知道要观察哪一个实例,可以先从 Grafana 或 [TiDB Dashboard 概况页面](/dashboard/dashboard-overview.md)中定位负载异常的节点,再返回 Top SQL 页面进一步分析。 -3. 观察 Top SQL 呈现的 Top 5 图表及表格。 +3. 设置时间范围,并根据需要刷新数据。 - ![图表表格](/media/dashboard/top-sql-usage-chart.png) + 你可以在时间选择器中调整时间范围,或在图表中框选一个时间范围来缩放观察窗口。更小的时间范围能够展示更细粒度的数据,精度最高可达 1 秒。 - 柱状图中色块的大小代表了 SQL 语句在该时刻消耗的 CPU 资源的多少,不同颜色区分了不同类型的 SQL 语句。大多数情况下,你都应该关注图表中相应时间范围内 CPU 资源开销较大的 SQL 语句。 + ![修改时间范围](/media/dashboard/top-sql-usage-change-timerange.png) -4. 点击表格中的某一个 SQL 语句后,可以展开查看该语句不同执行计划的执行情况,例如 Call/sec(平均每秒请求数)、Scan Indexes/sec(平均每秒扫描索引数)等。 + 如果图表中显示的数据已过时,你可以点击**刷新** (Refresh) 按钮执行一次刷新,或在**刷新** (Refresh) 下拉列表中选择数据自动刷新的频率。 - ![详情](/media/dashboard/top-sql-details.png) + ![刷新](/media/dashboard/top-sql-usage-refresh.png) -5. 基于这些初步线索,进一步在 [SQL 语句分析](/dashboard/dashboard-statement-list.md)或[慢查询](/dashboard/dashboard-slow-query.md)界面中了解该 SQL 语句开销大量 CPU 资源、或扫大量数据的详细原因。 +4. 选择观察模式。 - 你可以在时间选择器中调整时间范围,或在图表中框选一个时间范围,来更精确、细致地观察问题。更小的时间范围将能提供细节更丰富的数据,数据最高精度可达 1 秒。 + - 通过 `Limit` 选择展示 Top `5`、`20` 或 `100` 类 SQL 查询。 + - 默认的聚合维度为 `By Query`。如果当前选择的是 TiKV 实例,还可以选择按照 `By Table`、`By DB` 或 `By Region` 维度进行聚合。 - ![修改时间范围](/media/dashboard/top-sql-usage-change-timerange.png) + ![选择聚合维度](/media/dashboard/top-sql-usage-select-agg-by.png) - 如果图表中显示的数据已过时,你可以点击**刷新** (Refresh) 按钮,或在**刷新** (Refresh) 下拉列表中选择自动刷新。 + - 默认的排序方式是 `Order By CPU`(按 CPU 耗时排序)。如果当前选择的是 TiKV 实例且已[开启 TiKV 网络 IO 采集(多维度)](#开启-tikv-网络-io-采集可选),还可以选择 `Order By Network`(按网络字节数排序) 或 `Order By Logical IO`(按逻辑 IO 字节数排序)。 - ![刷新](/media/dashboard/top-sql-usage-refresh.png) + ![选择排序方式](/media/dashboard/top-sql-usage-select-order-by.png) + + > **注意** + > + > `By Region` 以及 `Order By Network`、`Order By Logical IO` 仅在 [TiKV 网络 IO 采集(多维度)](#开启-tikv-网络-io-采集可选)开启时可选。若该功能未开启,但历史数据仍然存在,页面会继续展示历史数据,并提示新数据无法完整采集。 -6. 查看按表或者数据库维度的 CPU 资源使用情况,快速定位更高维度的资源使用情况。目前只支持查看 TiKV 实例。 +5. 观察图表和表格中的资源消耗热点记录。 - 选择一个 TiKV 实例,然后选择 **By TABLE** 或者 **By DB**: + ![图表表格](/media/dashboard/top-sql-usage-chart.png) + + 柱状图表示当前排序维度下的资源消耗,不同颜色表示不同记录。表格会按照当前排序维度展示累计值,并在最后提供 `Others` 行,用于汇总所有非 Top N 记录。 + +6. 在 `By Query` 视图中,点击表格中的某一行 SQL,即可查看该类 SQL 的执行计划详情。 + + ![详情](/media/dashboard/top-sql-details.png) - ![选择聚合维度](/media/dashboard/top-sql-usage-select-agg-by.png) + 你可以在 SQL 详情中查看对应的 SQL 模板、SQL 模板 ID、Plan 模板 ID 以及执行计划文本。SQL 详情表会根据实例类型展示不同指标: - 查看高维度的聚合结果: + - TiDB 实例通常显示 `Call/sec` 与 `Latency/call`。 + - TiKV 实例通常显示 `Call/sec`、`Scan Rows/sec` 和 `Scan Indexes/sec`。 + + > **注意** + > + > 如果当前选择的是 `By Table`、`By DB` 或 `By Region` 聚合视图,页面展示的是聚合结果,不再按 SQL 执行计划展开详情。 + + 在 `By Query` 视图中,你也可以直接点击 Top SQL 表格中的**在 SQL 语句分析中搜索** (Search in SQL Statements) 跳转到对应的 SQL 语句分析页面。若需要离线分析当前表格结果,可以点击表格上方的 `Download to CSV` 导出当前表格数据。 + +7. 在 TiKV 实例上,如果需要从更高维度定位热点,可以切换到 `By Table`、`By DB` 或 `By Region`,查看聚合后的结果。 ![按 DB 维度聚合结果页面](/media/dashboard/top-sql-usage-agg-by-db-detail.png) +8. 基于这些初步线索,进一步在 [SQL 语句分析](/dashboard/dashboard-statement-list.md)或[慢查询](/dashboard/dashboard-slow-query.md)页面中分析根因。 + ## 停用 Top SQL 你可以通过以下步骤停用该功能: 1. 访问 [Top SQL 页面](#访问页面)。 -2. 点击右上角**齿轮按钮**打开设置界面,将**启用特性** (Enable Feature) 下方的开关关闭。 +2. 点击右上角**齿轮按钮**打开设置界面,将**启用功能** (Enable Feature) 下方的开关关闭。 3. 点击**保存** (Save)。 4. 在弹出的**关闭 Top SQL 功能** (Disable Top SQL Feature) 对话框中,点击**确认** (Disable)。 +停用后将停止采集新的 Top SQL 数据,但历史数据在过期前仍可查看。 + 除了通过图形化界面以外,你也可以配置 TiDB 系统变量 [`tidb_enable_top_sql`](/system-variables.md#tidb_enable_top_sql-从-v540-版本开始引入) 来停用 Top SQL 功能: {{< copyable "sql" >}} @@ -119,6 +171,15 @@ SET GLOBAL tidb_enable_top_sql = 1; SET GLOBAL tidb_enable_top_sql = 0; ``` +### 停用 TiKV 网络 IO 采集 + +如果你只想停止采集 TiKV 的 `Network Bytes`、`Logical IO Bytes` 等多维度数据,而保留 Top SQL 的 CPU 维度分析能力,可以在 Top SQL 设置面板中关闭 **开启 TiKV 网络 IO 采集(多维度)** 开关。 + +关闭后: + +- Top SQL 页面仍可查看之前已采集到的尚未过期的历史网络 IO 和逻辑 IO 数据。 +- 新的网络 IO 和逻辑 IO 数据,以及 `By Region` 数据将不再继续采集。 + ## 常见问题 **1. 界面上提示“集群中未启动必要组件 NgMonitoring”无法启用功能** @@ -127,15 +188,15 @@ SET GLOBAL tidb_enable_top_sql = 0; **2. 该功能开启后对集群是否有性能影响?** -该功能对集群性能有轻微影响。根据我们的测算,该功能对集群的平均性能影响小于 3%。 +开启 Top SQL 对集群性能有轻微影响。根据测算,该功能对集群的平均性能影响小于 3%。如果你同时开启了 TiKV 网络 IO 采集(多维度),还会额外增加一定的存储和查询开销。 **3. 该功能目前是什么状态?** 该功能是正式特性,在生产环境中可用。 -**4. 界面中显示的其他语句(Other Statements)是什么意思?** +**4. 界面中的 `Others` 是什么意思?** -其他所有非 Top 5 语句产生的 CPU 开销或执行情况都会被统计在该项中。你可以基于这一项了解 Top 5 的 SQL 语句开销在整体所有 SQL 语句的 CPU 开销中的比例。 +`Others` 表示当前排序维度下所有非 Top N 记录的汇总结果。你可以基于这一项了解 Top N 记录在整体负载中的占比。 **5. Top SQL 展示的 CPU 开销总和与进程的实际 CPU 开销是什么关系?** @@ -143,8 +204,21 @@ SET GLOBAL tidb_enable_top_sql = 0; **6. Top SQL 图表的纵坐标是什么意思?** -代表消耗 CPU 资源的多少。消耗资源越多的 SQL 语句,该值越大。在绝大多数情况下,你都不需要关心纵坐标具体数值的含义。 +Top SQL 图表纵坐标表示当前排序维度下的资源消耗大小。 + +- 选择 `Order By CPU` 时,纵坐标表示 CPU 耗时。 +- 选择 `Order By Network` 时,纵坐标表示网络字节数。 +- 选择 `Order By Logical IO` 时,纵坐标表示逻辑 IO 字节数。 **7. 还没有执行完毕的 SQL 语句会被统计到吗?** -会。Top SQL 图表上所展示的每一时刻 CPU 开销比例即为这一时刻所有正在运行的 SQL 语句的 CPU 开销情况。 +会。TiDB Dashboard 会统计 Top SQL 开启后所有正在运行或已经执行完成的 SQL 的资源消耗,因此尚未执行完毕的 SQL 也会被统计在内。 + +**8. 为什么看不到 `Order By Network`、`Order By Logical IO` 或 `By Region` 的新数据?** + +这些视图依赖 TiKV 网络 IO 采集(多维度)。请确认以下事项: + +- 你当前选择的是 TiKV 实例。 +- Top SQL 设置面板中的**开启 TiKV 网络 IO 采集(多维度)**已经打开。 +- 集群中的相关 TiKV 节点都已成功开启该配置;如果只有部分节点开启,Top SQL 页面会提示新数据可能不完整。 +- 如果是新扩容的 TiKV 节点,需要重新在 Top SQL 设置面板中手工操作一次 **开启 TiKV 网络 IO 采集(多维度)** 开关并保存;如果希望后续扩容节点自动生效,请在 TiUP 的 TiKV 默认配置中同步开启 `resource-metering.enable-network-io-collection`。 diff --git a/media/dashboard/top-sql-access.png b/media/dashboard/top-sql-access.png index 62a14c98b07c..03d0bd067684 100644 Binary files a/media/dashboard/top-sql-access.png and b/media/dashboard/top-sql-access.png differ diff --git a/media/dashboard/top-sql-details.png b/media/dashboard/top-sql-details.png index c38be5bd5778..1238253c8e32 100644 Binary files a/media/dashboard/top-sql-details.png and b/media/dashboard/top-sql-details.png differ diff --git a/media/dashboard/top-sql-settings-enable-tikv-network-io.png b/media/dashboard/top-sql-settings-enable-tikv-network-io.png new file mode 100644 index 000000000000..a1108241d7b2 Binary files /dev/null and b/media/dashboard/top-sql-settings-enable-tikv-network-io.png differ diff --git a/media/dashboard/top-sql-usage-agg-by-db-detail.png b/media/dashboard/top-sql-usage-agg-by-db-detail.png index 116cbd055bab..94b285958ab1 100644 Binary files a/media/dashboard/top-sql-usage-agg-by-db-detail.png and b/media/dashboard/top-sql-usage-agg-by-db-detail.png differ diff --git a/media/dashboard/top-sql-usage-change-timerange.png b/media/dashboard/top-sql-usage-change-timerange.png index ee92126357a9..b1b80644d211 100644 Binary files a/media/dashboard/top-sql-usage-change-timerange.png and b/media/dashboard/top-sql-usage-change-timerange.png differ diff --git a/media/dashboard/top-sql-usage-chart.png b/media/dashboard/top-sql-usage-chart.png index 7817a7f09e46..7fce9778d1f8 100644 Binary files a/media/dashboard/top-sql-usage-chart.png and b/media/dashboard/top-sql-usage-chart.png differ diff --git a/media/dashboard/top-sql-usage-refresh.png b/media/dashboard/top-sql-usage-refresh.png index 1e365fd48092..815ebf5ddf21 100644 Binary files a/media/dashboard/top-sql-usage-refresh.png and b/media/dashboard/top-sql-usage-refresh.png differ diff --git a/media/dashboard/top-sql-usage-select-agg-by.png b/media/dashboard/top-sql-usage-select-agg-by.png index 8d88f81d757a..967de9aef27c 100644 Binary files a/media/dashboard/top-sql-usage-select-agg-by.png and b/media/dashboard/top-sql-usage-select-agg-by.png differ diff --git a/media/dashboard/top-sql-usage-select-instance.png b/media/dashboard/top-sql-usage-select-instance.png index 227679120202..3308b2724398 100644 Binary files a/media/dashboard/top-sql-usage-select-instance.png and b/media/dashboard/top-sql-usage-select-instance.png differ diff --git a/media/dashboard/top-sql-usage-select-order-by.png b/media/dashboard/top-sql-usage-select-order-by.png new file mode 100644 index 000000000000..c9c2a621d7e4 Binary files /dev/null and b/media/dashboard/top-sql-usage-select-order-by.png differ diff --git a/tikv-configuration-file.md b/tikv-configuration-file.md index 72362c885c7a..adf85071f0a2 100644 --- a/tikv-configuration-file.md +++ b/tikv-configuration-file.md @@ -2675,6 +2675,21 @@ Raft Engine 相关的配置项。 + 在默认的一个 TSO 物理时钟更新周期内 (50ms),PD 最多提供 262144 个 TSO,超过这个数量后 PD 会暂缓 TSO 请求的处理。这个配置用于避免 PD 的 TSO 消耗殆尽、影响其他业务的使用。如果增大这个参数,建议同时减小 PD 的 [`tso-update-physical-interval`](/pd-configuration-file.md#tso-update-physical-interval) 参数,以获得足够的 TSO。 + 默认值:8192 +## resource-metering + +资源计量 (Resource Metering) 相关的配置项。 + +### `enable-network-io-collection` + ++ 是否在 TopSQL 中额外采集网络流量和逻辑 I/O 信息。 ++ 开启后,TiKV 会在请求处理过程中额外记录网络入站字节数、网络出站字节数、逻辑读字节数和逻辑写字节数。 ++ 在资源消耗上报时,TiKV 会同时考虑 CPU 时间、网络流量和逻辑 I/O 来筛选 Top N 记录,并额外按 Region 维度上报这些统计结果,便于更细粒度地分析热点请求或资源消耗来源。 ++ 默认值:false + +> **注意:** +> +> 逻辑 I/O 指请求在 TiKV 存储层处理的逻辑数据量,例如读取过程中扫描或处理的数据量,以及写请求自身的逻辑写入字节数;物理 I/O 指底层存储设备实际发生的磁盘读写流量,会受到 block cache、compaction、flush 等因素影响。因此,逻辑 I/O 与实际物理 I/O 并不等价,也不能直接一一对应。 + ## resource-control 资源控制 (Resource Control) 在 TiKV 存储层相关的配置项。