腾讯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中,你可以使用多线程来实现责任链模式的框架。 首先,你需要定义一个基础的处理者类,它包含处理请求的方…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
