暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiDB Active Session 如何监控 ?

TiDB之路 2023-07-03
787

一直以来,我没找到 TiDB 监控中如何查看当前活跃会话数的方法。有些文章认为通过查看 QPS 就能确认当前的活跃连接数,但这个方法本质上是有问题的,因为不同的 SQL 语句有不同的延迟。因此,通过活跃的 QPS 不能真正反映当前活跃会话的连接数。直到我最近翻看TiDB-Server的代码(基于6.1.5版本),我突然发现活跃连接数是有办法呈现的,只是没有对应的 grafana 图表展示出来。

conn.go
代码下,有一段获取token
的代码。

token := cc.server.getToken()

复制

这段代码调用了以下方法

func (s *Server) getToken() *Token {
 start := time.Now()
 tok := s.concurrentLimiter.Get()
 metrics.TokenGauge.Inc()
 // Note that data smaller than one microsecond is ignored, because that case can be viewed as non-block.
 metrics.GetTokenDurationHistogram.Observe(float64(time.Since(start).Nanoseconds() / 1e3))
 return tok
}

复制

可以看到当你获取到一个 token
的时候,会调用监控的方法 metrics.TokenGauge.Inc()
。而 Gauge
prometheus
中的可增可减的仪表盘。继续看这段监控的说明:

TokenGauge = prometheus.NewGauge(
  prometheus.GaugeOpts{
   Namespace: "tidb",
   Subsystem: "server",
   Name:      "tokens",
   Help:      "The number of concurrent executing session",
  },
 )

复制

这不就正是我们需要的活跃会话数吗 ?

下面我们做个简单的实验验证一下它到底行不行 ?写一个脚本,然后循环发起30个。

vi a1.sh
mysql -uroot -h127.0.0.1 -P4000 -D test --password="" -e  "select sleep(30);"

while ((i < 30)); do nohup sh a1.sh &   $((i += 1)); done

复制

然后我们在 grafana 中新建一个图表,输入tidb_server_tokens{k8s_cluster="$k8s_cluster", tidb_cluster="$tidb_cluster", instance=~"$instance"}。

可以发现和我们要的效果是一致的。

获取 token 代码中还有一个是记录 token 获取时间直方图。在 grafana 的 {cluster-name} → tidb → Server → Get Token Duration
下面。

如果我们使用 QPS 来看的话,会发现根本无法衡量活动会话数。

所以,如果要看活跃会话数,就把 tidb_server_tokens 这个指标用 grafana 图表做出来。


文章转载自TiDB之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论