dpvs源代码分析——简介

在开始之前,我们先明确几个问题

一、dpvs是什么?

DPVS是基于DPDK的高性能第4层负载均衡器。基于阿里巴巴/ LVS修改而来,出于蓝而胜于蓝。

二、dpvs的优势是什么

为了达到高性能,使用了多种不同技术

  • 绕过内核(在用户空间实现)
  • 每个cpu的关键数据无共享(无锁)
  • RX控制和CPU亲合性绑定(避免上下文切换)
  • 批处理TX / RX
  • 零拷贝技术(避免数据包拷贝和系统调用)。
  • 轮询替换中断。
  • 高性能ICP的无锁信息。
  • 其他技术由DPDK加强

DPVS的主要特点包括:

L4负载均衡器,包括FNAT,DR模式等

不同的调度算法,如RR、WLC、WRR等

用户态轻量级IP网络栈栈(IPv4,路由,ARP,ICMP …)。

SNAT模式,用于从内部网络访问Internet。

针对不同IDC环境,支持KNI,VLAN,Bonding。

安全方面,支持TCP syn-proxy,Conn-Limit,黑名单。

QoS:流量控制

三、dpvs主要模块介绍

DPVS功能模块如下图所示:

dpvs源代码分析——简介_第1张图片

 3.1 Control plane控制层

dpvs项目中keepalive,ipvsadm,dpip这些都是从lvs抄过来的,功能是一样的

keepalive:dpvs能够做负载均衡,但是不能做服务器健康检查,如果一台RS服务器挂了,dpvs仍然会将请求转发给有故障的服务器,导致请求无效性。keepalive做健康检查,在提升dpvs系统可用性的同时,避免dpvs单点故障。

ipvsadm:是DPVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置

dpip:用户设置RS ip,VIP,和相关的路由表的程序

具体指令和参数可以参照下面的链接

https://blog.csdn.net/l1902090/article/details/25660393

对应的源代码存储在tools文件夹下,如图所示

dpvs源代码分析——简介_第2张图片

3.2 Load Balancer负载均衡器

位于src/ipvs文件夹中

dpvs源代码分析——简介_第3张图片

3.3 轻量级IP网络栈

主要是进行ip,arp,icmp,inetaddr和路由转发的解析。

3.4 Net Devices网络设备

bonding设备,VLAN,KNI,TC流量控制,hw地址列表。

3.5 辅助功能组件

config:配置文件,对应cfgfile.c

stats:统计信息,对应netif.c

msg:无锁的结构体

sa-pool:待研究

timer:定时器

3.6 配置文件解析

1)global_defs 全局配置模块:日志级别,路径等等

global_defs {
    log_level   WARNING
!    log_file    /var/log/dpvs.log
}

2.netif_defs网卡收发数据包相关配置

netif_defs {
     pktpool_size     2097151
     pktpool_cache    256
     device dpdk0 {
        rx {
            queue_number        8
            descriptor_number   1024
            rss                 tcp
        }
        tx {
            queue_number        8
            descriptor_number   1024
        }
    !    promisc_mode
        kni_name                dpdk0.kni
    }
}

pktpool 是内存池相关的,pktpool_size数据包内存池的个数,pktpool_cache数据包内存池的缓冲

device 就是定义的网卡设备,由于 dpdk 程序会将网卡劫持,所以流量不会经过内核,如果 ssh 想使用网卡,就需要额外配置 kni口dpdk 不感兴趣的流量会透传到内核。tx, rx 是网卡硬件队列个数配置,kni名称配置的dpdk0.kni

3.worker_defs 工作核心

dpvs源代码分析——简介_第4张图片

dpdk 程序将 cpu 称为 lcore,即逻辑核。分为 master, slave 两种类型,

一般 master 做管理相关的,slave cpu 是真正处理业务的核,每个 lcore 可以负责多个网卡的多个队列.

dpdk 中将网卡叫做 port.

rx_queue_idstx_queue_ids 分别是接收和发送队列号。

其中 isol_rx_cpu_ids 表示当前 lcore 专职负责接收数据,isol_rxq_ring_sz 专职接收数据的 ring buffer 大小。

4.timer_defs 定时器相关

timer_defs {
    # cpu job loops to schedule dpdk timer management
    schedule_interval    500
}

5.neight_defs 邻居子系统

neigh_defs {
     unres_queue_length  128
     timeout             60
}

由于自己实现 tcp 协义,那邻居子系统和路由系统肯定也要实现,只不过比较精简专用,邻居子系统还是要看看的。

6.ipv4_defs相关的定义

ipv4_defs {
     ipv4_forward off ! set this to on, dpvs will forward packets that NOT hit rules directly
     default_ttl         64
    fragment {
         bucket_number   4096
         bucket_entries  16
         max_entries     4096
         ttl             1
    }
}

 

参考连接

https://www.jianshu.com/p/d8ee301f9122

下一篇博客,将从主函数main入口开始分析,一步步带各位小伙伴探究dpvs的工作原理。

你可能感兴趣的:(玩转Linux编程,职场生涯)