使用dpdk的hash流表增刪查

2021-08-25 11:43:03 字數 1414 閱讀 7133

在處理tcp流的時候,處理執行緒cpu總是很高,導致丟包,dpdk收包占用本來就高,流表的新增刪除查詢時候配置到百萬就容易公升到100%,改用了dpdk的hash表試試效果

streamtable.h

class crtestreamtable

;

streamtable.cpp

crtestreamtable::crtestreamtable()

crtestreamtable::~crtestreamtable()

int crtestreamtable::init(unsigned int keysize, unsigned int tablesize, int index)

}return -1;

}rtestreamnode* crtestreamtable::add(ctuple4 *key, int& dir)

val = &rtestreamnodes[pos];

val->dir = dir;

}else

key->reverse2();

val = &rtestreamnodes[pos];

val->dir = !dir;

}freecount--;

return val;

}rtestreamnode* crtestreamtable::search(ctuple4 *key, int& dir)

}else

key->reverse2();

}return val;

}int crtestreamtable::remove(ctuple4 *key, rtestreamnode* val)

if(pos < 0)

freecount++;

return pos;

}void crtestreamtable::periodprocess()

int tcptimeout = obj->tcptimeout/1000;

gettimeofday(&nowtime, null); //獲取當前時間

uint32_t iter = 0;

const void *next_key;

void *next_data;

int pos = 0;

while ((pos = rte_hash_iterate(handle, &next_key, &next_data, &iter)) >= 0)

}else}}

}

dpdk hash表有multi的用法不過沒看到想要用的介面,效能些微改善了暫時滿足就沒試用,value可以一起插入到hash表裡,也不知道我用的對不對,因為新增的時候也不知道新增的pos值,不想在新增的時候總是new,所以就用陣列來放流表的value值了,hash表單獨存流的key關係。

hash表的使用

事實上不管使用陣列還是鍊錶儲存資料都會存在較大缺陷,當你使用陣列時,難於刪除和新增資料 當你使用鍊錶時難於查詢資料 因此hash表綜合了兩者的優缺點,使的查詢和新增等操作既不至於複雜也不至於簡單。因此hash表的原理可以是陣列中存鍊錶,鍊錶上存資料 簡單的建立方式如下 public class hn...

Hash表的使用

hash表能夠實現在o 1 時間內對資料訪問,雖然空間複雜度很高,但是時間複雜度很好。所以下面說一些使用hash的演算法。利用hash可以實現統計字元的個數,然後在遍歷一次得到最早的那個只出現一次的字元。注意 如果傳入的字串為null或者字串裡沒有只出現一次的字元,這兩種情況都要返回 1。int f...

暴雪的hash表

具體流程就是建立乙個較大的陣列,然後通過特定的演算法,將字串轉成整數,然後存入到這個陣列中,然後可以通過取模,獲得這個string在陣列中的下標。include include include define maxmpqhashtablelen 8192 typedef struct mpqhash...