自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(322)
  • 资源 (1)
  • 收藏
  • 关注

原创 deepE第一个版本发布了

deepE(deep edge): 是一个用于端侧(自动驾驶车、机器人等)的性能监控和分析工具.deepE的理念是高效地对端侧系统提供全面的可观测性和系统分析工具,让端侧系统高效稳定的运行.

2024-06-11 16:27:24 262

原创 chatgpt4和文心一言的简单对比

文心一言给出了分析udp延迟的步骤比较具体(数据包达到和应用程序读取之间的时间差)chatgpt4给出的原理更加抽象,需要记录期望的2个时间点间的时间差,适用范围明显更广.

2024-06-02 20:05:54 1936 1

原创 linux可观测性ebpf(一) ----------- 环境搭建

因为学习的书比较老,所以libbpf我们要使用v.8.0.0版本。

2024-06-01 10:04:56 110

原创 linux i/o基本原理

linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。

2024-05-23 10:19:34 36

原创 每天一个ebpf工具 io篇(一) ----------- biosnoop

这里的延迟是1.1中, 2和3操作之间的延迟。即从内核将i/o操作提交给块设备到块设备完成操作通知内核软中断处理的耗时.linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。i/o结束时,分别统计i/o请求在队列中的等待时间和i/o操作块设备的延迟时间.显示进行i/o操作的程序,操作的磁盘扇区,读/写操作, 字节数,以及延迟。获取当前放入i/o request_queue的时间,并放入map中。获取当前提交块设备i/o请求的时间,并放入map中。

2024-05-22 14:35:04 47

原创 perfetto原理之ProtoZero

ProtoZero是一个零拷贝,零分配,零系统调用的protobuf序列化库,主要用于在Perfetto里实现跟踪记录.

2024-04-07 11:35:43 59

原创 ebpf+perfetto实现调度延迟记录与展示

因此,我们只需在2.1.1时记录线程的tid和时间, 在2.1.2时根据tid取出2.1.1时记录的时间并与当前时间做差值,即可得到调度延迟.然后我们用bcc前端结合上面的ebpf程序实现延迟数据获取并记录perfetto支持的json的代码.perfetto支持proto与json等多种格式,为了简化我们的实现难度,我们使用json格式.这里我们只需要研究一下perfetto的数据格式,并按照其格式存储即可.我们可以跟踪线程从放入就绪队列到实际被选中并获得CPU的过程。这里要注意,我们检测系统是否支持。

2024-04-05 22:47:46 257

原创 使用ebpf优化FastDDS统计模块statistics

概述通过本文,你将了解到以下内容:fastdds的调试统计功能如何使用fastdds的调试统计功能有什么问题如何使用USDT(systemTap) + ebpf对fastdds调试统计功能进行改造,以实现动态开关调试功能并实现高性能.fastdds statistics官方文档及说明https://fast-dds.docs.eprosima.com/en/latest/fastdds/statistics/statistics.html已知bughttps://fast-dds.do

2024-04-03 19:17:00 109

原创 ROS2性能优化(一) ------------- 优化executor性能

使用ros2实现的节点,订阅了较多的topic数量(70个左右), 节点cpu使用率明显升高使用perf观察火焰图,executor耗时较多.在ros2 rclcpp的github上搜到确实有一个相关的issue.

2024-03-24 10:29:21 172

原创 网络优化篇(一)---------TCP重传性能优化

本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。/procbcc。

2024-01-06 21:11:54 1089

原创 bcc实战(一)---------内存性能优化

其实我们可以针对不同类型的问题,制作相应的火焰图。因为不同cpu上linux处理page_fault的入口可能不同,所以我们先用bpftrace工具查找一下对应的函数。使用TCMalloc后可以使用火焰图和pidstat再次确认内存使用情况。如果改头善不明显,可能要针对里程内存的使用特点,对TCMalloc进行参数调整或者使用其它内存分配器。可以看到进程每秒的page_fault次数有几万次,数量还是很高的,有很大优化空间.使用TCMalloc让进程尽可能的缓存使用的物理内存,而不是频繁的交还操作系统。

2024-01-05 11:29:08 421

原创 epbf原理篇 -------- epbf编程语言

1.6万字bpf正如上文中提到Linus对epbf的评价ebpf的强大的可编程性几乎可以最大程度地的满足我们性能分析、追踪、安全等各种需要。既然类似于一门编程语言,我们就可以从学习一门编程语言的角度来学习它。看看ebpf都提供给我们哪些编程便利.

2023-12-31 09:33:57 1141

原创 ebpf基础篇(二) ----- ebpf前世今生

它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机.安全是因为ebpf程序需要经过内核中验证器的验证,它可以进行静态代码分析,拒绝可能crash,hang或者对内核有负作用的代码.这些过滤指令实际上是由内核中运行的虚拟机执行的,这个内核中的虚拟机就是BPF的实现核心.这种验证模式和沙箱机器不同,沙箱的运行环境是有限制的,且对执行的程序没有了解能力.,程序可以关联到内核的多种hooks,并在事件触发时运行.

2023-12-24 19:01:17 906

原创 性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程

既然clock_gettime可以通过vdso,为什么异常系统上还会有这么多系统调用呢?

2023-12-23 21:46:15 1183

原创 ebpf基础篇(一) -------- hello ebpf

很多东西的学习都开始于一个’hello world’, ebpf也不例外。实验环境: ubuntu 20.04。

2023-12-23 11:30:41 395

原创 Linux NAPI ------------- epoll边缘触发模式

表示与轮询表中其他设备相比,该设备的相对重要性。网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用该处理程序,将数据从网卡传输到物理内存,或通知内核在一定时间后进行处理。由于下一个分组也通过IRQ通知,如果前一个分组的IRQ尚未处理完成,则会导致问题,高速设备通常就是这样。在从 napi_struct 的容器获得特定于设备的信息之后,调用一个特定于硬件的方法(这里是。么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。

2023-12-15 12:10:10 977

原创 Linux PSI-----Pressure Stall information

当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低,及面临OOM的风险。如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制,未充分利用系统资源;另一种是过度使用,经常性面临业务中断的风险。psi特性能够识别和量化资源竞争导致的业务中断,及其对复杂负载乃至整个系统在时间上的影响。准确度量因资源不足造成的生产力损失,有助于用户基于硬件调整业务负载,或基于业务负载配置硬件。

2023-12-10 10:33:27 1117

原创 定位分析RCU stall问题

在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.

2023-12-09 21:47:47 985

原创 ebpf实战(一)-------监控udp延迟

然后在流程2读取udp缓冲区时(__skb_recv_udp)时取出1中记录的skb时间,并与当前时间做差值得到延迟.为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段.2和1之间可能由于调度等造成延迟,我们写一个bcc程序对指定接收端口和延迟大于某个值的情况进行监控。我们在流程1放入udp缓冲区时(udp_unicast_rcv_skb),记录此skb的时间。1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区。

2023-11-23 14:30:57 737

原创 fastdds实战 ------ 订阅者使用组播

使用"default_external_unicast_locators"置空关闭默认的单播udp端口。默认情况下,FastDDS会对本机的topic使用共享内存,并默认开启一个单播udp端口接收数据.因此我们使用"useBuiltinTransports=false"关闭默认的共享内存通道。并配置一个组播地址用于接收数据,并通过代码在创建data_reader时使用它.

2023-11-23 10:22:19 285

原创 模板元编程实例---如何设计通用的几何库

模板元编程实例—如何设计通用的几何库设计原理假设你需要使用c++程序来计算两点间的距离.你可能会这样做:先定义一个struct:struct mypoint{ double x, y;};然后定义一个包含计算算法的函数:double distance(mypoint const& a, mypoint const& b){ double dx = a.x - b.x; double dy = a.y - b.y; return sq

2022-02-27 11:57:09 790

原创 BPF性能分析—内存篇page_fault

性能分析—内存篇page_fault分析步骤1.sar -B 1整体分析,重点关注fault/s# sar -B 1Linux 5.4.0-92-generic (zhangxa-Precision-3650-Tower-docker) 01/17/22 _x86_64_ (16 CPU)11:35:37 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

2022-01-21 21:47:52 1253

原创 libco开发教程(一) ---- 第一个测试用例

libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "

2021-09-22 15:51:36 390

原创 gRPC详解-----负载均衡策略

1. 背景1.1 基于调用的LB需要注意的是,gRPC的负载均衡是基于每次调用而不是每条连接的.换句话说,即使所有的请求来自同一个客户端,我们也希望这些请求能够在不同的服务上进行LB.1.2 LB的实现方法在介绍任何gRPC的特定实现之前,我们先来浏览一下常见的LB实现方式.balancing.1.2.1 代理模式使用代理能够提供可靠可信任的客户端,还可以向LB系统报告负载情况.代理通常需要更多的资源和操作,因为代理需要拷贝RPC请求和响应的副本.这种模式也会增加RPC的延迟.当请求量很

2021-08-07 20:52:31 1618

原创 golang抢占实现(一)----------抢占的时机

golang抢占时机golang 1.14版本以后开始支持抢占协程.这里有个有趣的问题是:用户态调度的goroutine在什么时机触发抢占判断?熟悉linux的朋友可能知道,linux可能的抢占时机有:时钟中断处理里系统调用返回golang目前的实现golang编译器在每个函数调用之前都会插入以下代码: mov %fs:0xfffffffffffffff8,%rcx //获取tls cmp 0x10(%rcx),%rsp // 判断当前协程的stack是否足够

2021-07-14 23:48:34 546

原创 golang程序启动流程详解

golang程序启动流程详解环境go1.16.5 linux/amd64用例package mainimport "fmt"func main() { fmt.Println(42)}编译-gcflags “-N -l”: 关闭优化和内联,方便调试跟踪$ go build -gcflags "-N -l" -o hello hello.go gdb跟踪执行流程$ gdb hello$ source /usr/lib/go/src/runtime/runti

2021-07-10 20:35:22 1791

原创 在C语言中实现协程库(一)----------协程切换原理详解

从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct

2021-07-04 21:46:17 1307 15

原创 自己如何实现自旋锁,互斥锁和读写锁

锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(

2021-06-27 19:46:03 486

原创 如何在C语言中实现Golang

如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,

2021-06-13 10:07:09 1361 2

原创 C语言中协程(coroutine)实现

无意中发现glibc支持swapcontext, getcontext, makecontext一系列函数,这不正好可以用来实现协程吗?直接撸了一波代码,果然不错。后面逐渐完善相关的io操作库,用它实现一个高性能的服务器.代码地址, 喜欢的记得给个start.后面再写篇文章详细讲述下实现原理。...

2021-06-10 23:35:33 1788

原创 使用antlr4实现简单计算器----python语言

文章在我的主页:http://www.anger6.com/2021/04/24/compile_principles/antlr4/caculator/

2021-04-24 15:22:35 324

原创 开源项目treasure_house

treasure_house介绍treasure_house我开源的一个项目,名字是"宝藏屋"的意思,代表里面是一些有价值的代码。项目语言不限,目的是开发一些业界常用的功能(从基础数据结构到线程池等基础实现)。目的是在造轮子中进一步苦练内功,毕竟很多知识动手实现过和只是用过看过是很不一样的。项目刚刚起步,现在仅实现了链表和内存池。开发人员主要是我和liphx(https://github.com/liphx).欢迎更多代码爱好者参与进来,更多信息可以查看项目地址:https://github.co

2021-03-06 15:15:24 293

原创 BPF学习之性能分析

BPF学习之性能分析1. 概览1.1.目标性能分析前我们需要先明确目标,有的放矢.明确了目标后,进一步的分析工作就有了上下文,不至于跑偏.一般来说,性能分析的目标是改进用户最终体验和降低运行成本.有了目标,最好能将其进行量化:这种量化能够表明是否已经达到优化的目标,还可以定义离目标的差距有多远.可测量的指标:延迟: 多久可以完成一次请求操作,通常以毫秒为单位.速率: 每秒操作或请求的速率.吞吐量: 通常指每秒传输的数据量,以比特(bit)或者字节(byte)为单位.利用率: 以百分比形

2021-01-03 10:57:45 568

原创 docker网络(三) ------------ 端口与DNS

容器网络容器使用的网络类型对于用户而言是透明的,无论底层是网桥,overlay,macvlan或者使用特定的网络插件.从容器的视角看,它有一个自己的IP地址,自己的网络接口,网关,路由表,DNS服务器以及其它与网络相关的细节.发布端口默认情况下,当使用docker create或者docker run创建一个容器时,它不会向外界发布任何端口.要使端口在docker容器之外可以提供服务,你需要使用–publish或者-p选项.这会创建一条防火墙规则将容器内的端口映射到docker所在的宿主机.下面是一些

2020-11-29 11:29:29 419

原创 docker网络(二)-----------iptables

Docker和iptables在linux上,docker通过设置iptables规则来实现网络隔离.这属于内部实现,你也不应该插入iptables规则来修改docker规则.但是,如果你想在docker管理之外添加自己的规则,你可能就需要了解这些细节了.如果你的docker运行在连网的主机上,你可能想通过iptables限制对容器或者其他服务的未受权的访问.本篇文章会介绍如何实现这些功能及需要注意的细节.在Docker规则之前添加iptables策略docker会添加"DOCKER-USER"

2020-11-08 19:33:48 1332

原创 docker网络(一)--------------macvlan

docker网络系统文章用于讲解docker几种网络模型和通信方式。实验环境为下面的组网,2台VM连接在一台交换机上,在一个2层网络中。分别在2台VM上启动容器,通过不同网络模型使容器间互通。macvlan是一种网卡虚拟化技术,在现有网卡上虚拟出一块子网卡,子网卡有自己 的MAC地址,共享底层物理网卡更详细的macvlan介绍,可以参考这篇文章:https://www.jianshu.com/p/2b8b6c738bf6分别在VM1,VM2上创建macvlan网络,都属于17..

2020-11-07 20:39:47 510 2

原创 23种设计模式总结

总结记录23种设计模式类图和思想原理。根据GoF的经典著作,将设计模式分为3大类。分别为创建型,结构型,行为型。创建型:与对象的创建有关结构型:处理类或对象的组合行为型:对类和对象怎样交互和怎样分配职责进行描述创建型设计模型单例模式当存在多个实例时可能会相互影响,因此确保只有一个实例需要关注何时生成这个实例(是否需要惰性生成?)原型模式对象种类繁多,无法将它们整合到一个类中时难以根据类生成...

2020-06-26 21:01:37 326

原创 leetcode算法---深度优先遍历系列---------检查平衡性

题目描述实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3/ \4 4返回false 。来源:...

2020-06-25 23:19:40 203

原创 leetcode算法---字符串系列(一)-------比较版本号

题目描述比较两个版本号 version1和 version2。如果version1>version2返回1,如果version1<version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和. 字符。. 字符不代表小数点,而是用于分隔数字序列。例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版...

2020-06-25 23:12:10 378

原创 leetcode算法---动态规划(DP)系列(一)-------打家劫舍

题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示...

2020-06-25 10:36:33 281

openstack资料

openstack相关资料

2017-01-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除