TiDB高TPS表统计信息失效

背景

本周有两天23号,25号凌晨开始生产某个日志业务应用连接池打满,新的读写请求失败,程序出现大量报错。该业务应用读写都在TiDB里,涉及TiDB版本5.1.4

分析

  • 从grafana性能监控中发现,00开始P999延迟时间飙升到2m左右,tikv节点cpu利用率接近饱和,业务应用方最近没有新上线过(该业务应用上线几个月一直稳定运行)

  • 从tidb dashboard热力图中发现23号00点开始xxx_23 xxx_25表读取量飙升,其它时间点没有异常现象

  • 慢查询里对xxx_25表的update延迟在7~8分钟(正常时延迟几十ms内),执行计划显示该update是全表扫描(xxx_id和xxx2_id有联合索引),全表有百万级别数据量,多个没走索引的update对全表加锁 产生锁等待,延迟时间进一步加大
UPDATE
  xxxx_25
SET
  execute_status = 2,
  msg = ''
WHERE
  xxx_id = 6342
  AND xxx2_id = 'xxxx';

  • 自动收集表统计信息时间配置为01~08点
mysql> show global variables like '%tidb_auto_analyze%';
+------------------------------+-------------+
| Variable_name                | Value       |
+------------------------------+-------------+
| tidb_auto_analyze_end_time   | 08:00 +0800 |
| tidb_auto_analyze_ratio      | 0.5         |
| tidb_auto_analyze_start_time | 01:00 +0800 |
+------------------------------+-------------+
  • 该业务应用是按天分表场景xxx_01~xxx_31,update,insert量大,自增id为auto_increment顺序生成;TiDB自动收集统计行为version为1

mysql> show global variables like '%tidb_analyze_%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| tidb_analyze_version | 1     |
+----------------------+-------+

处理

  • 手动收集统计表统计信息后,该表读写量、延迟恢复正常,后面增加定时任务单独收集高TPS表统计信息
ANALYZE TABLE xxxx_25;

  • 疑问是高TPS表除了单独收集表统计信息,有其它什么方式让它能自动正确收集统计信息?

自动任务没有收集成功,只能手动去执行了。要不就自己写脚本,定时查看执行结果。

自己写脚本收集吧,我之前遇到过默认收集的几个小时完成不了,失败了,手动收集几分钟。

你的 tidb_auto_analyze_ratio 设置太高了,这个比例有可能自动很难触发的。

写日志挂定时

  • 自动收集表统计信息时间配置为01~08点 感觉这个收集统计信息的时间范围有点小啊,

生产环境白天流量高比较耗tidb节点内存+白天自动收集统计信息可能导致tidb节点OOM,之前生产出现过

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。