DPDK 之 Symmetric Receive-side Scaling

DPDK 之 Symmetric Receive-side Scaling

上篇介紹到RSS HASH默認RK是一個非對稱KEY,也就是同一條數據流收、發這兩個方向的數據包的RSS HASH值是不同的。在IDS/DPI等流量分析應用場景中,同一條流數據由非對稱HASH計算將分流到不同的CPU,這樣極大的增加了應用負擔,降低了處理能力。爲了解決這個問題,有人提出了修改(RSSRK),將其改爲重複的16個bits,來獲取對稱的結果。具體詳情可查閱Scalable TCP Session Monitoring with Symmetric Receive-side Scaling此篇論文,這裏不再詳述。

對稱RK爲以下320 bits數據,將其寫入網卡RSSRK寄存器(82599)即可:

0x6d5a 0x6d5a 0x6d5a 0x6d5a
0x6d5a 0x6d5a 0x6d5a 0x6d5a
0x6d5a 0x6d5a 0x6d5a 0x6d5a
0x6d5a 0x6d5a 0x6d5a 0x6d5a
0x6d5a 0x6d5a 0x6d5a 0x6d5a

DPDK 可通過 API rte_eth_dev_rss_hash_update 動態修改當前網卡 RSS HASH KEY, 具體可參考testpmdport_rss_hash_key_updatecmd_config_rss_parsed 詳細實現:

void
port_rss_hash_key_update(portid_t port_id, char rss_type[], uint8_t *hash_key,
             uint hash_key_len)
{
    struct rte_eth_rss_conf rss_conf;
    int diag;
    unsigned int i;

    rss_conf.rss_key = NULL;
    rss_conf.rss_key_len = hash_key_len;
    rss_conf.rss_hf = 0;
    for (i = 0; i < RTE_DIM(rss_type_table); i++) {
        if (!strcmp(rss_type_table[i].str, rss_type))
            rss_conf.rss_hf = rss_type_table[i].rss_type;
    }
    diag = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf);
    if (diag == 0) {
        rss_conf.rss_key = hash_key;
        diag = rte_eth_dev_rss_hash_update(port_id, &rss_conf);
    }
    if (diag == 0)
        return;

    switch (diag) {
    case -ENODEV:
        printf("port index %d invalid\n", port_id);
        break;
    case -ENOTSUP:
        printf("operation not supported by device\n");
        break;
    default:
        printf("operation failed - diag=%d\n", diag);
        break;
    }
}

Reference

Scalable TCP Session Monitoring with Symmetric Receive-side Scaling

Symmetric RSS (Receive-Side scaling)

ntop - Hardware-based Symmetric Flow Balancing in DNA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章