dpvs學(xué)習(xí)筆記: 16 網(wǎng)卡綁定 mode 4 問(wèn)題

背景

參考 dpdk 官方 bonding pmd 文檔旋讹,mode 0 是輪循砾跃,mode 1 是鏡像矫户,我司線上使用的 mode 4 是 802.3AD 協(xié)義,使用特定層面 hash 算法來(lái)分配流量磅叛。

bond mode 4

使用 mode 4 比較特別屑咳,要求

  1. It needs to call rte_eth_tx_burst and rte_eth_rx_burst with intervals period of less than 100ms.
  2. Calls to rte_eth_tx_burst must have a buffer size of at least 2xN, where N is the number of slaves. This is a space required for LACP frames. Additionally LACP packets are included in the statistics, but they are not returned to the application.

dpvs bond 問(wèn)題

最初搭建 fullnat 時(shí)想用網(wǎng)卡 bonding, 由于線上都是 mode 4, 不給網(wǎng)絡(luò)組同學(xué)添麻煩,最好保持一致弊琴。但是 dpvs 程序啟動(dòng)后兆龙,初始化報(bào) warning,并且交換機(jī)也看到 bonding 失敗敲董。具體報(bào)錯(cuò)消息如下:

PMD: Slave 1: failed to enqueue LACP packet into RX ring.
Receive and transmit functions must be invoked on bonded
interface at least 10 times per second or LACP will not
work correctly

將 DPDK 編繹成 DEBUG 模式紫皇,打開 bond debug 開關(guān)。dpvs 也全部打開 DEBUG, 查看日志輸出:

PMD:    625 [Port 0: rx_machine] LACP -> CURRENT
PMD: LACP: {
  subtype= 01
  ver_num=01
  actor={ tlv=01, len=14
    pri=0080, system=B4:43:26:57:15:01, key=410E, p_pri=0080 p_num=5E00
       state={ ACT AGG DEF }
  }
  partner={ tlv=02, len=14
    pri=0000, system=00:00:00:00:00:00, key=0000, p_pri=0000 p_num=0000
       state={ ACT AGG DEF EXP }
  }
  collector={info=03, length=10, max_delay=0000
, type_term=00, terminator_length = 00}
PMD:    625 [Port 0: tx_machine] Sending LACP frame
PMD: LACP: {
  subtype= 01
  ver_num=01
  actor={ tlv=01, len=14
    pri=FFFF, system=6C:92:BF:47:B2:66, key=2100, p_pri=FF00 p_num=0100
       state={ ACT AGG }
  }
  partner={ tlv=02, len=14
    pri=0080, system=B4:43:26:57:15:01, key=410E, p_pri=0080 p_num=5E00
       state={ ACT AGG DEF }
  }
  collector={info=03, length=10, max_delay=0000
, type_term=00, terminator_length = 00}

結(jié)合 dpdk 源代碼解讀腋寨,rx_machine 是收取交換機(jī)發(fā)來(lái)的協(xié)義消息聪铺,成功接收,看到交換機(jī)的 mac 地址 B4:43:26:57:15:01萄窜,dpdk 根據(jù) mode 4 協(xié)義發(fā)送 lacp 回包计寇,內(nèi)容和接收的相反,bond 網(wǎng)卡 mac 是 6C:92:BF:47:B2:66脂倦,結(jié)合最后報(bào)錯(cuò) failed to enqueue LACP packet into RX ring, 可以定性是 tx_ring 隊(duì)列一直沒(méi)消費(fèi)番宁,dpvs 沒(méi)有發(fā)送 lacp 回包給交換機(jī)。

dpvs 發(fā)包邏輯

dpvs發(fā)包都在大 loop 里赖阻,是個(gè)死循環(huán)蝶押,發(fā)送函數(shù)是 lcore_job_xmit

static void lcore_job_xmit(void *args)
{
    int i, j;
    lcoreid_t cid;
    portid_t pid;
    struct netif_queue_conf *qconf;

    cid = rte_lcore_id();
    for (i = 0; i < lcore_conf[lcore2index[cid]].nports; i++) {
        pid = lcore_conf[lcore2index[cid]].pqs[i].id;

        for (j = 0; j < lcore_conf[lcore2index[cid]].pqs[i].ntxq; j++) {
            qconf = &lcore_conf[lcore2index[cid]].pqs[i].txqs[j];
            if (qconf->len <= 0)
                continue;
            netif_tx_burst(cid, pid, j);
            qconf->len = 0;
        }
    }
}
static inline void netif_tx_burst(lcoreid_t cid, portid_t pid, queueid_t qindex)
{
    int ntx, ii;
    struct netif_queue_conf *txq;
    unsigned i = 0;
    struct rte_mbuf *mbuf_copied = NULL;
    struct netif_port *dev = NULL;

    assert(LCORE_ID_ANY != cid);
    txq = &lcore_conf[lcore2index[cid]].pqs[port2index[cid][pid]].txqs[qindex];
    if (0 == txq->len)
        return;
    dev = netif_port_get(pid);
   ......
    ntx = rte_eth_tx_burst(pid, txq->id, txq->mbufs, txq->len);
    lcore_stats[cid].opackets += ntx;
    /* do not calculate obytes here in consideration of efficency */
    if (unlikely(ntx < txq->len)) {
        RTE_LOG(DEBUG, NETIF, "Fail to send %d packets on dpdk%d tx%d\n", ntx,pid, txq->id);
        lcore_stats[cid].dropped += txq->len - ntx;
        for (ii = ntx; ii < txq->len; ii++)
            rte_pktmbuf_free(txq->mbufs[ii]);
    }
}

基本邏輯,就是判斷 qconf->len 發(fā)包隊(duì)列長(zhǎng)度火欧,如果大于 0棋电,表示有數(shù)據(jù)需要發(fā)送。最終調(diào)用 dpdk 庫(kù)函數(shù) rte_eth_tx_burst 完成最終發(fā)送邏輯苇侵。

但是這個(gè) qconf 隊(duì)列和 lacp tx_ring 有什么關(guān)系呢赶盔?完全沒(méi)有關(guān)系...

dpdk lacp 發(fā)包邏輯

首先,每個(gè)物理網(wǎng)卡都是一個(gè) rte_eth_dev, 而 bonding 的網(wǎng)卡是 rte_vdev_device, 需要調(diào)用 bond_alloc 初始化榆浓,最重要有兩個(gè)函數(shù) bond_mode_8023ad_setupbond_ethdev_mode_set

bond_mode_8023ad_setup 會(huì)設(shè)置一個(gè)定時(shí)器于未,每 100ms 調(diào)用一次 bond_mode_8023ad_periodic_cb 函數(shù),這個(gè)就是用來(lái)協(xié)商 lacp 的陡鹃。rx_machine_update 接收 rx_ring 數(shù)據(jù)烘浦,tx_machine 封裝好本機(jī) lacp 后發(fā)送到 tx_ring. bond_ethdev_mode_set 最重要的是調(diào)置 rx_burst 和 tx_burst 回調(diào)函數(shù)

eth_dev->rx_pkt_burst = bond_ethdev_rx_burst_8023ad;
eth_dev->tx_pkt_burst = bond_ethdev_tx_burst_8023ad;

非 bonding 的普通網(wǎng)卡,tx_pkt_burst萍鲸,rx_pkt_burst 都是 ixgbe 的闷叉。

bond_ethdev_tx_burst_8023ad 代碼比較長(zhǎng)不貼了,原理就是在業(yè)務(wù)正常調(diào)用 rte_eth_tx_burst 時(shí)脊阴,順便把 lacp tx_ring 的數(shù)據(jù)發(fā)送到網(wǎng)卡握侧。

問(wèn)題所在

結(jié)合兩個(gè)發(fā)包邏輯可以明確,dpvs 屬于業(yè)務(wù)層嘿期,qconf 的緩存里有數(shù)據(jù)才發(fā)送品擎,而 lcap 的數(shù)據(jù)是存儲(chǔ)在 dpdk 底層的 tx_ring 中,當(dāng) bond 網(wǎng)卡剛被 dpvs up 起來(lái)時(shí)秽五,業(yè)務(wù)層是沒(méi)有數(shù)據(jù)的孽查,也就不會(huì)調(diào)用 rte_eth_tx_burst 順便把 lacp 發(fā)送給交換機(jī)。

解決方案坦喘?

最簡(jiǎn)單的就是修改 lcore_job_xmit 代碼盲再,去掉所有隊(duì)列長(zhǎng)度判斷的邏輯,這樣就會(huì)一直調(diào)用底層 rte_eth_tx_burst. 測(cè)試一下瓣铣,bond 成功答朋。但是性能肯定會(huì)受影響,希望 dpvs 開發(fā)團(tuán)隊(duì)能 fix 一下棠笑。

想到的另外一個(gè)方案梦碗,就是注冊(cè)一個(gè) slow 類型的 job,專職用于刷新 lacp, 我去掉個(gè) pr 吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洪规,一起剝皮案震驚了整個(gè)濱河市印屁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斩例,老刑警劉巖雄人,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異念赶,居然都是意外死亡础钠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門叉谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旗吁,“玉大人,你說(shuō)我怎么就攤上這事停局『艿觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵翻具,是天一觀的道長(zhǎng)履怯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)裆泳,這世上最難降的妖魔是什么叹洲? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮工禾,結(jié)果婚禮上运提,老公的妹妹穿的比我還像新娘。我一直安慰自己闻葵,他們只是感情好民泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槽畔,像睡著了一般栈妆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厢钧,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天鳞尔,我揣著相機(jī)與錄音,去河邊找鬼早直。 笑死寥假,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霞扬。 我是一名探鬼主播糕韧,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼枫振,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萤彩?” 一聲冷哼從身側(cè)響起粪滤,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乒疏,沒(méi)想到半個(gè)月后额衙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怕吴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了县踢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片转绷。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硼啤,靈堂內(nèi)的尸體忽然破棺而出议经,到底是詐尸還是另有隱情,我是刑警寧澤谴返,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布煞肾,位于F島的核電站,受9級(jí)特大地震影響嗓袱,放射性物質(zhì)發(fā)生泄漏籍救。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一渠抹、第九天 我趴在偏房一處隱蔽的房頂上張望蝙昙。 院中可真熱鬧,春花似錦梧却、人聲如沸奇颠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烈拒。三九已至,卻和暖如春广鳍,著一層夾襖步出監(jiān)牢的瞬間荆几,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工搜锰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伴郁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓蛋叼,卻偏偏與公主長(zhǎng)得像焊傅,于是被迫代替她去往敵國(guó)和親剂陡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 10.鏈路綁定PMD 除了用于物理和虛擬硬件的輪詢模式驅(qū)動(dòng)程序(PMD)之外狐胎,DPDK還包括一個(gè)純軟件庫(kù)鸭栖,可將多個(gè)...
    半天妖閱讀 8,260評(píng)論 0 5
  • 7.輪詢模式驅(qū)動(dòng) DPDK包括1Gigabit、10Gigabit 及 40Gigabit 和半虛擬化IO的輪詢模...
    半天妖閱讀 5,471評(píng)論 0 4
  • 1. 簡(jiǎn)介 本文檔包含DPDK軟件安裝和配置的相關(guān)說(shuō)明握巢。旨在幫助用戶快速啟動(dòng)和運(yùn)行軟件晕鹊。文檔主要描述了在Linux...
    半天妖閱讀 17,929評(píng)論 0 22
  • 這篇博客先介紹在dpdk中使用到的一些優(yōu)化點(diǎn)[后期如果遇到其他的會(huì)完善],然后是NUMA架構(gòu)暴浦,看了官方說(shuō)明溅话,對(duì)于1...
    fooboo閱讀 8,134評(píng)論 0 5
  • 前兩天學(xué)習(xí)了五大數(shù)字力的第五個(gè)模塊:償債能力独撇,里面包括兩個(gè)指標(biāo):流動(dòng)比率和速動(dòng)比率屑墨。今天對(duì)這兩個(gè)指標(biāo)進(jìn)行小結(jié)。 1...
    verolai閱讀 232評(píng)論 0 0