在處理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...