自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 openstack-neutron的GRE、VLAN和VXLAN网络模式审核

另外一个是 qg-xxx 这样的接口,是连接到 router 服务的网络名字空间中,里面绑定一个路由器的外部IP,作为 NAT 时候的地址,另外,网络中的 floating IP 也放在这个网络名字空间中。br-tun将带有vlan tag的vm跟外部通信的流量转换到对应的gre隧道,这上面要实现主要的转换逻辑,Compute节点上发往GRE隧道的网包最终抵达Network节点上的br-tun.网络节点上的规则跟Compute节点上br-tun的规则相似,完成tunnel跟vlan之间的转换。

2023-03-21 16:42:10 443

原创 块设备层bdev编程简介

不同的thread 操作同一个device应该拥有不同的I/O channel,每个I/O channel在I/O路径上使用自己独立的资源就可以避免资源竞争,从而去除锁的机制。【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群。

2023-03-20 22:30:36 343

原创 容器的网络模式

【文章福利】需要更多DPDK/SPDK学习资料加群793599096(资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群。一般网络选择none时,并不是不用网络而是使用自定义的网络模型,常见的自定义网络模型有overlay(vxlan),macvlan等,这些网络也常常以netplugin的即插件的方式出现。

2023-03-20 22:21:47 242

原创 【udp】数据解析

UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,因为对于这些应用,若是采用TCP,为连接的创建,维护和拆除带来不小的开销。,其中的高位0x4,表示的是版本号,ipv4的意思,而后面低字节5表示的是指明IPv4协议包头长度的字节数包含多少个32位,这里是5,也就是说协议头是5*4=20个字节的大小。

2023-03-10 22:12:41 590

原创 Reactor 线程模型 _

个人理解:Reactor 模式其实就是将 NIO 原来的组件抽象成成新的组件(Reactor、Acceptor、Handler),每个组件在原来NIO的API基础上加了一些功能,分别负责不同的功能,各司其职,比如 Reactor 就包括NIO的select,但是又提供了分发(dispatch)功能。就是多路复用器的概念,一个线程上的 selector 只作监听 accept 事件,然后把连接分发到其他 worker 线程上的 selector 注册读事件,然后worker线程处理有限个连接的读。

2023-02-11 22:07:47 127

原创 实现百万并发连接的Reactor

和普通函数调用的不同之处在于:应用程序不是主动的调用某个 API 完成处理,而是恰恰 相反,Reactor 逆置了事件处理流程,应用程序需要提供相应的接口并注册到 Reactor 上, 如果相应的时间发生,Reactor 将主动调用应用程序注册的接口,这些接口又称为“回调函 数”。可是缺点也是明显的,现在的硬件发展,已经不再遵循摩尔定 律,CPU 的频率受制于材料的限制不再有大的提升,而改为是从核数的增加上提升能力, 当程序需要使用多核资源时,Reactor 模型就会悲剧。这是listenfd的回调函数。

2023-02-11 21:55:08 175

原创 深入理解IO多路复用 select/poll/epoll 实现原理

并且,在用户进程继续执行完 recvfrom() 函数系统调用,将内核空间的数据拷贝到了用户缓冲区后,用户进程才会真正拿到所需的数据进行处理;(epoll 优化为不拷贝)

2023-02-11 21:37:05 194

原创 Reactor模式介绍

可以看到,这个主线程的Reactor既要负责客户端连接事件的处理(即关心listenfd的事件),又要关心已连接套接字的事件(即关心clientfd的io事件)。

2023-02-11 21:21:23 236

原创 网络IO模型与Reactor模式

。这种模式也被叫做服务器的 1+M+N 线程模式,即使用该模式开发的服务器包含一个(或多个,1 只是表示相对较少)连接建立线程+M 个 IO 线程+N 个业务处理线程。

2023-02-11 21:16:54 132

原创 Redis篇:单线程I/O模型

纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别。因此 redis 进程的 cpu 基本不存在磁盘 I/O 等待时间、内存读写性能问题,CPU 不是 redis 的瓶颈(内存大小和网络I/O 才是 redis 的瓶颈,也就是客户端和服务端之间的网络传输延迟)redis 处理快,不单单因为它是个单线程纯内存系统,还有它采用了 Reactor 模型,使用 I/O 多路复用来实现对外部请求的处理,减少网络连接、读写等待时间。采用单线程模型,单线程实现简单。

2023-02-11 21:05:31 153

原创 Websocket集群解决方案

服务启动后,客户端ws.onopen调用服务端的@OnOpen注解的方法,储存客户端的session信息,握手建立连接。启动两个服务,端口分别是8080和8081。

2023-02-10 22:22:38 219

原创 Docker存储管理

创建卷的时候主机上的Docker根目录(linux默认是/var/lib/docker)下的volumes子目录内会生成一个以卷名命名的子目录,这个子目录里面再创建一个_data的子目录作为卷的数据存储路径。tmpfs挂载仅限于运行Linux操作系统的Docker主机使用,它只存储在主机的内存中,不会被写到主机的文件系统中,因此不能持久保存容器的应用数据。如果将主机上的目录绑定挂载到容器上的非空目录,则容器挂载的目录中的现有内容会被绑定挂载(主机上的目录)所遮盖。卷是Docker持久化存储数据的最佳方式。

2023-02-10 21:27:18 783

原创 理解docker [二] - namespace

由于多个container是共享OS内核的,因而像UTS里的os type和os release等信息是不可能更改的,但是每个container可以有自己独立的host name和domain name,以便于标识和区分(比如可以通过主机名来访问网络中的机器),这就是UTS namespace的作用。看完以上这六种给container带来虚幻错觉的花招,不难发现,其实它们要达到的效果都是差不多的,就是在不同的space里面,可以有相同的name,不会重名,只能看见和使用与该namespace相关的资源。

2023-02-10 21:14:24 155

原创 TCP 三次握手、四次挥手、和 UDP 的区别

当服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也指定了自己的初始化序列号 ISN。:当客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也同样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。:当服务端收到 FIN 之后,会发送 ACK 报文,并且把客户端的序列号值加 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

2023-02-10 19:52:04 86

原创 ovs学习

DPDK技术是重载网卡驱动,直接将数据传递给用户态的应用程序,避免了中间环节的经过TCP/IP协议栈,内核空间到用户空间的copy。同时针对第一点网卡频繁的中断,应用程序可以使用轮询的方式获取网卡上的数据,避免中断造成的场景切换和恢复浪费的时间。当前数据包的处理流程是这样:数据包到达网卡,网卡发送中断通知CPU,CPU将数据包拷贝到内核空间中,应用程序从内核空间中拷贝数据到用户态空间,数据处理。priority:表示优先级,取值越大,优先级越高,匹配table n时,从优先级高的开始匹配。

2023-02-09 20:57:15 256

原创 bpftrace实战--排查内存泄漏

文中我构建了一个 leak.c,其中同时存在正确释放的内存和泄漏的内存,模拟一些比较复杂的内存泄漏情况。

2023-02-09 20:33:30 971

原创 Linux Epoll 详解

Epoll 作为Linux 系统中的核心武器之一,在高吞吐、高并发的IO系统中经常遇见Epoll的身影,Redis、Nginx、Skynet等都使用到了IO多路复用技术。我们可以先创建一个epoll对象,再将fd(File Descriptor 文件描述符对象)注册到epoll对象里,之后便能通过调用epoll对象的查询函数来获取准备好事件的fd对象。epoll提供了三个API接口,分别为epoll_create、epoll_ctrl、epoll_wait,下面分别说明这三个接口的用处。

2023-02-09 20:09:33 1111 1

原创 TCP 四次挥手的性能优化

由于此时端口恢复了自由,使用相同的四元组建立连接,当连接建立完成后,在网上逗留的 FIN 报文又到了主动方,那么刚建立的新的连接由于旧的 FIN 报文而出现误关闭。【文章福利】需要更多DPDK/SPDK/LinuxC++学习资料 (资料包括C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,大厂面试题 等)可以自行添加学习交流群。

2023-02-09 19:53:06 210

原创 dpdk uio

igb_uio 驱动会遍历该 PCI 设备的 BAR 空间,对于类型为存储器空间 IORESOURCE_MEM 的 BAR(Memory BAR),将其物理地址、大小等信息保存到 uio_info 结构的 mem 数组中;的 BAR(IO BAR),将其物理地址、大小等信息保存到 uio_info 结构的 port 数组中。而 igb 驱动同样也会遍历 BAR 空间,但是它不会记录空间的物理地址,而不是像 igb_uio 驱动似的在用户态中进行读写。驱动就可以在内核态中读写映射出来的虚拟地址,

2023-02-08 21:41:49 204

原创 DPDK QoS之分层调度器

分层调度器的时机主要体现在TX侧,正好在传递报文之前。它的主要目的是在每个网络节点按照服务级别协议来对不同的流量分类和对不同的用户的报文区分优先级并排序。一、概述分层调度器跟以前使用网络处理器实现的每条流或一组流的报文队列和调度的流量管理器很相似。它看起来像在传输之前的一个临时存储了很大数量报文的缓冲区(入队操作)。当网卡TX请求更多报文去发送的时候,这些报文递交给网卡TX的预定义的SLA的报文选择逻辑模块之后会删除。(出队操作)。分层调度器对大数量的报文队列做了优化。当只需要小数量的队列时,会使用消息传递

2023-02-08 21:32:54 337

原创 DPDK基础知识之:零拷贝技术

“直接”在这里还有另一层语义:其它所有技术中,数据至少需要在内核空间存储一份,但是在 Direct I/O 技术中,数据直接存储在用户空间中,绕过了内核。

2023-02-08 21:04:07 812

原创 dpdk21.11 添加igb_uio模块

meson configure build -Dprefix=/home/qxy/suricata-dpdk/dpdk-stable-21.11.1/x86_64-native-linuxapp-gcc #跟上面RTE变量同步。1.1 复制 dpdk-kmods/linux/igb_uio/ 到 dpdk-stable-21.11.1/kernel/linux/ 目录下。--- 编译添加完成 --- 收工 --- 下班。1.3 创建 igb_uio 模块的编译代码。1.4 添加IGB_UIO的编译使能。

2023-02-08 20:40:46 668

原创 四种常见的Git工作流

有需要的可以点击。与问题跟踪结合在一起。使用功能分支进行开发,而不是直接在master分支上提交代码 (如果你的开发主分支是 master的话,下同)

2023-02-07 21:59:20 345

原创 OVS内核流表查询过程

32位的hash值,变成4个8位,正好是mask_cache_entry[256]大小,相当于一个hash值对应4个桶的位置,有一个匹配就行,这种好处就是减小hash冲突的覆盖,如果4个桶都没有匹配,就找一个的最小的mask_cache_entry->skb_hash,更新这个mask_cache_entry。也可能这个算法就这个样。查找 microflow 缓存:根据数据报文 SKB 的 hash 值,定位到 mask_cache_entry 数组中的某个元素,并得到该元素缓存的掩码数组索引值;

2023-02-07 20:28:47 924

原创 ovs实现VLAN隔离

使用busybox:latest会包含许多默认命令) /bin/bash这是表示载入容器后运行bash 因为docker中必须要保持一个进程的运行,要不然整个容器就会退出。Busybox是一个集成了一百多个最常用Linux命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的Unix工具集。Busybox既包含了一些简单实用的工具,如cat和echo,也包含了一些更大,更复杂的工具,如grep、find、mount以及telnet。添加网口的参数为:网桥名、容器内的新网口名、容器名、新网口的ip地址。

2023-02-07 20:16:01 466

原创 dpdk +vfio 中断关和开

* set up to autoclear timer, and the vectors */ ---------------------------------- 只打开部分。唯一剩下的就是打开硬中断,等待数据包进来。打开硬中断的方式因硬件而异,igb 驱动是在 __igb_open 里调用辅助函数igb_irq_enable 完成的。//某一位是1表示开。ixgbe_configure_msix 操作的是IXGBE_EIAC不是 IXGBE_EIMS_EX寄存器。

2023-02-07 19:59:12 530

原创 磁盘性能测试工具之fio

fio -name=Read_Write_IOPS_Test -group_reporting-direct=1-iodepth=128-rw=randrw -rwmixread=70-refill_buffers-norandommap-randrepeat=0-ioengine=libaio -bs=4k -size=10G -numjobs=1-runtime=600-ioscheduler=noop。随机序列是否可重复,True(1)表示随机序列可重复,False(0)表示随机序列不可重复。

2023-02-07 17:29:02 1287

原创 NVMe性能探究

这里的OP空间也会关联到GC和WL,因为NAND上的数据只要是通电状态下就是在不断的搬移(WL的缘故), OP空间会成为搬移过程中的“中转站”,其次,在我们把NVMe上某个小小的NAND块写坏后,会由软件算法控制将OP空间对应大小的NAND块进行替换,以确保我们正常使用,随着使用时间的增加,OP空间中的坏块逐渐增多,达到一定比例后,NVMe将不可用(不必担心厂家的FW会提前报警)。同时因为随机写入时也会涉及到NAND块上的数据搬移,因此,OP空间变小也会一定程度上导致随机写入性能下降。

2023-02-07 17:14:13 581

原创 Docker的OverlayFS存储驱动

d_type,就是这个数据结构的一个字段,这个字段用来表示文件的类型,是文件,还是管道,还是目录还是套接字等。【文章福利】:免费领取更多C/C++ Linux服务器、技术视频和学习路线图,资料包括(C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)有需要的可以点击793599096加群领取哦~

2023-02-06 22:19:21 391

原创 【SPDK】六、vhost子系统

vhost子系统初始化时,会依次偿试对vhost-scsi、vhost-blk和vhost-nvme进行初始化,如果配置文件中配置了对应类型的设备,那就会完成对应设备的创建并初始化监听socket等待qemu客户端进行连接。vhost子系统在SPDK中属于应用层或叫协议层,为虚拟机提供vhost-blk、vhost-scsi和vhost-nvme三种虚拟设备。/* 完成vhost设备通用部分功能的初始化,并将该vhost设备的backend操作集合设为vhost_blk_device_backend;

2023-02-06 21:52:49 576

原创 【SPDK】五、bdev子系统

SPDK从功能角度将各个独立的部分划分为“**子系统**“。例如对各种后端存储的访问属于bdev子系统,又例如对虚拟机呈现各种设备属于vhost子系统。不同场景下,各种工具可以通过组合不同的子系统来实现各种不同的功能。例如虚拟化场景下,vhost主要集成了bdev、vhost、scsi等子系统。这些子系统存在一定依赖关系,例如vhost子系统依赖bdev,这就需要将被依赖的子系统先初始化完成,才能执行其它子系统的初始化。

2023-02-06 21:48:01 573

原创 【SPDK】四、reactor线程

(2)线程通过_spdk_reactor_start_poller和_spdk_reactor_stop_poller启动和停止poller;/* 从此处开始,各个线程(包括主线程)开始执行_spdk_reactor_run,线程名也正式变更为reactor_X;(1)线程间通过_spdk_reactor_send_msg发送消息,本质是向接收方的event队列中添加事件;表中注册新的映射关系。/* 针对主线程之外的其它核上的线程,通过发送通知使它们开始执行_spdk_reactor_run */

2023-02-06 21:40:20 415

原创 【SPDK】三、IO流程代码解析

bdev_io继续往驱动层递交,它会扩展为适配具体驱动的io对象,例如针对NVMe驱动,bdev_io将扩展成nvme_bdev_io对象。reactor取出响应后,根据其id找到对应的nvme_bdev_io,进一步关联到对应的bdev_io,再调用bdev_io中的记录的回调函数。vhost-blk下发请求时注册的回调函数为blk_request_complete_cb,回调参数为当前的spdk_vhost_blk_task对象。/* iovs数组将来会记录IO请求中数据段的内存映射信息 */

2023-02-06 21:27:21 579

原创 【SPDK】二、IO栈对比与线程模型

另一方面,在吞吐量(IOPS)方面,如果我们给virtio-blk设备配置多队列(确保虚拟机IO压力足够),并在后端NVMe设备不成为瓶颈的前提下,传统NVMe IO栈在单个qemu io线程处理时,最多能达到20万IOPS,而SPDK vhost在单线程处理时可达100万IOPS,传统NVMe IO栈在处理多队列模型时,相比单队列模型,减少了线程间通知开销,一次通知可以处理多个IO请求,因此多队列相比单队列模型会有较大的IOPS提升;同等CPU开销下,吞吐量上有5倍以上的性能提升。IO栈对比与时延分析。

2023-02-06 21:20:45 269

原创 基于Redis的分布式锁实现

Redis的SETNX命令,setnx key value,将key设置为value,当键不存在时,才能成功,若键存在,什么也不做,成功返回1,失败返回0 。 SETNX实际上就是SET IF NOT Exists的缩写

2023-02-06 20:24:51 161

空空如也

空空如也

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

TA关注的人

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