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, 具體可參考testpmd
中 port_rss_hash_key_update
與 cmd_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