update 更新变慢,where条件是主键+其他

【 TiDB 使用环境】
生产环境,v5.1.4版本

【概述】 场景 + 问题概述

  1. 业务侧双写,时间点在7月11号,客户端平均 RT 在 15ms.
  2. 7.16号晚上20:00,客户端平均 RT 开始飙升,峰值在 340ms,消费变慢并积压
  3. 客户端现象看,所有客户端都变慢,服务端 TiDB QPS 没有变化

【背景】 做过哪些操作

【现象】 业务和数据库现象

  1. 表是range分区,idauto_increament, 是非聚集索引表,使用SHARD_ROW_ID_BITSrowid进行打散,表结构如下(其他表):

      CREATE TABLE `Music_GorillaGatewayRecord` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `processType` varchar(32) NOT NULL COMMENT '',
    `appName` varchar(64) NOT NULL COMMENT '',
    `sdkVersion` varchar(32) NOT NULL COMMENT '',
    `businessType` varchar(32) NOT NULL COMMENT '',
    `ip` varchar(64) DEFAULT NULL COMMENT '',
    `status` int(4) NOT NULL COMMENT '',
    `result` text DEFAULT NULL COMMENT '',
    `callback` text DEFAULT NULL COMMENT '',
    `batch` tinyint(2) NOT NULL DEFAULT '0' COMMENT '',
    `count` int(4) NOT NULL DEFAULT '1' COMMENT '',
    `retry` int(4) NOT NULL DEFAULT '0' COMMENT '',
    `callback_Encrypt2013` longtext DEFAULT NULL COMMENT '',
    `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
    `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
    PRIMARY KEY (`id`,`createTime`) /*T![clustered_index] NONCLUSTERED */,
    KEY `idx_appName_bType_status` (`appName`,`businessType`,`status`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/*!90000 
    SHARD_ROW_ID_BITS=5 */ COMMENT=''
    PARTITION BY RANGE ( TO_DAYS(`createTime`) ) (
    PARTITION `p20220501` VALUES LESS THAN (738641),
    PARTITION `p20220601` VALUES LESS THAN (738672),
    PARTITION `p20220701` VALUES LESS THAN (738702),
    PARTITION `p20220801` VALUES LESS THAN (738733),
    PARTITION `p20220901` VALUES LESS THAN (738764),
    PARTITION `p20221001` VALUES LESS THAN (738794),
    PARTITION `p20221101` VALUES LESS THAN (738825),
    PARTITION `p20221201` VALUES LESS THAN (738855),
    PARTITION `p20230101` VALUES LESS THAN (738886));
    
  2. Dashboard中看到的及slowlog(100ms)



  3. 服务端和客户端的部分监控图:
    TiDB Server部分监控[2022-07-16 12:00:00-2022-07-17 20:00:00]:

    客户端部分监控[2022-07-16 12:00:00-2022-07-17 21:00:00]:

写在最后,请教社区大佬们有什么样的排查思路

我以前测试过tidb的一条update的时间在100ms左右,你这个按照主键的更新应该是秒出结果的。

是不是这个时间段的anlalyze对这个update造成了影响。或者当时系统的整体负担比较大,导致所有的query的RT都比较大。

集群的负载问题不大,anlalyze 的时间段和业务的访问慢的时间端也对不上。
7个TiDB + 12个TiKV,48c256g的物理机,TiKV是多实例,盘隔离的

update耗时6秒左右的那个,能否点开看一下,耗时是在哪个部分

tidb没有必要那么多,2-3个就可以了。

看起来是有backoff 可以查一下当时的监控和日志是否有锁的情况。

或者可以通过trace命令查看下,用法如下:
trace format=‘row’ select * from mysql.user;

有慢在Coprocessor,有慢在prewrite的,大部门在Coprocessor

从监控上看,TiDB 压力较大,扩容+优化了jdbc参数之后好了很多

看一下Dashboard上的热力图看有没有热点region

分区表设计上id, createTime组成的联合主键,SHARD_ROW_ID_BITS 进行打散,热力图上呈现的是prmary 是连续写入热点了?

看那个斜线应该是存在PK热点的,从图上看流量不高,可以多找几个点确认一下,如果流量不高那就有可能是QPS高了

看了几个bucket,峰值的流量在150M

热力图上斜线看了下基本都是索引热点

kv errors

可以看一下客户端RT波动和热力图流量值在时间轴上是否有相关性

参考一下吧感觉你这个就是有锁冲突导致的

应该是统计信息出错了