日志服务消费延迟问题排查

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志服务中提供了消费组能够以流的方式获取日志,使用消费组获取日志的优点在于,用户无需关心日志服务的实现细节和消费者之间的负载均衡、failover等,只需要专注于业务逻辑即可。 一个消费组由多个消费者构成,这多个消费者共同消费一个Logstore中的数据,消费者之间不会重复消费数据。

日志服务中提供了消费组能够以流的方式获取日志,使用消费组获取日志的优点在于,用户无需关心日志服务的实现细节和消费者之间的负载均衡、failover等,只需要专注于业务逻辑即可。
一个消费组由多个消费者构成,这多个消费者共同消费一个Logstore中的数据,消费者之间不会重复消费数据。因为每个Shard只会分配到一个消费者,一个消费者可以同时消费多个Shard(当消费者数量超过Shard数量时,多余消费者就会被搁置)。消费者是消费组的基本构成单元,实际承担消费任务,同一个消费组下面的消费者名称必须不同。

常见的日志消费延迟有以下三个原因:

  1. 消费速度跟不上日志写入的速度
  2. 从历史数据开始消费,短暂的消费延迟
  3. 保存 checkpoint 频率较低,在控制台查看时误认为是消费延迟

在下图所示的消费组状态中查看到某个Shard或整体消费进度与当前时间相差较多时可以根据该文档进行排查。
图中最近消费数据时间是指消费组获取到的 logGroup 中日志写入日志服务的时间,消费组也是根据日志中的时间调用 UpdateConsumerGroupCheckpoint 接口进行修改的,所以调用的频率低,也会造成消费延迟的错觉。
image.png

消费速度跟不上日志写入的速度

消费、写入速度需要开通服务日志之后查看自动生成的 logstore: internal-operation_log 
消费流量查询:

Method: pulldata | SELECT sum(NetOutFlow)/1024.0/1024.0 AS NetOutFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time ORDER BY time

写入流量查询:

Method: PostLogstoreLogs | SELECT sum(NetInflow)/1024.0/1024.0 AS NetInFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time ORDER BY time

比较上面两个SQL流量大小。
1) 首先需要排查process调用里面是否存在阻塞(比如写入到数据库的操作是否较慢等),有可能阻塞了消费进程。
检查消费流量是否达到上限:

Method: pulldata | SELECT Shard, count(1) as count, sum(NetOutFlow)/1024.0/1024.0 AS NetOutFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time, Shard ORDER BY time

2) 当消费组比较多、且数据量较大时也会出现消费速度跟不上写入速度的情况,单个Shard每秒消费流量超过或接近10兆时,需要手动分裂Shard,shard读写能力参考文档
3) 数据量过大,机器少时,处理负载过重(网络、cpu或内存上都会有瓶颈导致消费速度慢)
4) java 进程 GC 重启导致重复消费且延迟。

消费历史数据,短暂的延迟

创建消费组开始消费数据时,可以传递消费开始位置。
如果设置的beginCursor,会从最早的数据开始消费,保存的checkpoint 就是历史数据写入的时间点;这时可以参考上面SQL查询消费、写入的速度,如果消费速度远高于写入速度,之后是会追上最新数据的。

保存checkpoint的频率较低

通过下面SQL在 internal-operation_log 中查询保存消费位点的频率。

Method: ConsumerGroupUpdateCheckPoint | SELECT time_series(__time__, '1m', '%H:%i:%s', '0') as time, COUNT(*) as count, Shard GROUP BY time, Shard ORDER BY time

消费组代码中默认的保存频率是30秒一次,不过可以根据需求进行修改。保存 checkpoint 使用的时间是消费到数据FastLogGroup中的 tags 系统字段中 receive_time 字段,消费过程中可以打印该字段查看消费位置;该字段是消费到的最新位置。

消费延迟监控

首先,需要开启服务日志。消费延迟相关的信息在重要日志中,如果需要查看消费或写入速度,还需要开启详细日志。服务日志开启之后自动会创建消费组监控仪表盘,如下图: 
image.png
可以使用上面的图表设置告警,由于默认的图表中字段别名使用了中文,告警条件中不能直接使用,需要将中文字段改为英文,然后在告警条件中使用。该日志内容是两分钟更新一次的,所以查询范围、告警条件等都需要大于120秒。
image.png

image.png
取消中文别名,然后修改Y轴字段、点击预览,最后点确定就可以了。告警条件设置为 MaxBehindLatest > 1800 ,即延迟超过半小时触发告警,查询区间和间隔都设置为 1小时。
image.png

相关

最新 checkpoint 保存位置查看: 
https://sls.console.aliyun.com/lognext/project/${替换projectName}/logstore/${替换LogstoreName}/consumergroup/${替换消费组名称}/consumergroupList

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
13天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
121 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
225 3
|
3月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
131 3
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
31 0
|
1月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
197 0
|
1月前
|
存储 分布式计算 NoSQL
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
40 0
|
1月前
|
缓存 Linux 编译器
【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案
通过上述步骤,您应该能够在CentOS环境中成功安装并使用log4cplus日志组件。面对任何安装或使用过程中出现的问题,仔细检查错误信息,对照提供的解决方案进行调整,通常都能找到合适的解决之道。log4cplus的强大功能将为您的项目提供灵活、高效的日志管理方案,助力软件开发与维护。
54 0
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
2月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
150 9