自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dpdk虚机前后端连接建立(dpdk侧)

概述使用ovs+dpdk模式的kvm虚机,在ovs上会创建一个vhostuser类型的口,vhostuser通过unix socket方式与qemu建立前后端通信机制,其中vhostuser分为server类型和clinet类型,当vhostuser为clinet时,vhotuser主动跟qemu建立连接,因此当ovs重启的时候,可保证虚机自动重连。本文主要描述dpdk侧vhostuser与qemu之间unix socket连接建立过程。rte_vhost_driver_register当ovs

2020-12-15 12:04:16 858 1

原创 TCP bbr简介

1、背景现有的拥塞控制算法,如cubic,基于丢包检查,问题1)、网络设备buffer大,导致bufferbloat只要不丢包,就会发送,这样就容易把网络设备的buffer填充满,导致延时增加;2)、网络设备buffer小,容易丢包,拥塞算法根据丢包控制发包速率,导致整体带宽吞吐小;2、BBR四个阶段流程start up进入start up有两个时机:1)、初始化bbr_init,先将bbr->mode初始化成BBR_STARTUP;static void bbr

2020-12-14 17:06:31 2554

原创 ovs、dpdk下虚机接收流程图

1、ovs内核态,虚机数据接收流程2、ovs+dpdk下虚机数据接收流程

2020-12-14 16:19:06 775

原创 Linux tcp tsq

1、背景TCP发送的数据经过IP层添加IP包头后,会被发送到IP数据栈和网卡之间的队列中,当网卡能够发送数据时会到这个队列中去取skb。当TCP发送数据过快时,或一个带宽很大或者包速率很大的非TCP数据流会把队列里的所有空间占满,造成数据包丢失和延时的问题。更糟的是,这样很可能会使另一个缓存产生,进而产生一个静止队列(standing queue),造成更严重的延时并使TCP的RTT和拥塞窗口的计算出现问题。Linux3.6.0出现后,Linux内核增加了TCP小队列(TCP Small Queu

2020-12-14 14:39:49 419

原创 Linux free显示内存计算

free源码库:procps1、介绍 本文主要介绍Linux环境下free工具显示的used内存数据计算方式;2、计算方法从以上free的源码里看出,used内存的计算公式为:mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;其中:kb_main_cached = kb_page_cache + kb_slab_reclaimable;kb_main_buffers= Buffe..

2020-12-06 11:05:42 992

原创 Linux tcp fast open

背景正常的一个tcp连接都需要先完成三次握手才可以发送数据,但存在很多应用,可能会间隔的重复使用同一个tcp流连接发送数据,但服务器这边由于tcp连接超时会将旧的连接信息删除,这样应用每次使用改tcp连接时,服务器都需要重新完成三次握手才能发数据,发送效率低下,fast open就是用来解决这种重复使用旧连接的问题,当开启fast open后,应用程序可以在第一个sync报文里携带用户数据,减少了不必要的三次握手。连接首次建立客户端流程使能方法:echo 1 >/proc/sys/

2020-12-05 21:12:14 790

原创 Linux systetmtap使用

1、安装kernel debug包,(kernel-debuginfo、 kernel-debuginfo-common、kernel-devel http://debuginfo.centos.org/7/x86_64/)2、安装systemtap yum install systemtap3、检查systemtap是否安装成功 stap -ve 'probe kernel.function("do_fork") { print("hello world\n") exit() }' ...

2020-11-29 19:13:17 408

原创 crash使用

1、安装kdump、crash2、安装kernel-debuginfo-3.10.0-327.28.3.el7.x86_64.rpm、kernel-debuginfo-common-x86_64-3.10.0-327.28.3.el7.x86_64.rpm(版本与使用系统内核一致)3、vim /etc/kdump.conf 修改path /var/crash设置core存放目录;4、crash /usr/lib/debug/lib/modules/3.10.0-327.28.3.el7.x86.

2020-11-29 19:09:25 905

原创 ovs dpdk部署

cmdline开启iommudpdk:cd /usr/src/wget http://fast.dpdk.org/rel/dpdk-18.11.1.tar.xztar xf dpdk-18.11.1.tar.xzexport DPDK_TARGET=x86_64-native-linuxapp-gccmake install T=$DPDK_TARGET DESTDIR=installexport DPDK_BUILD=/usr/src/dpdk-18.11.1/x86_64-nat

2020-11-29 19:05:01 840

原创 Linux tcp 慢启动重启

背景在Linux内核实现了,tcp发送端在连接建立开始时,会通过慢启动流程来避免一次性发送太多的数据到网络,引起网络拥塞丢包,如果tcp连接建立好了之后,发送端正常发送数据,并且已经完成慢启动流程了,这时候发送端没有数据发送,进入idle空闲期,然后过了一段时间才继续发送,因为当前的tcp拥塞状态已经不处于慢启动阶段了,可能拥塞窗口值是比较大的,但是现在的网络环境可能也已经发生变化了,如果按当前的拥塞窗口直接发送数据,有可能会造成拥塞丢包,因此内核提供了sysctl_tcp_slow_start_aft

2020-11-29 18:12:00 745

原创 Linux tcp拥塞控制

1、滑动窗口滑动窗口是发送方根据接收方的接收窗口来控制发送速率的手段,接收发的滑动窗口可分成以下四个部分,最左边的紫色表示发送方已发送并且接收发已经确认的序列号,蓝色部分表示发送方已经发送但接收方还未确认的序列号,绿色部门表示发送方可发送但未发送的序列号(也表示接收方通知的接收窗口),蓝色和绿色两部分之和即为接收端通知的接收窗口,对应发送端的snd_wnd字段,最右边表示发送方不能发送的序列号。紫色区域最右边的值对应tcp的snd_una,蓝色最左侧对应tcp的snd_next;在数据包传输过程中,sn

2020-11-27 22:20:18 1537

原创 Linux tcp xmit 定时器

在tcp socket初始化的时候,会初始化设置三个定时器,isck_retransmit_timer、isck_delack_timer、sk_timer,本文主要描述下这三种tcp定时器。void inet_csk_init_xmit_timers(struct sock *sk, void (*retransmit_handler)(unsigned long), void (*delack_handler)(unsigned long),

2020-11-27 21:15:34 807

原创 ovs vlan tag管理

1、背景当使用ovs管理虚机的网络时,ovs会为虚机的tap设备添加一个内部的vlan tag,如下图所示,存在两个bridge,br0-ovs、br-int,其中br0-ovs挂载物理网卡设备eth2,br-int挂载虚机tatp设备,br0-ovs与br-int之间通过一对patch口连接,ovs为tap设备分配了内部vlan 2和内部vlan 3,本文主要描述ovs是如何完成这些内部vlan与外部vlan的转换。2、流表规则首先看一下br-int的流表规则,可以看到从int-br0-o

2020-11-13 22:37:47 2457

原创 ovs upcall处理流程

当ovs收到一条连接的第一个包时,由于datapatch没有缓存流表信息,因此需要upcall到用户态,根据用户态流表规则,生成一条缓存流表,然后将缓存流表提交到datapath,后续改连接的消息包就可以直接根据datapath的缓存流表直接完成转发,本文主要描述内核态ovs的upcall的整体处理过程。ovs_vport_receive内核datapath收到一个消息包时,进入ovs_vport_receive处理,首先将skb流的关键信息填充到key里,然后根据key通过ovs_dp_proce

2020-10-31 14:37:14 2194 1

原创 socket的sk_wmem_alloc

在socket的结构体里有一个sk_wmem_alloc字段,该字段表示已经提交到ip层,但还没有从本机发送出去的skb占用空间大小。分配时机 当tcp层封装好skb数据后,会调用tcp_transmit_skb,在该函数会根据skb的长度相应增加sk_wmem_alloc的值,然后发送给ip层。static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, gfp_t ...

2020-10-08 18:10:46 799

原创 rprobe、kretprobe使用例子

背景: Linux协议栈处理发送流程时,在发送驱动函数前会通过__netdev_pick_tx选择一个发送队列,当选择好一个发送队列后,协议栈会将其设置到sk->sk_tx_queue_mapping,这样后续的发送流程就不需要再去选择。static u16 __netdev_pick_tx(struct net_device *dev, struct sk_buff *skb){ struct sock *sk = skb->sk; int queue_index = s..

2020-10-06 22:19:05 568

原创 TCP四次挥手过程分析

1、tcp四次挥手过程状态迁移如下所示:1)、客户端通过close系统调用向服务端发起第一次挥手请求,此时客户端将自己状态置为TCP_FIN_WAIT1状态;2)、服务端收到fin请求后,将状态置为TCP_CLOSE_WAIT,并设置延时ack,然后通知服务端应用程序;3)、服务端应用程序通过close系统调用向客户端发起fin请求,同时回复之前客户端fin的ack,此时服务端将状态置为TCP_LAST_ACK状态;4)、客户端收到fin+ack后,先将状态迁移至TCP_FIN_WAIT2,

2020-09-19 16:38:26 1200

原创 Linux tcp sack_reneging分析

sack_reneging表示发送端之前收到的sack为虚假sack,也就是说发送端之前标记的sack,可能又被接收端丢弃了。 接收端收到乱序包后会先存放在out_of_order_queue队列里,然后等后续每次收到正常数据包后再检查乱序队列里是否有可以合并到sk_receive_queue的乱序包,当socket接收队列分配的内存(sk_rmem_alloc)超出设定的阈值(rmem_default)时,tcp会将乱序队列的数据包清空,这种场景下就需要发送端再次重传已经sack过的数据...

2020-08-29 22:38:04 660

原创 Linux TCP之sack(二)

上一章主要描述了sack协商过程以及接收端接收到乱序数据包后回复sack的过程,本章主要描述发送端在收到接收端回复的sack信息后的处理流程。

2020-08-29 17:03:42 693

原创 Linux TCP之sack(一)

SACK是接收方用来向发送方通知已经接收到哪些序列号段的一种机制,这样发送方在重传时就只需要重传接收方真正未收到的部分即可。初始化 sack提供了proc接口用来控制是否支持sack能力(/proc/sys/net/ipv4/tcp_sack),该选项默认为1,是能sack能力。 1)、发送端发送sync报文时,判断本地是否开启sack选项,如果开启,则options选项置上SACK_ADVERTISE标志 if (likely(sysctl_tcp_sack)) {...

2020-08-24 19:29:16 1242

原创 Linux GRO流程分析

1、概述GRO是针对报文接收方向的,是指设备链路层在接收报文处理的时候,将多个小包合并成一个大包一起上送协议栈,减少数据包在协议栈间交互的机制。可以通过ethtool -K eth0 gro on/off来打开或关闭GRO功能,GRO虽然可以提升吞吐,但同时也会带来一定是时延增加。...

2020-06-29 19:31:30 3107

原创 Linux NAPI机制分析

1、概述在NAPI之前,网卡每收到一个包就会触发一个中断通知cpu读取数据包,当数据包比较多时,中断数过多势必影响cpu性能,因此Linux引入NAPI机制,NAPI就是在收到中断后,先将网卡收包模式切换成poll模式,等收包完成后重新进入中断模式,本节主要分析Linux的NAPI实现机制。NAPI的主要流程如下图,物理网卡收到包后触发irq中断通知cpu(触发中断后,默认disable该中断),中断上半部处理里将网卡设备的napi->poll_list加入到softnet_data->

2020-06-25 10:40:14 4657

原创 Linux TSO流程分析

1、TSO(transimit segment offload)是针对tcp而言的,是指协议栈可以将tcp 分段的操作offload到硬件的能力,本身需要硬件的支持。当网卡具有TSO能力时,上层协议栈可以直接下发一个超过MTU数据包,而把数据包拆分的动作交给硬件去做,节省cpu资源。除了TSO,内核还有一个GSO,GSO不区分协议类型,GSO默认是开启的,GSO是在软件上实现的一种延迟分段的技术,相比TSO,GSO最终还是需要协议栈自己完成分段的处理。即使网卡没有TSO能力,传输层依然可以封装一个超过M

2020-06-20 12:27:48 3715 1

原创 Linux epoll机制

1、epoll是通过创建一个代理线程去监听多个socket fd的I/O多路复用方案,主要的使用方法如下: #define MAX_EVENTS 10 struct epoll_event ev, events[MAX_EVENTS]; int listen_sock, conn_sock, nfds, epollfd; //创建一个server端的socket对象,并处于listen状态 /

2020-06-13 22:28:46 475

原创 一个ixgbe空指针访问导致宿主机宕机的未知问题

1、在某个机器上出现机器宕机,通过kdump日志,初步看是因为ixgbe里有控制针访问2、使用crash分析空指针访问原因1)、安装kernel debug包(包含debug调试信息的vmlinux);2)、使用crash打开vmcore(crash /usr/lib/debug/usr/lib/modules/3.10.0-327/vmlinux /home/vmcore),先用dis命令看下RIP地址的汇编信息;从汇编指令看此时正在访问rbx寄存器;3)、从bt里看下现场信息..

2020-05-17 16:47:03 755

原创 Linux tcp之sync cookie

1、常规的tcp连接里,server在收到client的sync报文后就会分配request_sock,并将其放到半连接队列里;如果server受到恶意攻击,攻击方不断的发sync包,发完就退出,这样server端的半连接队列很快就会被填满,导致无法进行正常的tcp sync请求,这也是常见的sync flood攻击。针对这种问题,新增了sync cookie功能,为了支持该功能,内核新增了一个tcp_syncookies参数,先看下内核文档对该参数的描述:tcp_syncookies - BOO

2020-05-17 10:58:26 2125 1

原创 Linux tcp连接状态之SYNC_RECV

1、按tcp/ip协议的描述,tcp三次握手过程,tcp的状态迁移如下所示:1)、客户端通过connect系统调用向处于LISTEN状态的服务端发送sync请求,客户端进入SYNC_SEND状态;2)、服务端收到sync报文后,向客户端发送sync+ack报文,服务端进入SYNC_RECV状态;3)、客户端收到sync+ack后,进入ESTABLISHED状态,并向服务端发送ack,服务端接收到ack后,进入ESTABLISHED状态。 (sys_connect)

2020-05-17 10:41:36 4389

原创 kvm中断虚拟化

1、x86平台主要使用的中断类型有pic、apic及msi中断,在多核系统下的apic结构图如下所示,每个cpu有一个lapic,外部中断通过ioapic转发到lapic,如果是msi中断,则绕过了io apic直接发给lapic。2、kvm初始化过程为每个虚拟机维护一个pic主控制器、一个pic备控制器以及一个ioapic控制器,每个vcpu维护一个lapic控制器。同时每个虚拟机有一张...

2020-04-11 20:20:38 1765

原创 IOMMU之Interrupt Posting

Interrupt Posting是在Interrupt Remapping的基础上进一步提升了直通设备的中断处理效率,使用Posting模式时,vcpu可以直接在non-root模式下处理中断而不会被vm-exit到宿主机。1、为了支持中断Posting,每个vcpu数据结构新增了一个Posted-Interrupt Descriptor结构体,该结构体主要保存post的部分信息。st...

2020-04-11 00:02:15 1748

原创 IOMMU之Interrupt Remapping

1、原理介绍在使用设备直通虚拟机的场景下,外设中断无法直接发送到Guest,使用iommu,可以改变虚拟机外设中断的投递方式。以msi中断为例,msi msg里不再需要填写相关的中断信息,而是转换成interrput index的方式。中断的管理信息(投递方式、目标cpu信息、vector信息)存放在一个叫irte的内存区域里,每个iommu最多可以有64k个irte,iommu通过inter...

2020-04-04 17:03:11 3221

原创 dpdk添加设备基本流程

本文主要以ixgbe设备为例,说明向dpdk添加一个ixgbe设备的大致过程。1、使用dpdk的程序(如ovs)调用rte_dev_probe向dpdk注册一个设备,rte_dev_probe的核心处理函数为local_dev_probe,这个函数主要包含了设备总线的匹配,pci设备的bar空间映射,以及最终为设备添加ixgbe驱动。下面看一下这个函数intlocal_dev_...

2020-03-28 17:27:51 2343

原创 ovs+dpdk场景下的tx checksum offload

一、checksum:tcp checksum包括三部分:1)、伪头部校验和; 伪头部包括: 源ip 、宿ip、 协议号、tcp 长度,主要用于校验是正确的目的机器接收到数据包2)、tcp头部校验和;3)、数据部分校验和;当硬件有checksum offload能力时,可以通过ethtook -K tx on/off设置是否将checksum offload到硬件处理;如果将c...

2020-03-13 23:07:04 2530

原创 softnet_stat参数含义

[root@~]# cat /proc/net/softnet_stat00b231b3 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000b0375e 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ...

2020-02-19 13:00:45 4961

原创 snat分析

1、target注册net/netfilter/xt_nat.cstatic struct xt_target xt_nat_target_reg[] __read_mostly = { { .name = "SNAT", .revision = 0, .checkentry = xt_nat_checken...

2020-02-09 19:20:40 638

原创 协议发送流程

tcp_sendmsg tcp_write_xmit tcp_mtu_probe(palyload checksum) tcp_transmit_skb ip_queue_xmit __sk_dst_check ipv4_dst_c...

2020-02-09 19:12:22 649

原创 ixgbevf驱动

ixgbevf主要数据结构 1)struct ixgbevf_adapter 描述一个vf设备对象,主要包括qvetor、tx_ring、rx_ring以及记录io地址空间、netdev等信息;struct ixgbevf_adapter { struct ixgbevf_q_vector *q_vector[MAX_MSIX_Q_VE...

2019-12-03 18:24:12 1336

原创 ovs+dpdk,前后端feature协商过程

1、qemu与vhost_user建立sock通信vhost_user_start (qemu) vhost_dev_init vhost_user_get_features (VHOST_USER_GET_FEATURES) vhost_user_get_features(获取dpdk端的feature) rte_...

2019-07-29 18:33:36 634

原创 ovs内核转发流程

虚拟机使用ovs场景下,流量从物理网卡转发到tap设备过程:__netif_receive_skb __netif_receive_skb_core rx_handler() (ovs场景下,通过netdev_rx_handler_register将rx_handler注册为netdev_frame_hook) netdev_frame_ho...

2019-07-29 18:26:42 1248

原创 vhost源码分析

1、概述 vhost的大致原理就是qemu在Guest、Host之间创建一些共享buffer,Guest作为生产者往buffer填充可用描述符信息,Host作为消费者从可用描述符里消费buffer。Host消费完buffer后再通知Guest回收描述符; 本文主要基于3.10版本kernel,分析了vhost的报文收发过程。2、vringGuest、Host...

2019-04-28 12:31:00 2981

原创 KVM虚拟机,使用linux bridge配置vlan隔离

利用linux bridge + vlan方式配置KVM虚拟机的vlan,如下图所示:配置过程:1、安装vconfig工具;2、增加vlan子接口:     vconfig add eth1 100;     vconfig add eth1 200;3、增加vlan子接口对应的bridge设备,配置br100的IP为172.20.100.1,配置br200的IP为172.20.200.1:   ...

2018-06-28 18:40:30 5916

空空如也

空空如也

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

TA关注的人

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