self-motivation
专注LINUX系统与性能分析优化
展开
-
BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。原创 2024-07-01 16:35:05 · 68 阅读 · 0 评论 -
BPF可移植性 CO-RE (Compile Once – Run Everywhere)
BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。原创 2024-07-01 16:30:45 · 188 阅读 · 0 评论 -
deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题
我们可以利用这个offcputime来分析实际环境中因为各种原因造成的进程阻塞及卡顿问题.原创 2024-06-28 15:13:22 · 279 阅读 · 0 评论 -
deepE版本支持aarhc64 orin平台发布
欢迎参与deepE项目。原创 2024-06-25 11:18:24 · 49 阅读 · 0 评论 -
linux可观测性ebpf(一) ----------- 环境搭建
因为学习的书比较老,所以libbpf我们要使用v.8.0.0版本。原创 2024-06-01 10:04:56 · 140 阅读 · 0 评论 -
使用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 · 151 阅读 · 0 评论 -
网络优化篇(一)---------TCP重传性能优化
本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。/procbcc。原创 2024-01-06 21:11:54 · 1141 阅读 · 0 评论 -
ebpf基础篇(一) -------- hello ebpf
很多东西的学习都开始于一个’hello world’, ebpf也不例外。实验环境: ubuntu 20.04。原创 2023-12-23 11:30:41 · 410 阅读 · 0 评论 -
Linux NAPI ------------- epoll边缘触发模式
表示与轮询表中其他设备相比,该设备的相对重要性。网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用该处理程序,将数据从网卡传输到物理内存,或通知内核在一定时间后进行处理。由于下一个分组也通过IRQ通知,如果前一个分组的IRQ尚未处理完成,则会导致问题,高速设备通常就是这样。在从 napi_struct 的容器获得特定于设备的信息之后,调用一个特定于硬件的方法(这里是。么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。原创 2023-12-15 12:10:10 · 999 阅读 · 0 评论 -
Linux PSI-----Pressure Stall information
当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低,及面临OOM的风险。如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制,未充分利用系统资源;另一种是过度使用,经常性面临业务中断的风险。psi特性能够识别和量化资源竞争导致的业务中断,及其对复杂负载乃至整个系统在时间上的影响。准确度量因资源不足造成的生产力损失,有助于用户基于硬件调整业务负载,或基于业务负载配置硬件。原创 2023-12-10 10:33:27 · 1181 阅读 · 0 评论 -
定位分析RCU stall问题
在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.原创 2023-12-09 21:47:47 · 1096 阅读 · 0 评论 -
fastdds实战 ------ 订阅者使用组播
使用"default_external_unicast_locators"置空关闭默认的单播udp端口。默认情况下,FastDDS会对本机的topic使用共享内存,并默认开启一个单播udp端口接收数据.因此我们使用"useBuiltinTransports=false"关闭默认的共享内存通道。并配置一个组播地址用于接收数据,并通过代码在创建data_reader时使用它.原创 2023-11-23 10:22:19 · 352 阅读 · 0 评论 -
在C语言中实现协程库(一)----------协程切换原理详解
从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct原创 2021-07-04 21:46:17 · 1372 阅读 · 15 评论 -
自己如何实现自旋锁,互斥锁和读写锁
锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(原创 2021-06-27 19:46:03 · 504 阅读 · 0 评论 -
如何在C语言中实现Golang
如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,原创 2021-06-13 10:07:09 · 1424 阅读 · 2 评论 -
C语言中协程(coroutine)实现
无意中发现glibc支持swapcontext, getcontext, makecontext一系列函数,这不正好可以用来实现协程吗?直接撸了一波代码,果然不错。后面逐渐完善相关的io操作库,用它实现一个高性能的服务器.代码地址, 喜欢的记得给个start.后面再写篇文章详细讲述下实现原理。...原创 2021-06-10 23:35:33 · 1833 阅读 · 0 评论 -
让你的项目支持autotools
通常我们在linux下用源码安装库或程序,都是使用的autoools工具(虽然可能有些过时,bazel,CMake等等)。但是目前来看,还是一种不错的选择。典型安装过程:./configuremakesudo make install如果你自己创建了一个开源项目,自己手工编写Makefile的痛苦可想而知,因此还是用autools吧,如果正好你不太好用。就用下面的脚本生成...原创 2020-04-16 21:49:51 · 217 阅读 · 0 评论 -
vim命令大全
熟悉VIM的朋友都知道"."操作符的强大,因此如果能够在进行操作的同时从普通模式进入插入模式将会事半功倍。因此收集了具有此作用的复合命令即其长命令。方便大家更好的进行创作:复合命令 等效长命令 作用 C c$ 从光标所在字符删除到行尾并进入插入模式 s cl 删除光标所在字符并进入插入模式 S ^c 删除光标所在行并进入插入模式...原创 2020-04-06 11:50:15 · 210 阅读 · 0 评论 -
浅谈overlayfs
overlayfsoverlayfs试图在其它文件系统之上提供一个联合的文件系统视图Upper and Loweroverlayfs组合了2个文件系统---Upper文件系统和Lower文件系统。当同名文件在Upper和Lower中都存在时,Lower中的文件会隐藏,如果是目录,则会合并显示.Lower文件系统更准确的说法应该是目录树,因为这些目录树可以属于不...原创 2020-03-15 20:16:10 · 1321 阅读 · 0 评论 -
一行shell实现统计单词词频
写一个 bash 脚本以统计一个文本文件words.txt中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和' '。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。示例:假设 words.txt 内容如下:the day is sunny the thethe sunny is is你的脚本应当输出(以词频降序排列):...原创 2020-02-17 22:44:38 · 557 阅读 · 0 评论 -
linux epoll实现分析
epoll的作用是进行I/O的多路复用,可以同时监听多个fd产生的事件。常结合异步处理实现单线程的高并发。在多核环境中,可以结合多线程实现负载分担。本文主要分析一下linux epoll的实现。APIepoll_create(int size);.epoll_create1(int flags);创建一个epoll实例,并返回与之关联的一个fd.这是后面我们继续使用epoll其...原创 2019-07-27 23:18:07 · 543 阅读 · 0 评论 -
Vim中删除一个单词
目标假设光标目前处于行尾的e字符上,要删除最后一个单词”line”this is a test in vim. I want to delete a word in the line.解决方法要删除最后一个单词,有以下几种选择。先用’b’命令把光标先移动到”l”上,然后执行dw删除整个单词.按键3个执行反向删除命令’db'(会剩余最后的”e”字符),再执行’x’删除单个...原创 2019-08-28 23:01:11 · 3962 阅读 · 0 评论 -
github實戰(一)-----------安裝並創建第一個倉庫
1.github與git簡介git是一個版本管理系統,和svn作用一樣。而github為我們的git倉庫提供了托管服務,我們可以在github上創建我們的git倉庫,從而分享我們的代碼。2.安裝git在Windows環境下安裝git,從方便的方式是使用msysGit.下載地址:http://www.xiazaiba.com/html/25984.html下載原创 2016-02-22 21:26:03 · 599 阅读 · 0 评论 -
LINUX互斥技术
http://www.anger6.com/?p=709在内核中,可能出现多个进程(通过系统调用进入内核模式)访问同一个对象,进程和硬中断访问同一个对象,进程和软中断访问同一个对象,多个处理访问同一个对象,此时需要使用互斥技术,确保在给定的时刻只有一个主体可以进入临界区访问对象。如果临界区执行的时间比较长或者可能睡眠,可以使用下面这些互斥技术:信号量,大多数情况下使用互斥信号量...原创 2019-06-26 22:59:07 · 247 阅读 · 0 评论 -
SMP缓存一致性
http://www.anger6.com/?p=641在阅读linux相关源码的过程中,经常看到内存屏障相关原语,如mb(),rmb(),wmb等。要想理解这些原语的作用,有必要理解SMP缓存一致性原理。在SMP系统中,处理器的每个核都有独立的一级缓存,因此同一内存位置的数据,可能在多个核一级缓存中存在多个副本,所以存在数据一致性的问题。目前主流的缓存一致性协议是MESI协议及其衍生协议...原创 2019-06-23 19:06:48 · 1048 阅读 · 2 评论 -
AUTOTOOLS工具
转自我的博客:http://www.anger6.com/?p=621在linux环境下通过源码安装程序,我们通常只需要下载源码包,解压,然后执行如下命令:./configuremakesudo make install.之所以能这么easy,背后是autotools的功劳。使用autotools的基本流程如下:通常我们只需要编写Makefile.am和configu...原创 2019-06-23 11:17:16 · 2182 阅读 · 0 评论 -
大家一起写操作系统(4)-简单的任务切换
下面这段程序定义了两个任务,每个任务都有自己的TSS,LDT。任务0打印字符‘a’,任务1打印字符'b'.任务切换通过时钟中断处理过程完成。时钟到达时,判断当前任务号,切换到另一个任务,并用jmp tss:0的方式实现任务切换。任务中通过0x80系统调用打印字符。任务切换时,cpu会自动把当前任务的上下文(主要是各种寄存器,ldt)等保存当当前任务的TSS段中,并加载目标任务的TSS段相关信息,切原创 2013-01-26 21:15:54 · 2388 阅读 · 1 评论 -
大家一起写操作系统(3)-时钟中断
大家都知道操作系统利用中断来与外设进行交互。80xx86兼容机使用两片级联的8259A可编程中断控制芯片组成一个中断控制器,用于实现与I/O设备的交互。可编程意味着我们可以为不同的外设(时钟,键盘,鼠标等)分配不同的中断号,从而执行不同的中断处理过程。 BIOS初始化这个中断控制器时将中断号8分配给了时钟控制器,因而下面我们通过将中断向量表中的8号描述符设为我们的中断程序地址,进而实现时钟中原创 2013-01-26 12:36:11 · 2366 阅读 · 0 评论 -
大家一起写操作系统(2)-简单的内核
KERNEL_DS equ 0x10VIDEO_DS equ 0x18[SECTION kernel][BITS 32]kernel: mov ax,VIDEO_DS mov gs,ax ;显存数据段选择符 mov ax,KERNEL_DS mov ds,ax ;数据段选择符 mov es,ax ;数据段选择符 m原创 2013-01-20 20:57:41 · 1506 阅读 · 0 评论 -
大家一起写操作系统(1)-引导程序
上一节我们知道bios会把启动设备第一扇区的512B程序加载到0x7c00处执行.由于512B程序大小所限,所以这段程序一般用于引导,就是说将内核程序从启动设备中读出并复制到一个合适的位置,然后引导程序把控制权将给内核。这一节我们就实现这样一个引导程序。实验环境:编译器:NASM 虚拟机vmware8.0二进制编辑器winHex:用于将引导程序和内核写入软盘映射文件img.原创 2013-01-20 19:53:03 · 4395 阅读 · 0 评论 -
AT&T汇编语法中的指令
AT&T中的节(section) 在AT&T的语法中,一个节由.section关键词来标识,当你编写汇编语言程序时,至少需要有以下三种节: .section .data: 这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如: hello : .string "Hello world!\n" he原创 2013-01-06 21:33:27 · 1327 阅读 · 0 评论 -
Linux进程间通信-FIFO管道
也称有名管道,它是一种文件类型,在文件系统中可以看到。程序中可以查看文件stat结构中st_mode成员的值来判断文件是否是FIFO文件。创建一个FIFO文件类似于创建文件,FIFO文件就像普通文件一样。FIFO的通信方式类似于在进程中使用文件来传输数据,只不过FIFO类型文件同时具有管道的特性。在数据读出时,FIFO管道中同时清除数据。创建FIFO:#incl原创 2012-04-15 17:46:11 · 1112 阅读 · 0 评论 -
linux进程间通信-匿名半双工管道
匿名管道没有名字,对于管道中使用的文件描述符没有路径名,也就是不存在任何意义上的文件,它们只是在内存中跟某一个索引节点相关联的两个文件描述符。主要特性:1.数据只能在一个方向上移动。2.只能在具有公共祖先的进程间通信,即或是父子关系进程间、或是在兄弟关系进程间。打开或关闭:#includeint pipe(int fd[2]);参数int fd[2]为一原创 2012-04-12 21:29:45 · 972 阅读 · 0 评论 -
ACE:ACE_SOCK_STREAM应用实例
ACE_SOCK_Acceptor用于被动连接的建立,基于BSD accept()和listen()调用,接受客户端连接请求后,将可靠的数据流传递给ACE_SOCK_STREAM类的一个对象,便可调用流的recv(),send()方法在流上接收或发送数据。另外,ACE_INET_Addr封装了传统的地址结构体。#include #include #include "ac原创 2012-02-12 21:00:29 · 7318 阅读 · 0 评论 -
linux内核编译步骤
1.准备工作 (1).整理出系统需要支持的硬件,文件系统类型及网络协议等内容(在配置内核编译选项时需要)。 (2).查看系统的版本号(uname -r),如果你的系统版本与将要编译的内核版本一致,建议将/lib/modules下的内容备份,否则make modules_install(安装模块)步骤产生的文件会覆盖这个路径下的内容。 (3).A:下载并解压内核.下载地原创 2012-02-05 18:28:39 · 678 阅读 · 0 评论 -
OpenSuse11安装ATi显卡驱动
1.从AMD官网下载linux的显卡驱动,注意显卡型号与操作系统位数。2.由于安装显卡驱动时要编译内核,所以保证已经安装对应的内核源码.可以在光盘中找到kernel-source.*.rpm安装包安装。3.然后切换到文本界面(init 3),运行下载的驱动安装包*.run.4.依次执行:aticonfig --initial sax2 -r -m 0=f原创 2012-01-24 10:35:11 · 1327 阅读 · 0 评论 -
大家一起写操作系统-准备知识(1)--计算机的启动过程
对于一个没有安装任何软件的裸机,我们想要利用它,就要给它写一个操作系统来充分发挥它的性能。所以想要写操作系统,首先就要知道裸机上电后会做些什么,会执行哪些指令,从而知道我们的操作系统应该放在哪儿,应该如何写,所以先介绍计算机的启动过程。 当计算机上电后,物理内存被设置成从地址0开始的连续区域。除了地址从0xA0000-0xFFFFF(640KB~~~1M共384KB,DOS中的经原创 2013-01-19 19:35:01 · 1773 阅读 · 0 评论 -
linux内核学习(一)------------模块
1.1 linux内核模块简介模块是linux提供的动态加载代码的功能。模块具有如下特点:1.模块一旦被加载,就和内核其它部分完全一样。2.模块本身不被编译进内核,从而控制了内核的大小1.2 下面是一个常见的内核模块的举例:#include #include #include static int __init lkp_init(void){prin原创 2016-01-03 20:57:31 · 1003 阅读 · 0 评论 -
linux字符设备驱动程序(一)----------分配设备号并注册设备
本文代码取自第三版通过linux字符设备驱动程序一系列文章,将实现一个scull字符设备驱动程序。更详细的内容可以参考原书,本文的目的在于讲解一些关键部分。scull设备是基于内存的设备,每个设备都含有一个链表,链表中的每个节点是一个指针数组。数组的大小用qset表示,数组中的每个指针指向一块内存,这块内存的大小用quantum表示。本节主要实现2个功能:1.分配设备号主次原创 2016-01-20 21:28:24 · 2722 阅读 · 0 评论 -
iptables:传统的Linux防火墙管理程序
IP防火墙(IPFW)和Netfilter防火墙机制的不同IPFW是Linux较老的防火墙,主要使用ipfwadm和ipchains.它和iptables的区别包括:iptables是高度模块化的,个别模块有时必须被明确地加载日志记录是一个规则目标而不是命令选项连接状态跟踪可以被维护。地址和端口转换与数据包过滤划逻辑分离的功能实现完全的源地址和目的地址转换伪装是一个术语,用来指一种原创 2017-04-04 23:13:51 · 1093 阅读 · 0 评论