DPVS配置说明

1. dpvs.conf 配置文件说明

本文是对dpvs默认配置文件的解释说明。

  • 在DPVS的配置文件中,<init>表示初始化阶段的配置项,无法重新加载。 如果配置了无效值! 文件,dpvs将使用其默认值。
  • 注释行: 以#或者!。内联范围注释:使用“ <”和“>”,在两者之间添加注释。

1.1. 全局

## 日志级别、日志路径
global_defs { 
    log_level   WARNING
    !log_file    /var/log/dpvs.log
## 是否开启异步模式
    ! log_async_mode    on
}

1.2. 网卡设备

配置网卡的接收、发送队列数,RSS、FDir的模式。
注意:FDir的匹配域不在dpvs配置文件中配置,而是在C文件中,以静态变量的形式配置。

netif_defs {

    <init> pktpool_size     2097151  // 内存池相关
    <init> pktpool_cache    256
    /* 网卡设备 */
    <init> device dpdk0 {  
        rx {
            queue_number        8
            descriptor_number   1024
            rss                 tcp  // 接收队列配置RSS
        }
        tx {
            queue_number        8
            descriptor_number   1024
        }
        fdir { // 配置网卡dpdk0的Fdir
            mode                perfect
            pballoc             64k
            status              matched
        }
    !    promisc_mode
        kni_name                dpdk0.kni
    }
}

1.3. 工作核心

worker_defs {
    <init> worker cpu0 {  
        type    master // master核,管理核
        cpu_id  0
    }
    <init> worker cpu1 {
        type    slave  // slave核,处理业务
        cpu_id  1
        port    dpdk0 { // port即为网卡
            rx_queue_ids     0 // 接收队列号
            tx_queue_ids     0 // 发送队列号
            ! isol_rx_cpu_ids  9  // 表示当前 lcore 专职负责接收数据
            ! isol_rxq_ring_sz 1048576  // 专职接收数据的 ring buffer 大小
        }
        port    dpdk1 {
            rx_queue_ids     0
            tx_queue_ids     0
            ! isol_rx_cpu_ids  9
            ! isol_rxq_ring_sz 1048576
        }
    }
}

1.4. ipv4

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

1.5. ipv6

! dpvs ipv6 config
ipv6_defs {
    disable                     off
    forwarding                  off
    route6 {
        <init> method           hlist
        recycle_time            10
    }
}

1.6. 定时器相关

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

1.7. 邻居子系统

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

neigh_defs {
    <init> unres_queue_length  128
    <init> timeout             60
}

1.8. 控制配置

ctrl_defs {
    lcore_msg {
        <init> ring_size                4096
        <init> multicast_queue_length   256
        sync_msg_timeout_us             2000
    }
    ipc_msg { // 与dpvs同学的unix接口文件
        <init> unix_domain /var/run/dpvs_ctrl
    }
}

1.9. ipvs

! ipvs config
ipvs_defs {
    conn {
        <init> conn_pool_size       2097152
        <init> conn_pool_cache      256
        conn_init_timeout           3
        ! expire_quiescent_template
        ! fast_xmit_close
        ! <init> redirect           off
    }

    udp {
        ! defence_udp_drop
        uoa_mode        opp  // uoa模式,携带client_ip
        uoa_max_trail   3
        timeout {  // 配置 udp 的超时时间
            normal      300
            last        3
        }
    }

    tcp {
        ! defence_tcp_drop
        timeout { // 配置tcp不同状态的超时时间
            none        2
            established 90
            syn_sent    3
            syn_recv    30
            fin_wait    7
            time_wait   7
            close       3
            close_wait  7
            last_ack    7
            listen      120
            synack      30
            last        2
        }
        synproxy {
            synack_options {
                mss             1452
                ttl             63
                sack
                ! wscale
                ! timestamp
            }
            ! defer_rs_syn
            rs_syn_max_retry    3
            ack_storm_thresh    10
            max_ack_saved       3
            conn_reuse_state {
                close
                time_wait
                ! fin_wait
                ! close_wait
                ! last_ack
           }
        }
    }
}

1.10. sa_pool

sa_pool是 socket address (or local <ip, port> pair) pool 的缩写。

对于多核应用程序,流量返回本地启动的连接需要达到原CPU核心。有几个实现目标的方法。一种是用同样的方法计算RSS,NIC选择当前CPU进行连接。dpvs使用的方法是基于Flow Director(fdir),预先为每个CPU核心提供本地源<ip,端口>。并通过fdir将后端通信量重定向到该CPU。

! sa_pool config
sa_pool {
    pool_hash_size   16
}

每个 lcore 有自己的 sa_pool, 用于管理本地分配的 <lip, lport>, 假如当前启用了 64 个 lcore, 一共有 65535-1024 可用端口,那么每个 lcore 在同一个 lip 上最多使用 (65535-1024)/64 个地址。

2. 端口RSS/FDir 配置

端口RSS/FDir 的默认配置在文件dpvs/blob/master/src/netif.c中,

RSS/FDir配置:

static struct rte_eth_conf default_port_conf = {
    .rxmode = {
        .mq_mode        = ETH_MQ_RX_RSS,
        .max_rx_pkt_len = ETHER_MAX_LEN,
        .split_hdr_size = 0,
        .offloads = DEV_RX_OFFLOAD_IPV4_CKSUM,
    },
    /* 接收队列RSS配置 */
    .rx_adv_conf = {
        .rss_conf = {
            .rss_key = NULL,
            .rss_hf  = /*ETH_RSS_IP*/ ETH_RSS_TCP,  // RSS默认使用ETH_RSS_TCP
        },
    },
    .txmode = {
        .mq_mode = ETH_MQ_TX_NONE,
    },
    /* fdir配置 */
    .fdir_conf = {
        .mode    = RTE_FDIR_MODE_PERFECT,
        .pballoc = RTE_FDIR_PBALLOC_64K,
        .status  = RTE_FDIR_REPORT_STATUS/*_ALWAYS*/,
        .mask    = {
            .vlan_tci_mask      = 0x0, // 忽略 vlan id
            .ipv4_mask          = {
                .src_ip         = 0x00000000, // 忽略 src_ip
                .dst_ip         = 0xFFFFFFFF,  // 匹配dst ip
            },
            .ipv6_mask          = {
                .src_ip         = { 0, 0, 0, 0 }, // 忽略 src ipv6
                .dst_ip         = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }, // 匹配 dst ipv6
            },
            .src_port_mask      = 0x0000, // 忽略 src port

            /* to be changed according to slave lcore number in use */
            .dst_port_mask      = 0x00F8, // 1111 1000‬, 非零,根据掩码匹配

            .mac_addr_byte_mask = 0x00,
            .tunnel_type_mask   = 0,
            .tunnel_id_mask     = 0,
        },
        .drop_queue             = 127,
        .flex_conf              = {
            .nb_payloads        = 0,
            .nb_flexmasks       = 0,
        },
    },
};

可见,上述fdir配置中, dpvs根据 dst_ip, dst_port_mask 计算,也就是对应 <lip, lport>, 若 lip 只有一个,所以等同于只看 lport,

原文地址:DPVS配置说明

3. 参考

知识共享许可协议
作品采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。
永久连接: http://www.nfvschool.cn/?p=729 , 浏览次数: 194 次浏览
标签: