- 博客(331)
- 资源 (1)
- 收藏
- 关注
原创 评估训练模型所需的算力
10亿参数模型:需约1-10 PetaFLOP/s-days(等效1万亿次浮点运算持续1天)千亿参数(如GPT-3):约3,000-5,000 PetaFLOP/s-days万亿参数模型:超过50,000 PetaFLOP/s-days。
2025-01-29 15:17:48
468
原创 了解cuda的统一内存
在CUDA 6中,从Kepler GPU架构(计算能力3.0或更高)开始,在64位Windows 7、8和Linux操作系统(内核2.6.18+)上开始支持统一内存.从CUDA 6开始,NVIDIA推出了CUDA平台历史上最引人注目的编程模型改进之一 ----统一内存。在当今典型的PC或集群节点中,CPU和GPU的内存在物理上是不同的,并由PCI Express总线分隔。在CUDA 6之前,程序员必须这样看待事物。CPU和GPU之间共享的数据必须在两个内存中分配,并由程序在它们之间明确复制。
2024-12-21 18:51:37
507
原创 gpu硬件架构
NVIDIA在视觉计算和人工智能(AI)领域处于领先地位;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论,但很难掌握各种组件的清晰完整的图景。这些GPU的高性能源于其许多组件的无缝集成,每个组件在提供顶级结果方面都发挥着至关重要的作用。本篇文章将对NVIDIA GPU的每个组件进行详细的介绍,从架构和图形处理集群(GPC)到单个核心。另外还有确保高效数据访问的复杂内存层次结构。
2024-12-14 23:28:04
517
原创 深入理解linux内核 --------- CFS调度
else通过上面的代码,可以看到调度周期的时间长度分2种情况。如果当前可运行的任务数>8,则用最小运行时间(0.75ms)*可运行的任务数sysctl_sched_min_granularity: //为了减少任务切换,最小的运行时间片0.75ms.如果运行队列上的任务数
2024-08-28 20:36:14
1126
1
原创 BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。
2024-07-01 16:35:05
183
原创 BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。
2024-07-01 16:30:45
267
原创 deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题
我们可以利用这个offcputime来分析实际环境中因为各种原因造成的进程阻塞及卡顿问题.
2024-06-28 15:13:22
372
原创 堆栈推导两种方式fp与dwarf的差异与原理解析
堆栈推导一般用于coredump文件分析,火焰图制作等场景.了解其原理,有助于帮助我们分析异常问题,以及优化火焰图的制作流程,减少不完整栈情况的出现.堆栈推导有两种常见方式:fp与dwarf. 本篇文章介绍这2种堆栈推导方式的原理及适用场景.
2024-06-28 10:56:54
285
原创 deepE第一个版本发布了
deepE(deep edge): 是一个用于端侧(自动驾驶车、机器人等)的性能监控和分析工具.deepE的理念是高效地对端侧系统提供全面的可观测性和系统分析工具,让端侧系统高效稳定的运行.
2024-06-11 16:27:24
472
原创 chatgpt4和文心一言的简单对比
文心一言给出了分析udp延迟的步骤比较具体(数据包达到和应用程序读取之间的时间差)chatgpt4给出的原理更加抽象,需要记录期望的2个时间点间的时间差,适用范围明显更广.
2024-06-02 20:05:54
2207
1
原创 每天一个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
252
原创 perfetto原理之ProtoZero
ProtoZero是一个零拷贝,零分配,零系统调用的protobuf序列化库,主要用于在Perfetto里实现跟踪记录.
2024-04-07 11:35:43
220
原创 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
504
原创 使用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
325
原创 ROS2性能优化(一) ------------- 优化executor性能
使用ros2实现的节点,订阅了较多的topic数量(70个左右), 节点cpu使用率明显升高使用perf观察火焰图,executor耗时较多.在ros2 rclcpp的github上搜到确实有一个相关的issue.
2024-03-24 10:29:21
503
原创 网络优化篇(一)---------TCP重传性能优化
本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。/procbcc。
2024-01-06 21:11:54
1470
原创 bcc实战(一)---------内存性能优化
其实我们可以针对不同类型的问题,制作相应的火焰图。因为不同cpu上linux处理page_fault的入口可能不同,所以我们先用bpftrace工具查找一下对应的函数。使用TCMalloc后可以使用火焰图和pidstat再次确认内存使用情况。如果改头善不明显,可能要针对里程内存的使用特点,对TCMalloc进行参数调整或者使用其它内存分配器。可以看到进程每秒的page_fault次数有几万次,数量还是很高的,有很大优化空间.使用TCMalloc让进程尽可能的缓存使用的物理内存,而不是频繁的交还操作系统。
2024-01-05 11:29:08
535
原创 epbf原理篇 -------- epbf编程语言
1.6万字bpf正如上文中提到Linus对epbf的评价ebpf的强大的可编程性几乎可以最大程度地的满足我们性能分析、追踪、安全等各种需要。既然类似于一门编程语言,我们就可以从学习一门编程语言的角度来学习它。看看ebpf都提供给我们哪些编程便利.
2023-12-31 09:33:57
1386
原创 ebpf基础篇(二) ----- ebpf前世今生
它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机.安全是因为ebpf程序需要经过内核中验证器的验证,它可以进行静态代码分析,拒绝可能crash,hang或者对内核有负作用的代码.这些过滤指令实际上是由内核中运行的虚拟机执行的,这个内核中的虚拟机就是BPF的实现核心.这种验证模式和沙箱机器不同,沙箱的运行环境是有限制的,且对执行的程序没有了解能力.,程序可以关联到内核的多种hooks,并在事件触发时运行.
2023-12-24 19:01:17
1111
原创 性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程
既然clock_gettime可以通过vdso,为什么异常系统上还会有这么多系统调用呢?
2023-12-23 21:46:15
1918
原创 ebpf基础篇(一) -------- hello ebpf
很多东西的学习都开始于一个’hello world’, ebpf也不例外。实验环境: ubuntu 20.04。
2023-12-23 11:30:41
488
原创 Linux NAPI ------------- epoll边缘触发模式
表示与轮询表中其他设备相比,该设备的相对重要性。网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用该处理程序,将数据从网卡传输到物理内存,或通知内核在一定时间后进行处理。由于下一个分组也通过IRQ通知,如果前一个分组的IRQ尚未处理完成,则会导致问题,高速设备通常就是这样。在从 napi_struct 的容器获得特定于设备的信息之后,调用一个特定于硬件的方法(这里是。么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。
2023-12-15 12:10:10
1062
原创 Linux PSI-----Pressure Stall information
当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低,及面临OOM的风险。如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制,未充分利用系统资源;另一种是过度使用,经常性面临业务中断的风险。psi特性能够识别和量化资源竞争导致的业务中断,及其对复杂负载乃至整个系统在时间上的影响。准确度量因资源不足造成的生产力损失,有助于用户基于硬件调整业务负载,或基于业务负载配置硬件。
2023-12-10 10:33:27
1375
原创 定位分析RCU stall问题
在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.
2023-12-09 21:47:47
1626
原创 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
947
原创 fastdds实战 ------ 订阅者使用组播
使用"default_external_unicast_locators"置空关闭默认的单播udp端口。默认情况下,FastDDS会对本机的topic使用共享内存,并默认开启一个单播udp端口接收数据.因此我们使用"useBuiltinTransports=false"关闭默认的共享内存通道。并配置一个组播地址用于接收数据,并通过代码在创建data_reader时使用它.
2023-11-23 10:22:19
547
原创 模板元编程实例---如何设计通用的几何库
模板元编程实例—如何设计通用的几何库设计原理假设你需要使用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
857
原创 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
1434
原创 libco开发教程(一) ---- 第一个测试用例
libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "
2021-09-22 15:51:36
481
原创 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
1801
原创 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
636
原创 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
1945
原创 在C语言中实现协程库(一)----------协程切换原理详解
从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct
2021-07-04 21:46:17
1534
15
原创 自己如何实现自旋锁,互斥锁和读写锁
锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(
2021-06-27 19:46:03
579
原创 如何在C语言中实现Golang
如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,
2021-06-13 10:07:09
1487
2
原创 C语言中协程(coroutine)实现
无意中发现glibc支持swapcontext, getcontext, makecontext一系列函数,这不正好可以用来实现协程吗?直接撸了一波代码,果然不错。后面逐渐完善相关的io操作库,用它实现一个高性能的服务器.代码地址, 喜欢的记得给个start.后面再写篇文章详细讲述下实现原理。...
2021-06-10 23:35:33
1989
原创 使用antlr4实现简单计算器----python语言
文章在我的主页:http://www.anger6.com/2021/04/24/compile_principles/antlr4/caculator/
2021-04-24 15:22:35
403
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人