从一到无穷大 #24 LogReducer:讨论日志中热点的影响,识别及在线解决方法

在这里插入图片描述本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。

文章目录

  • 引言
  • LogReducer
    • 系统性分析日志影响,原因
    • 在线日志缩减框架
  • 反省
  • 总结

引言

排查问题单效率依赖于可观测性三件套 Logging,Metrics 和 Tracing。Metrics(时序数据库,ES)和Tracing(OpenTelemetry,ES)依赖于外部系统,不是今天讨论的重点。

Logging保存在本地存储介质,一般来讲本地存储介质的系统盘因为成本效益配置不会很高,其次全量记录日志成本又过高,此时利用有限的空间存储最长时间详细的离散事件对于排查问题就显得尤为重要,从而使得事后可以通过这些记录来完整分析程序的异常行为。

在最近的运营过程中,线上排查问题的效率成了一个瓶颈,主要原因在于Logging刷的太快,很多有用的信息容易被刷新。

LogReducer这篇文章阐述了微信的工程师如何通过在线和离线的方式减少日志对于程序的影响,我认为这篇文章的主要贡献分为以下两个方面:

  1. 对真实世界系统中的日志热点进行了系统研究,以揭示日志热点的影响、日志热点出现的原因以及如何解决这些问题
  2. 提出了一种基于eBPF的非侵入式、不依赖语言且高效的日志缩减框架,可自动识别日志热点并即时缩减日志,将日志热点的修复时间从平均 9 天缩短到测试中的 10 分钟

事实上这篇文章的思路相对容易理解;

离线的方法就是静态分析,得到出现频率最高的日志,让开发人员去修改代码,灰度发布,但是这个方法的关键在于即时性差,但是也很好理解,因为日志不是关键路径,开发人员修改代码的意愿没有那么大,这更是SRE该关心的事情(目前这方面事情在我们这边其实是开发在管23333)。

在线的方法是基于用户态分析日志热点,基于eBPF Map[3]将热点信息从用户态传递到内核态,然后对write系统调用挂kprobe的勾子,在检测到写入目标日志文件的内容匹配到热点时写入失败,以此做到非侵入且不依赖于语言。

我简单看了下LogReducer 的代码[4],只看到了在线分析的代码,没看到离线分析的代码,但是好在并不难,花了点时间撸了两个脚本,分别可以求出一个namespace内所有机器上日志的热点和单独一个pod内部某种日志的热点,在我们的线上系统执行了下,立马发现了几个日志总量占用率高达30%以上的日志热点,甚至极端pod存在占用率90%以上的日志热点。

在这里插入图片描述

kubectl --kubeconfig=cls-abs7dhqw-config get pod -o wide -n ctsdbi-5p0zhq7y | grep -E ‘gateway’ | awk ‘{print $1}’ | while read pod; do
echo $pod
kubectl --kubeconfig=cls-abs7dhqw-config exec $pod -n ctsdbi-5p0zhq7y – /bin/bash -c “cd /xstor/data/log; cat gateway.debug..log | awk -F’,’ '{ key=$5; sub(/[,],[,]*,[,],[,]*,[,],/, “”); value=$0; count[key]++; size[key]+=length(value); total+=length(value) } END { for (key in count) print count[key], size[key], key }'”
done | awk ‘{ count[$3]+=$1; size[$3]+=$2; total+=$2 } END { for (key in count) print count[key], size[key], size[key]*100/total “%”, key }’ | sort -k2nr | head -n 50

cat gateway.debug..log | awk -F’,’ '{ key=$5; sub(/[,],[,]*,[,],[,]*,[,],/, “”); value=$0; count[key]++; size[key]+=length(value); total+=length(value) } END { for (key in count) print count[key], size[key], size[key]*100/total “%”, key }’ | sort -k2nr | head -n 50

LogReducer

系统性分析日志影响,原因

日志本身并不是零成本的记录,其生命周期包含:

  1. Write log: 每当执行流达到日志语句时,服务都会将日志持续写入日志文件,包含字符串构造,拷贝等;
  2. Scrape log: log agent 会持续从日志文件中获取文件
  3. Send log: log agent 将日志通过网络发送到外部系统
  4. Store log: 部分系统为了安全,会全量存储日志,这里存在存储开销

从生命周期中,我们可以得出结论,日志不仅会影响存储成本,还会在写日志时消耗资源(如 CPU),在发送日志时消耗网络带宽。

文章在对微信2w个以上的微服务进行分析,发现其中20个微服务占用了52.8%以上的存储空间,文章前半部分主要基于这五个问题进行分析:

  • RQ1: How do log hotspots impact storage?
  • RQ2: How do log hotspots impact runtime?
  • RQ3: What are the root causes of log hotspots?
  • RQ4: What are the fixing solutions of log hotspots?
  • RQ5: How long do developers take to fix log hotspots?

答案如下:

  1. storage impact
    Finding:日志热点普遍存在于不同的服务中。少数日志热点平均占用了相应存储空间的 57.86%。
    Implication:减少日志热点对降低存储开销具有成本效益。
  2. runtime impact
    Finding:日志热点会导致无法控制的资源消耗(如 CPU、内存、IO 和网络 带宽)和性能下降
    Implication:减少日志热点不仅能优化应用程序的资源消耗,还能提高其性能。
  3. root causes
    Finding:在所有根本原因中,最常见的两个根本原因是日志级别不正确和忘记测试日志,共占 63.15%。这里具体事项可以看原文。
    Implication:不同服务的根本原因有共同点,了解这些根本原因有助于减少日志热点的发生。
  4. fixing solutions
    Finding:在解决方案中,最常见的两种修复解决方案是更正日志级别和删除日志语句,共占 61.69%。
    Implication:开发人员可以从历史解决方案中获益,这些解决方案不仅能加快修复速度,还能在开发阶段防止出现日志热点。
  5. fix log hotspots spending time
    Finding: 对于 97% 的日志热点,开发人员至少需要 3 天,平均需要 9 天来修复。修复历史热点后,19 项服务中有 18 项会遇到新的日志热点。
    Implication: 自动填补生产环境中日志热点检测和修复之间的空白时间是非常重要和必要的,这其实映射出需要在线修复,但是以目前我们的运营来看问题不大,因为这是一个已知事件,而且我们的日志没有全量存储到外部系统,所以ROI不是很高

在线日志缩减框架

文章提到这里的设计有如下四个难点:

  1. 海量日志。微信每天产生约 75-100 万亿行日志。这种方法必须足够快,才能在不影响应用程序性能的情况下处理如此大量的日志。
  2. 无需开发人员费力。日志减少方法对开发人员应该是透明的,不应给开发人员带来额外负担。
  3. 多种程序语言。微信包含由不同团队使用不同编程语言开发的 20,000 多种服务。日志缩减方法应兼容多种语言。
  4. 在线生产环境。微信在生产环境中为数十亿用户提供服务。为避免影响服务质量,应即时启用日志缩减方法,而不是重启服务。

请添加图片描述
最终的框架看起来像是这样子,原理如下:

  1. Log Parser:定期从日志数据库中查询服务日志,并将原始日志解析为日志模板;
  2. Hotspot Classifier:根据日志模板的存储信息判断服务是否包含日志热点;
  3. 如果存在日志热点,Hotspot Classifier:会触发离线和在线流程的日志缩减过程。在离线过程中,LogReducer 会通知服务的开发人员,以修复热点的根本原因
  4. 在在线流程中,Python Log Filter 会将 eBPF 代码和日志模板信息加载到内核空间,这里的流程就是获取此进程所有打开的fd,分别获取其日志文件名称,如果写入的fd和这些fd相同,则进入过滤逻辑,执行模版过滤,这里我觉得都没有模版的必要,直接日志文件+行数完事;
  5. 当服务实例试图将日志写入文件时,eBPF Log Filter 会拦截 write() 系统调用,如果截获的日志内容与日志热点的日志模板相匹配,LogReducer 就会将其丢弃。

这里到这里大家都会有一个疑问,为什么过滤不放在用户态?当然这样需要每个语言都适配,但是这样就节省了一次系统调用。文中给出的测试结果是内核态比用户态更高效,结论是:

This is because when filtering hotspots in user space, all raw logs must be copied from kernel space to user space, which is extremely taxing on the time and CPU.

请添加图片描述
我不能理解这个结论,因为原则上这个过滤的过程完全可以放在用户态日志框架中,存在数量级的性能差异一定是实现有问题。

但是问题也不大,因为这个东西工程上的解决方案一定是靠改代码和灰度,在线修改hook wirte,风险过高,其次收益较小,而且要求系统适配eBPF,基本不太可能大范围推广,但是申请个专利,发个论文还是没问题的。

反省

这篇文章思路并不难,但是仍然发表在软件工程顶会上,这个问题于我个人而言无法被解决吗?从编码难度上讲我毕设的eBPF程序比这个难的多。从问题的角度讲,日志热点的问题在我们的日常运营中非常常见,无论是之前的KV还是现在的时序,但是没有人想到要去把这件事情真正的当作项目去做。

一方面可以认为这是工程和学术的区别,工程师在业务增长阶段更愿意投身ROI较高的产品和模块,通常忽略这些对性能没有直接较大影响的模块。另一方面可以认为是缺乏提出问题的能力,从目前计算机业务所涉及的知识来看,能提出问题多半是可以解决问题的。

在去年的时候因为降本增效,对象存储曾做过日志成本缩减,我当时还在负责对象存储索引层,所以可以说我既有解决这个问题的能力,也有遇到问题的场景,缺的就是体系化的看待每一件事情,这是一个需要长期自我鞭策改变的事情。

总结

这篇文章是二月十八号凌晨四点半我在机场等飞机前一小时加上飞机上一小时快速通读完成,逞着还有余力,遂迅速在下午把文章中的思路应用到我们的系统,立马发现了很多日志热点,这个优化也将成为下一个版本的一个重点。

提到这篇文章,LogReducer事实上是我在看谭神的年终总结是偶然发现的,事实上我和谭神的职业起点职责,方向,时间点都相似,希望能紧跟着谭神的脚步,至少三年后回看这几年不至于被落的太远。

参考:

  1. LogReducer: Identify and Reduce Log Hotspots in Kernel on the Fly ICSE 2023
  2. 2023 年终总结:从清华 Apache IoTDB 组到创业公司天谋科技
  3. eBPF: 深入探究 Map 类型
  4. https://github.com/IntelligentDDS/LogReducer
  5. 在bpfTrace中使用USDT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升起重机效率与降低维修成本:PreMaint预测性维护系统的应用

随着科技的不断发展,人工智能技术在各行各业都展现出了强大的应用潜力。在港口起重机设备的维护管理中,预测性维护系统是一项革命性的技术,为提升设备效率、降低维修成本提供了全新的解决方案。本文将深入探讨起重机预测性维护系统的原理、应…

nvm的相关属性以及用法

一、安装nvm的原因 nvm是一个命令行工具,用于管理和切换到不同版本的 Node.js。 二、安装nvm(node 版本管理工具) 1、注意: Windows 不支持 NVM,因为 NVM 仅在 Linux 和 Mac 上受支持。你将在 Windows 机器上使用的…

中小品牌项目管理软件排行榜:发现行业新秀与潜力股

使用项目管理软件可以帮助企业提高工作效率,降低成本,提升竞争力。在项目管理软件中,不仅有大品牌如Zoho Projects、Microsoft Project、Jira等,还有一些小品牌的软件也备受关注。本文就为大家介绍在项目管理软件排行榜中小品牌榜…

09_Java集合

一、Java集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态…

如何在Linux系统中配置并优化硬盘的RAID

在Linux系统中配置和优化硬盘的RAID技术可以帮助提高数据存储性能和安全性。RAID(Redundant Array of Independent Disks)技术通过将多个硬盘组合起来,以增加性能、容量或冗余度,提高数据的可靠性和可用性。本文将介绍如何在Linux…

6.s081 学习实验记录(十)file system

文章目录 一、Large files简介提示实验代码实验结果 二、Symbolic links简介提示实验代码实验结果 首先切换到 fs 分支 $ git fetch$ git checkout fs$ make clean 一、Large files 简介 该实验需要我们增大xv6文件的最大大小,目前xv6的最大文件大小为 268个块&…

WordPress主题YIA在广告位添加图片广告时下方有空白怎么办?

YIA主题设置中默认有4个广告位,而侧边栏的广告位由站长自行添加。boke112百科在这些广告位添加图片广告后发现图片下方有空白,导致下方的两个角没有变圆角,看起来也有点不好看。具体如下图所示: 其实,这个问题就是典型…

挑战杯 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

跟着pink老师前端入门教程(JavaScript)-day01

一、计算机编程基础 (一)编程语言 1、编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 计算机程序:就是计算机所执行的一系列的指令集合,而程序全部…

嵌入式学习 C++ Day5、6

嵌入式学习 C Day5、6 一、思维导图 二、作业 1.以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴…

UVa1359/LA3491 Hills

题目链接 本题是2005年ICPC亚洲区域赛杭州欧赛区的H题 题意 平面上有 n(n≤500)条线段,其中每条线段的端点都不会在其他线段上。你的任务是数一数有多少个“没有被其他线段切到”的三角形(即小山)。如下图所示&#x…

【Vitis】Vitis性能优化的开源库

Vitis HLS简介 Vitis™HLS是一种高层次综合工具,支持将C、C和OpenCL™函数硬连线到器件逻辑互连结构和RAM/DSP块上。 Vitis HLS可在Vitis应用加速开发流程中实现硬件内核,并使用C/C语言代码在VivadoDesign Suite中为赛灵思器件设计开发RTL IP。 【Vitis…

不坑盒子 助力高效办公的Office插件

不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理,如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件,是一个非常好用的办公工具,拥有近百项功能的Word,wps插件,支持Office 2010以上的版本&a…

【plt.bar绘制条形图or柱状图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【📊plt.bar绘制条形图】:从入门到精通,只需一篇文章!【Matplotlib】 利用Matplotlib进行数据可视化示例 🌵文章目录🌵 🔍 一、初识plt.bar:条形图的基本概念💡 二、plt.…

Maven - Plugins报错的正确解决之道

背景: 正确解决之道: 在自己本地Maven的安装目录中找到自己的仓库地址目录:直接搜索自己报错的插件文件,把它们删除,如图: 接着回到IDEA点击Maven刷新按钮重新加载即可:已解决 反例&#xff1…

【机构vip教程】Appium自动化(2):Python+Appium环境搭建

windows下搭建pythonappium环境 搭建过程步骤如下: 1、安装jdk并配置好环境变量(jdk版本1.8以上) 2、安装android-sdk并配置好环境变量;具体步骤见:https://www.cnblogs.com/YouJeffrey/p/15243705.html 3、安装安…

浅谈js事件机制

事件是什么?事件模型? 原始事件模型(DOM0级) HTML代码中指定属性值:在js代码中指定属性值:优点:缺点: IE 事件模型DOM2事件模型 对事件循环的理解 宏任务(Macrotasks&…

Three.JS教程5 threejs中的材质

Three.JS教程5 threejs中的材质 一、什么是Three.js材质?二、Three.js的材质类型1. 材质类型2. 材质的共用属性(1).alphaHash : Boolean(2).alphaTest : Float(3).alphaToCoverage : Boolean&am…

白酒:制曲工艺的微生物多样性及其作用

在云仓酒庄豪迈白酒的制曲工艺中,微生物多样性是一个关键要素。曲是白酒生产中的重要配料,它由小麦、麸皮等原料制成,经过微生物的发酵和生长而形成。微生物的多样性和相互作用对曲的品质和白酒的口感具有重要影响。 首先,微生物多…

【后端高频面试题--设计模式上篇】

🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 往期精彩内容 【后端高频面试题–设计模式上篇】 【后端高频面试题–设计模式下篇】 【后端高频…