- 博客(261)
- 资源 (12)
- 收藏
- 关注
原创 BPF学习笔记(八)--Linux tracing system对比分析
前端工具通常作为使用者,在跟踪内核或者观测内核时使用的命令,比如:bpftrace BCC 等工具,内核态框架是指支持上述前端工具的内核框架,比如systemtap的内核模块、BPF的字节码等。Linux trace技术发展已久,经常看到很多的专业术语,从perf LTTng systemtap bpftrace tracepoint trace BCC bpf ebpf等词汇,这些关键的词汇有着怎样的联系和关联,通过下面的这个图可以直观的认识到这几种关键技术的内在联系。:BPF是可针对内核可编程的,
2023-01-05 21:15:00
841
原创 BPF学习笔记(七)-- 静态跟踪点tracepoint
通过对内核中相关的文件进行分析, 在kernel/bpf/syscall.c文件中,我们可以看到其中提交的一个commit,去掉对bpf_prog_load的tracepoint,使用git show 4d220ed 显示下面的信息。》中第4章节中的案例中,有一个tracepoint bpf_prog_load的实例,在我自己的云主机上,执行不通过。通过上面的查看,是在内核4.18之后的内核删除了。上面的程序在bpf_prog_load的函数中添加一个添加一个tracepoint点。
2023-01-01 21:15:00
739
1
原创 BPF学习笔记(六)-- 使用bpf实现xdp的例子
本篇文章参考《Linux Observability with BPF》中第7章的例子,主要功能是借助于ip命令作为前端,对其他主机访问tcp的8000端口进行限制,这里需要使用较新版本的iproute2软件工具包.使用下面的命令进行编译:clang -g -c -O2 -target bpf -c program.c -o program.o。再次使用nmap扫描。本bpf程序对于访问本机的tcp的协议的8000端口进行限制,通过上面的命令加载后,在接口上出现加载的xdp的类型和ID,表明加载成功。
2022-12-29 20:15:00
1281
原创 博客迁移至优快云
各位网友好,本网站的后续博客迁移到优快云,具体网址为:https://blog.youkuaiyun.com/frankzfz?spm=1011.2415.3001.5343,希望在新的平台继续和大家交流。 ...
2022-10-18 16:55:22
171
原创 perf内核跟踪和探测
前面的文章中介绍了使用bcc systemtap等跟踪命令,对内核进行跟踪,还有一个perf工具,作为内核自带的内核分析工具,也可以对内核跟踪和观测,perf的不同之处在于可以方便的分析内核中那个函数占用的CPU时间较多,成为影响系统性能的主要主要因素,所以被称为:Performance Counters for Linux (PCL)。在使用perf命令跟踪内核变量可以使用下面的命令,本篇文章还是使用icmp_rcv函数作为跟踪的示例函数:执行下面的命令。前面有行号的是可以追踪的内核源码。
2022-10-17 17:27:47
857
原创 BPF学习笔记(三)--BPF示例程序
上一篇文章中BPF的例子是以BCC的整体框架为基础,本篇介绍一下基于libbpf库函数为基础,结合内核中的bpf的sample为基础编写一个BPF的程序,本篇介绍是以《linux-observability-with-bpf》这本书第二章的例子为基础,由于内核版本的不同,本篇介绍是以Linux5.16内核为基础,Linux5.16内核中的接口函数与书中的给到的程序案例有较大的差别。2)随着bpf和内核版本的不断变化,参考本文时需要重点关注不同的内核版本、bpftool、gcc等各类工具的版本。
2022-10-12 19:15:04
2530
原创 BPF学习笔记(二)-- 基于BCC的BPF示例程序
1. BPF_PERF_OUTPUT 创建BPF的table,通过Perf 的环形缓存区,把用户定义的event事件的数据推送到用户空间,这是把事件数据推送到用户空间的首选的方式。注意该打印函数会将信息输出到下面的文件中:/sys/kernel/debug/tracing/trace_pipe,通过跟踪该文件进行查看。4. 其实整个程序包含了两个部分,一个是python的客户端,一个是以字符串的形式bpf_text出现的插桩函数,使用C语言编写,整个测试程序包含了,用户空间和内核空间的代码。
2022-10-12 19:03:42
884
2
原创 BPF学习笔记(一)--BPF概述
BPF的原理简单解释为,在各种内核事件和应用程序事件的发生的前面,运行一小段程序,通过运行的这段程序获取到例如:函数调用的流程、结构体内的变量值等有利于分析问题的信息。BPF跟踪检测有两个前端的工具BCC和bpftrace。BCC为BPF编译器集合,BPF Compiler Collection,他提供了开发BPF跟踪程序的高级框架,提供了一个编写内核BPF程序的C语言环境,同时也提供了 Python和Lua等用户端的接口。当然我们可以在这个基础和框架之下,开发符合我们自己的实际需求的BPF工具。
2022-10-12 19:00:16
642
原创 BPF学习笔记(五)--Systemtap BPF/BCC bpftrace 实践对比
本篇文章通过一个案例,对systemtap、BPF/BCC、bpftrace三种不同类型的内核探测工具进行剖析和对比。这个程序就是简单对icmp_rcv函数,收到icmp报文,打印出对应的源IP地址和目的IP地址。
2022-10-10 17:52:32
1045
原创 CFS调度算法调度时机的理解
进程的调度分为两种类型,第一种是自愿让出当前的CPU,这种情况可能是由于当前正在运行的CPU没有获取到继续运行的资源,需要让出当前的CPU,进入sleep状态,等待需要的资源获取到后继续运行,或者本身调用schedule()函数进行调度,第二种情况下是非自愿的情况下,需要让出当前占用的CPU,比如:当前进程在CPU上消耗的时间已经用完或者在周期调度中断中发现有更高优先级进程需要被调度,则当前进程会被优先级更高的进程进行抢占,这种情况下可能是由于:scheduler_tick()函数进行调度。
2022-09-28 18:18:08
437
原创 CFS 调度器的vruntime
CFS调度算法中有一个重要的概念,进程运行的虚拟时间vruntime,CFS调度算法时间是根据vruntime进行进程调度的。本文结合自己对vruntime的理解进行整理和梳理。
2022-09-16 10:26:04
867
原创 BPF学习笔记(四)--使用sockmap示例:bypass内核协议栈
当我们使用127.0.0.1的localhost地址,在本地机器上进行发送和接受数据时,整个数据的发送还是要经过完整的内核协议栈。Cilimu的网络借用bfp的sockmapbypass提高整个网络的性能,参考《How to use eBPF for acceleratingCloud Native application》文章中的示例,在centos7.6平台上进行验...
2022-07-13 20:16:15
604
原创 centos7下编译llvm
从github llvm下载git clone https://github.com/llvm/llvm-project.git编译llvm,在/llvm-project/目录下,创建build目录,使用下面的cmake3进行配置,1)cmake3 -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -G "Un...
2022-03-29 16:37:18
294
原创 LVS中使用toa模块遇到的坑
在LVS中的fullnat模式中,为了获取client的IP地址,会使用到LVS中的toa模块,该模块的作用就是替代系统中的getname系统调用,在rs端通过getname的系统调用获取到client的IP地址。在toa模块中使用到kallsyms_lookup_name函数,该函数的作用就是获取sock_def_readable函数的地址。但是在一些内核发行版中kallsy...
2022-03-24 17:54:45
1030
原创 execsnoop使用在Linux kernel5.9内核中的遇到问题
perf-tool工具是针对Linux内核的系统监测和分析工具,包含对网络、IO、系统调用等多种不同类型的内核分析工具,比如:iosnoop(针对IO的分析)、execsnoop(针对系统调用exec的分析)、tcpretrans(针对Linux tcp报文重传的分析工具)等十几种不同工具。github地址为:git clone 本文是对execsnoop工具使用...
2022-03-24 17:50:37
403
1
原创 Kubernetes学习(2)----创建dashboard
在master节点上创建dashboard,在创建dashborad的时候,会在node节点上pull一个kubernetes-dashboard-amd64的镜像,然后在node节点上使用该镜像创建一个container, 1.1 查看namespace 使用kubectl get namespace命令可以获取到,这个版本的kuber...
2017-08-31 17:30:46
99
原创 Kubernetes学习(1)-----搭建kubernetes环境
1. 搭建kubernetes环境 1.1 环境准备 1.1.1 基本配置 为了避免和Docker的iptables产生冲突,需要关闭Node节点上的防火墙 systemctl stopfirewalld systemctldisable firewalld 为了让各个节点的时间保持一...
2017-08-31 17:28:16
113
原创 ipvlan内核代码流程
ipvlan和原先内核中存在的macvlan类似,都是在一个物理的接口上虚拟出多个子接口,macvlan虚拟出的接口每个接口可以有不同的mac地址,在L2层看来相当于有多张网卡,ipvlan也是在物理接口上虚拟出多个子接口,但是这些子接口具有相同的mac地址,但是可以配置不同的ip地址,所有的虚拟的子接口共享物理接口的mac地址,在docker比较新的版本中,已经支持ipvla...
2017-07-24 17:26:09
148
原创 docker的overlay网络---Docker native overlay network
从docker-1.9版本后,docker本身支持overlay网络,本节就是在docker的nativeoverlay做的试验。首先,保证安装的docker的版本是1.9以上的版本信息, 这里的VM1: 10.10.185.95VM2:10.10.93.222 0)在使用overlay网络需要key-value 键值对 所以...
2017-06-20 16:26:53
109
原创 TCP接收窗口--确定Window Scaling
1. rcv_scale的确定 缓存的配置对后面三次握手交互时,设置window scale的值有很大的关系,window scale的值是在三次握手时通过tcp option确定。 1.1 client发送syn 在三次握手的过程中会根据配置的缓存大小,确定scale的大小,在发送syn数据包和syn+ack报文中,在创建sy...
2017-05-04 19:31:33
475
原创 TCP接收窗口--确定Window
1. TCP接收窗口的调整 在上面配置的rcv_buf都是配置的接收缓存,在tcp层中接收窗口不能完全占满接收缓存,因为TCP层描述的接收窗口,仅仅是tcp层的data,不包含整个数据包的header部分,也就是不包含tcp header IP Header和一些选项信息。 在tcp三次握手的时候会通告各自的接收窗口,包括窗口中的scale因子,在...
2017-04-06 09:56:02
607
原创 TCP接收缓存分析--缓存的初始化
1.1 使用系统默认的buf 在创建socket的时候,会在inet_create调用sock_init_data函数,然后对sk_sndbuf和sk_rcvbuf的设置,下面是对这两个buf的设置,但是会被后面的tcp_v4_init_sock重新赋值修改, sk->sk_rcvbuf = sysctl_rme...
2017-03-24 10:21:24
266
原创 使用SPEC文件编译内核rpm包
1.使用spec文件编译内核,从下载对应的spec文件,这里使用kernel-ml-4.9.0-1.el7.elrepo.nosrc.rpm,使用rpm -ivhkernel-ml-4.9.0-1.el7.elrepo.nosrc.rpm安装获取kernel-ml-4.9.spec文件,这个.spec文件使用的kernel-4.9内核,具体的kenrel版本可以从chan...
2017-03-15 09:59:25
269
原创 TCP_BBR 算法笔记
1. Tcp_bbr注册了一个拥塞算法的回调函数cong_control,不再关心TCP原先的各种拥塞状态,直接在拥塞算法中进行自己的状态转换,进行带宽判断和发送。2. 在bbr的拥塞算法中有四个状态,BBR_STARTUPBBR_DRAIN BBR_PROBE_BW BBR_PROBE_RTT,其中BBR_STARTUP是初始化的状态,这是一个快速填满...
2017-03-15 09:56:35
230
原创 LVS 内核实现分析(3)
4. LVS内核源码分析------NAT模式下TCP报文 前面已经讲过了LVS支持三种模式,其中NAT模式的应用比较广泛,该种模式下的配置仅仅涉及到LVS服务器,Real Server上不需要进行额外的配置。 4.1 LVS的HOOK点函数Linux2.6.32 在内核中IPVS的源码在net/netfilter/ipvs目录下...
2017-02-17 11:09:51
111
原创 LVS 内核实现分析(2)
3 重要数据结构 这里重点介绍其中用到的三个数据结构, 3.1 ip_vs_conn /* *IP_VS structure allocated for each dynamically scheduled connection每一个动态的连接会 有一...
2017-01-06 17:34:12
98
原创 关于TCP MSS的内核设置
下面是一个MSS交互的例子,在三次握手的过程中两个主机捎带了不同的MSS值,192.168.189.22接口的MTU值为1500,192.168.189.21接口的MTU值为1454。下面的内核流程展示了MSS的设置过程。 1) 初始化MSS 2) 客户端发送syn 3) Server端接收到SYN的处理...
2016-12-21 10:48:53
424
原创 LVS 内核实现分析(1)
1概述 LVS(Linux Virtual Server)是Linux内核中实现的一个虚拟服务器,是国内的开发者开发的一个自由软件项目,它的主要作用是负载均衡。它有两部分组成,一个是内核中的核心处理叫IPVS,另一个是用户空间的配置工具ipvsadm,IPVS是Linux内核的一个框架,是在Linux内核的netfilter框架基础之上实现的,在三个HOOK点添加了...
2016-12-15 11:04:06
306
原创 docker的跨主机解决方案weave----遇到的坑(2)
在使用weave时遇到的问题:在新的内核版本中 CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core) ,在MTU为1450的主机上,weave的fast datapath路径不可用,该功能是在weave 1.2.0上引入的。启动后一直为sleeve模式。该问题和内核的版本相关,问题分析:Weave的fast ...
2016-12-02 12:21:10
122
原创 docker的跨主机解决方案weave----遇到的坑(1)
在weave的1.2版本之后,考虑到原先sleeve模式的网络性能很差,增加了fastdp的模式,该模式是weave启动时默认模式,在fastdp模式中使用了kernel中的openvswitch.ko模块,在做报文封装时使用内核中的vxlan。最近遇到一个问题,在使用qemu-kvm虚拟的云主机上,如果安装的是centos7.0,并且内核版本为kernel-3.10.123...
2016-07-06 18:01:04
101
原创 docker网络模式之-----自定义桥
上面我们使用的是系统默认的网桥接口docker0,其默认的IP地址为172.17.0.XXX,我们可以自定义桥接口并且制定静态的IP地址。 首先,servicestop docker服务,添加我们自己的桥接口,这是使用到了brctl命令,如果没有安装可以使用下面的命令进行安装:yum install bridge-utils,先删除docker0...
2016-06-07 21:06:09
58
原创 docker网络模型之---Container模式
Container模式和Host的模式类似,容器也是没有独立的network namespace空间,而是和已经存在的Container共享一个network namespace。两个容器除了网络方面,其余都是如果进程和文件系统还是相互隔离的,另个容器可以通过lo设备进行通信,增加了两个Container之间通信的便利性。 先启动一个Container, ...
2016-06-06 19:21:06
133
原创 docker网络模型之---Host模式
使用docker网络的host模式时,使用下面的命令启动一个容器,当容器启动后,在容器中可以看到宿主机中所有的网络设备,这种方式下在Container中可以操作宿主机的网络资源。如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网...
2016-06-05 11:21:49
150
原创 配置Docker的网络模型—none
在启动容器时指定—net=none,表明在启动的Container中不配置任何网络信息,启动后看到的Container内的信息如下所示:没有eth0接口只有一个lo回环接口。但还是有自己独立的network namespace。root@10-10-63-106 ~]# docker run -i -t --rm--net=none centos6.3-base-v...
2015-12-30 11:33:18
53
原创 Docker的网络模式----桥模式
使用下面的命令启动一个交互的container后,使用netstat –r可以看到其中的路由信息。 [root@centos~]# docker run -i -t centos6.3-base-v2 /bin/bash 下面的命令显示了在该Container中的路由信息。 [root@8e6146d088ce /]# netst...
2015-10-13 21:41:08
47
原创 试用Facebook的WDT
1. 概述 前几天facebook开源了WDT项目,项目的地址为:可以看为一个嵌入式的库或者命令行工具,其目的是在尽量减少资源(CPU/内存等)消耗的情况下,利用多个TCP路径提高两个系统之间传送文件的效率。本文主要是体验一下该项目,在Ubuntu14.04上安装并进行测试。这里有个条件可能需要在gcc的版本,在Centos6.3/6.5上的gcc版本为4.4,在...
2015-08-02 14:28:37
45
原创 制作自己的Docker Registry
1. 相关的版本信息这里使用的docker的版本为1.0.1,这里使用的Ubuntu14.04 点击(此处)折叠或打开 ubuntu@10-10-68-54:~$ sudo docker info [sudo] password for ubuntu: ...
2015-07-30 18:45:19
94
原创 制作可以SSH的docker镜像
使用下面的dockerfile文件制作可以ssh登录的docker镜像文件: 点击(此处)折叠或打开 #version 0.0.1 FROM centos6.3-base-v2:latest MAINTAINER frank "XXX.XXX@X...
2015-05-28 15:37:57
63
原创 将镜像推送到Docker Hub
上面的两个小节制作了基础镜像,也使用Dockerfile文件制作了我们需要的镜像,我们可以把自己制作的镜像推送到Docker Hub上,这样就可以直接使用docker pull命令在任意一台主机上pull下来,当然这是一个公共的仓库,别人也可以使用同样的命令下载,如果使用私有的仓库,需要购买。 向Docker Hub上推送必须要在该网站上进行注册,在需要推送的机器上...
2015-05-26 09:25:06
54
原创 调整docker中rootfs的分区大小
上面一篇文章主要是调整了Container的存放和生成的位置,相应的Container内的空间也进行了调整,这里主要介绍的调整Container内rootfs的大小,rootfs默认的是10G,我们可以通过下面的方法增大该大小。 bash-4.1# df -lhT Filesystem Type Size...
2015-05-15 10:03:38
212
Borland C++3.1 for DOS 安装程序
2010-02-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人