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配置說明