腾讯mini项目-【指标监控服务重构】2023-08-23
今日已办
进度和问题汇总
- 请求合并
- feature/venus trace
- feature/venus metric
- feature/profile-otel-baserunner-style
- bugfix/profile-logger-Sync
- feature/profile_otelclient_enable_config
- 完成otel 开关
- trace-采样
- metrice-reader
- 已经都在各自服务器运行,并接入了云clickhouse集群,开始准备测试【详细需求】
- 测试的用例,并发的数目-【用例拓展-kafka的消息积压】
- clickhouse的哪些指标,cpu、内存,耗时等
- 以什么形式来输出这个性能对比?(表格or图形)
- 指标采集的性能消耗,复杂指标查询的消耗
- 对比对象-Jaeger
- 存储后端-elasticsearch 【手动部署或者购买】
- 收集存储,查询
golang pprof抓取文件 CPU 占用和耗时,内存-火焰图- 不同方案做对比
- ck 的指标
- **数据库的延时,(五分钟)入库成功率 **【压测】
- 通过指标或者链路耗时,定位哪个环节卡住
- 压测 jaeger 数据收集出现问题-【qps】,降低配置,突出优势
- 内存和cpu占有,profile 手动收集指标
- profile服务器3301的端口
- watermill和baserunner的benmark,做得差不多了,修改了publisher用了kafka-client的异步生产者,耗时快了很多
- 需要启动其他监控工具(zipkin,jaeger【已经接入,正在尝试连入ck】,Prometheus等来进行对比吗)
- 一个优化代码中接入otel-sdk,如何减少显式声明,提高代码的可扩展性
- profile 已经将otel逻辑嵌入到baserunner的handler中
- venus 待办
- profile-watermill 待办
分工
- 测试用例 - 1
- jaeger - 2
- pprof - 1
- 测试对比两种方案的 clickhouse 指标
- docker-compose拉低配置
watermill-benchmark
代码实现
- 先初始化 producer
- watermill 初始化并启动 router / baserunner 初始化 consumer
- 在 for 循环中同步生产完固定数量的消息【开始计时】
- 阻塞等待固定数量的消息被消费,解析,处理,异步推回 kafka 完成【结束计时】
- 本机和服务器测试单个topic的100条消息的结果见下列表格
- watermill 的性能和资源利用率均好于 baserunner
- 在核心数多的情况下,优势会更加明显
// Package consumer
// @Author xzx 2023/8/19 14:13:00
package internalimport ("context""fmt"kc "github.com/Kevinello/kafka-client""github.com/ThreeDotsLabs/watermill/message""github.com/ThreeDotsLabs/watermill/message/router/middleware""github.com/ThreeDotsLabs/watermill/message/router/plugin""github.com/bytedance/sonic""github.com/garsue/watermillzap""github.com/google/uuid""github.com/segmentio/kafka-go""go.uber.org/zap""go.uber.org/zap/zapcore""profile/cmd""profile/internal/config"baseconsumer "profile/internal/context/consumer""profile/internal/log""profile/internal/schema""profile/internal/watermill/consumer""profile/internal/watermill/watermillkafka""testing""time"
)// BenchmarkWatermill-16 240 5631314 ns/op 3684370 B/op 37997 allocs/op
// BenchmarkWatermill-16 153 7084305 ns/op 3706966 B/op 38168 allocs/op
// BenchmarkWatermill-16 145 6917486 ns/op 3712511 B/op 38175 allocs/op
func BenchmarkWatermill(b *testing.B) {router := newRouter()go func() {if err := router.Run(context.Background()); err != nil {log.Logger.Error("router run error", zap.Error(err))}}()producer := newProducer()time.Sleep(10 * time.Millisecond)b.ResetTimer()for i := 0; i < b.N; i++ {b.StopTimer()watermillkafka.MessageCount = 0err := publishMessage(producer, 100)if err != nil {break}b.StartTimer()// 阻塞等待消费完成指定数量for {if watermillkafka.MessageCount >= 100 && router.IsRunning() {b.StopTimer()log.Logger.Error("PubSub Count End", zap.Any("count", watermillkafka.MessageCount))break}}}b.StopTimer()router.Close()
}// BenchmarkBaseRunner-16 12 100429542 ns/op 4959836 B/op 42119 allocs/op
// BenchmarkBaseRunner-16 10 100110220 ns/op 4946421 B/op 42132 allocs/op
// BenchmarkBaseRunner-16 10 106747810 ns/op 4942656 B/op 42107 allocs/op
func BenchmarkBaseRunner(b *testing.B) {producer := newProducer()myConsumer, err := kc.NewConsumer(context.Background(),kc.ConsumerConfig{Bootstrap: config.Profile.GetString("kafka.bootstrap"),GroupID: config.Profile.GetString("kafka.group"),GetTopics: func(broker string) (topics []string, err error) {return []string{"to_analyzer__0.PERF_CRASH","to_analyzer__0.PERF_LAG",}, nil},MessageHandler: cmd.ConsumerDispatchHandler,LogLevel: int(zapcore.InfoLevel),},)if err != nil {log.Logger.Fatal("create consumer error", zap.Error(err))return}go func() {select {case <-myConsumer.Closed():log.Logger.Info("consumer Closed")return}}()time.Sleep(10 * time.Millisecond)b.ResetTimer()for i := 0; i < b.N; i++ {b.StopTimer()baseconsumer.ConsumeCount = 0err := publishMessage(producer, 100)if err != nil {break}b.StartTimer()// 阻塞等待消费完成指定数量for {if baseconsumer.ConsumeCount >= 100 {log.Logger.Error("PubSub Count End", zap.Any("count", baseconsumer.ConsumeCount))break}}}b.StopTimer()myConsumer.Closed()
}func publishMessage(producer *kc.Producer, nums int) (err error) {var event = &schema.Event{Meta: schema.Meta{AppID: "1024",Category: "PERF_CRASH",Model: "xiaomi13",DeviceID: "1b201ff9-5002-4fae-8d22-507a1c1a10b6",Os: "ios",OsVer: "13.1",UserID: "28865194-fd08-480f-957d-ee9f21b32c3c",Version: "100.24.56.7.19",Arch: "aarch64",SdkVer: "5.12.6",Platform: "ios",},Data: schema.Data{Time: 1688491757512,IP: "119.147.10.203",ID: "a4b838db-4f34-4da8-a27b-e725477ed336",NetType: "5G",NetOp: "CT",BatteryLevel: 92,PageID: "com.tencent.test.page1",Dimensions: map[string]string{"crashed_thread": "com.tencent.thread1","crash_type": "native","lose_data": "true","repeat_occur": "false",},Values: map[string]int64{"memory_free": 600,"memory_max": 1200,"memory_total": 1600,"remain_disk": 4000,},},VenusData: schema.VenusData{UploadTime: time.Now().UnixMilli(),BackendID: uuid.NewString(),Country: "China",Region: "Guangdong",City: "Shenzhen",},}topic := fmt.Sprintf("to_analyzer__0.%s", event.Category)messages := make([]kafka.Message, 0, nums)for i := 0; i < nums; i++ {event.UploadTime = time.Now().UnixMilli()event.BackendID = uuid.NewString()bytes, err := sonic.Marshal(event)if err != nil {fmt.Printf("failed to marshal event: %v\n", err)}messages = append(messages, kafka.Message{Topic: topic,Value: bytes,})}if err = producer.WriteMessages(context.Background(), messages...); err != nil {fmt.Printf("failed to write messages: %v\n", err)}return
}func newProducer() *kc.Producer {eventKafkaConfig := &kc.ProducerConfig{Bootstrap: "127.0.0.1:9092",Async: false,AllowAutoTopicCreation: true,Logger: &log.LogrLogger,}producer, err := kc.NewProducer(context.Background(), *eventKafkaConfig)if err != nil {panic("cannot connect to kafka with address 127.0.0.1:9092")}return producer
}func newRouter() *message.Router {logger := watermillzap.NewLogger(log.Logger)publisher, subscriber := consumer.NewPubSub(logger)router, err := message.NewRouter(message.RouterConfig{}, logger)if err != nil {log.Logger.Fatal("create router error", zap.Error(err))}router.AddPlugin(plugin.SignalsHandler)router.AddMiddleware(middleware.InstantAck,middleware.Recoverer,)router.AddMiddleware(consumer.UnpackKafkaMessage, consumer.InitPerformanceEvent, consumer.AnalyzeEvent)router.AddHandler("crash", "to_analyzer__0.PERF_CRASH", subscriber, "solar-dev.PERF_CRASH", publisher, consumer.CrashHandler)router.AddHandler("lag", "to_analyzer__0.PERF_LAG", subscriber, "solar-dev.PERF_LAG", publisher, consumer.LagHandler)return router
}
本地测试
| BenchmarkWatermill-16 | BenchmarkBaseRunner-16 |
|---|---|
| 240 563,1314 ns/op 368,4370 B/op 3,7997 allocs/op | 12 1,0042,9542 ns/op 495,9836 B/op 4,2119 allocs/op |
| 153 708,4305 ns/op 370,6966 B/op 3,8168 allocs/op | 10 1,0011,0220 ns/op 494,6421 B/op 4,2132 allocs/op |
| 145 691,7486 ns/op 371,2511 B/op 3,8175 allocs/op | 10 1,0674,7810 ns/op 1,0674,7810 B/op 4,2107 allocs/op |
服务器上测试


单个topic的100条消息
| BenchmarkWatermill-4 | BenchmarkBaseRunner-4 |
|---|---|
| 10 4339,8240 ns/op 363,0762 B/op 3,7820 allocs/op | 25 4616,7095 ns/op 315,8836 B/op 3,9902 allocs/op |
| 78 4065,2822 ns/op 360,0755 B/op 3,7893 allocs/op | 26 4330,6776 ns/op 317,8770 B/op 3,9880 allocs/op |
| 100 3549,3863 ns/op 360,5322 B/op 3,7899 allocs/op | 100 4489,2327 ns/op 316,3158 B/op 3,9775 allocs/op |
| 386 1427,4034 ns/op 358,7454 B/op 3,7876 allocs/op | 10000 4949,4435 ns/op 319,7664 B/op 3,9874 allocs/op |
本地测试单个topic的100条消息
| test | b.n | ns/op | B/op | allocs/op |
|---|---|---|---|---|
| BenchmarkWatermill-16 | 153 | 7084305 | 3706966 | 38168 |
| BenchmarkWatermill-16 | 145 | 6917486 | 3712511 | 38175 |
| BenchmarkBaseRunner-16 | 10 | 100110220 | 4946421 | 42132 |
| BenchmarkBaseRunner-16 | 10 | 106747810 | 106747810 | 42107 |
服务器测试单个topic的100条消息
| test | b.n | ns/op | B/op | allocs/op |
|---|---|---|---|---|
| BenchmarkWatermill-4 | 78 | 40652822 | 3600755 | 37893 |
| BenchmarkBaseRunner-4 | 26 | 43306776 | 3178770 | 39880 |
明日待办
- 协助部署 jaeger
相关文章:
腾讯mini项目-【指标监控服务重构】2023-08-23
今日已办 进度和问题汇总 请求合并 feature/venus tracefeature/venus metricfeature/profile-otel-baserunner-stylebugfix/profile-logger-Syncfeature/profile_otelclient_enable_config 完成otel 开关 trace-采样metrice-reader 已经都在各自服务器运行,并接入…...
C- ssize_t size_t
size_t 和 ssize_t 都是在 C 和 C 的标准库中定义的数据类型,它们通常用于表示大小和长度。然而,它们有关键的区别。 size_t: 定义:size_t 是一个无符号整数类型,它是适合表示对象的大小的类型。在 POSIX 中,它也用于…...
ubuntu20.04 Supervisor 开机自启动脚本一文配置
前言: 最近发现一种非常好的开机启动服务方式,不光可以开机自启动,而且还可以进行开机节点的进程守护,这样大大确保了线程的稳定情况,这种服务甚至可以守护开机的进程,所以比之前设置 rc.local 开机自启动脚本一文配置节点好出很多,它甚至可以使用网页登录监管我开机自启…...
【面试刷题】——函数指针和指针函数
“函数指针”(function pointer)和 “指针函数”(pointer to function)是两个不同的概念,它们涉及到指针和函数的结合使用。 函数指针(Function Pointer): 函数指针是指向函数的指…...
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
目标分类 一、目标分类介绍1.1 二分类和多分类的区别1.2 单标签和多标签输出的区别 二、代码获取三、数据集准备四、环境搭建4.1 环境测试 五、模型训练六、模型测试6.1 多标签训练-单标签输出结果6.2 多标签训练-多标签输出结果 一、目标分类介绍 目标分类是一种监督学习任务…...
【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)
目录 1 Pandas 可视化功能 2 Pandas绘图实例 2.1 绘制线图 2.2 绘制柱状图 2.3 绘制随机散点图 2.4 绘制饼图 2.5 绘制箱线图A 2.6 绘制箱线图B 2.7 绘制散点图矩阵 2.8 绘制面积图 2.9 绘制热力图 2.10 绘制核密度估计图 1 Pandas 可视化功能 pandas是一个强大的数…...
2023华为产品测评官-开发者之声 | 华为云CodeArts征文活动,多重好礼邀您发声!
"2023华为产品测评官-开发者之声"活动激发了众多开发者和技术爱好者的热情,他们纷纷递交了精心编写的产品测评报告。活动社群充满活力,参与者们热衷于交流讨论,互相帮助解决问题,一起探索云技术的无限可能。…...
Python 图形化界面基础篇:获取文本框中的用户输入
Python 图形化界面基础篇:获取文本框中的用户输入 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建文本框步骤4:获取文本框中的用户输入步骤5:启动 Tkinter 主事件循环 完整…...
【驱动开发】实现三盏灯的控制,编写应用程序测试
head.h #ifndef __HEAD_H__ #define __HEAD_H__//LED1:PE10 //LED2:PF10 //LED3:PE8#define LED_RCC 0X50000A28 //使能GPIO#define LED_MODER 0X50006000 //设置输出模式 #define LED_ODR 0X50006014 //设置输出高低电平#define LED2_MODER 0X50007000 …...
Vue3+ElementUI使用
<!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"initial-scale1.0,maximum-scale1.0,minimum-scale1.0,user-scalable0, widthdevice-width"/><!-- 引入样式 --><lin…...
MySQL 和 MariaDB 版本管理的历史背景及差异
目录 MariaDB MySQL 差异 关于 SQLE SQLE 获取 了解更多 需要说明的是 MySQL 和 MariaDB 都有社区版和企业版。对于 MySQL,这两个版本都是由同一家公司(Oracle)提供,遵循相同的版本编号体系,企业版包含更丰富…...
linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)
一、字符设备驱动注册的内部过程 1.分配struct cdev对象空间 2.初始化struct cdev对象 3.注册cdev对象 二、注册字符设备驱动分步实现 1.分配字符设备驱动对象 2.字符设备驱动对象初始化 3.设备号的申请 4.根据申请的设备号和驱动对象注册驱动 三、open函数回调驱动中…...
elasticsearch5-RestAPI操作
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...
数据结构与算法(一)
文章目录 数据结构与算法(一)1 位运算、算法是什么、简单排序1.1 实现打印一个整数的二进制1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果1.3 简单排序算法2 数据结构大分类、前缀和、对数器2.1 实现前缀和数组2.2 如何用1\~5的随机函数加工出1\~7的随机函数2.3 如何把不…...
Matlab--微积分问题的计算机求解
目录 1.单变量函数的极限问题 1.1.公式例子 1.2.对应例题 1 2.多变量函数的极限问题 3.函数导数的解析解 4.多元函数的偏导数 5.Jacobian函数 6.Hessian矩阵 7.隐函数的偏导 8.不定积分问题的求解 9.定积分的求解问题 10. 多重积分的问题求解 1.单变量函数的极限问题 …...
GRU实现时间序列预测(PyTorch版)
💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码数据集原理介绍) 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…...
文本框粘贴时兼容Unix、Mac换行符的方法源码
本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》(www.518cj.net)的时候,要在文本框粘贴从别处复制来的名单。发现一个问题,就是一些Unix传过来的多行文本,粘贴后都变成了一行。原来&a…...
2023年华为杯研究生数学建模竞赛辅导
2023年华为杯研究生数学建模竞赛辅导 各研究生培养单位: 中国研究生数学建模竞赛作为教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一,是一项面向在校…...
post更新,put相当于删除重新增一条
索引数据 //删除后新增 PUT my_dynamic_temp/_doc/1 { “name”:“test”, “class”:“1204” } //覆盖更新 POST my_dynamic_temp/_update/1 { “doc”: { “name”:“test”, “class”:“1203”, “pernum”:“998” } }...
python责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在Python中,你可以使用多线程来实现责任链模式的框架。 首先,你需要定义一个基础的处理者类,它包含处理请求的方…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
