错误 #3867
DD灌包测试三终端,30分中后无法ping通,nc的ngpkt无法分配出来
0%
描述
从日志看到nc的ngpkt pool分配内存失败,失败后无法发送hello无法给mac发送广播,怀疑是有未释放导致;目前hna30s配置下30多分钟无法ping;好像把hna改成10s会10分钟无法ping(没日志无法完全确定)
文件
历史记录
由 李 玮璇 更新于 28 天 之前
rte_pktmbuf_pool_create(name, n, cache_size, priv_size,
data_room_size, socket_id);
创建池子时,nc问题版本是n=512,cache_size=250;
dpdk池子有如下重要规则:
1、当缓存为空时,DPDK会一次性从全局池获取`cache_size`个mbuf
2、每个核心的缓存是**私有**的,只有该核心自己可以使用其中的mbuf
3、mbuf在其他核心释放后滞留本地缓存【理论上,但是会出现“偷取”导致释放后的缓存不在分配核】
4、- `cache_size` 指定了**缓存的目标容量**(不是最大容量)
- 缓存可以**暂时超过**这个值,直到达到刷新阈值
- 刷新后,缓存会**保留恰好cache_size个**mbuf
5、 默认配置下缓存刷信阈值≈1.5 * cache_size【 = 375(当cache_size=250时)】
可从无法分配内存后的日志证实:
lwx TestLog: ncPoolTotalSize=512, ncPoolInUseSize=0, ncPoolCanUseSize=512
lwx TestLog: Core 0 cache: len=0
lwx TestLog: Core 1 cache: len=153
lwx TestLog: Core 2 cache: len=0
lwx TestLog: Core 3 cache: len=0
lwx TestLog: Core 4 cache: len=0
lwx TestLog: Core 5 cache: len=359
lwx TestLog: Core 6 cache: len=0
lwx TestLog: Core 7 cache: len=0
结论:n=512,,cache_size=250,刷新缓存的flush_threshold=375,因此跨线程释放的buf永远达不到刷新缓存的门限,然后全局无剩余mbuf,全困在核缓存中,2核分配就会分配失败
因此,涉及跨核释放的话,要合理配置n值和cache_size值,尽量确保n > cache_size * lcore_count;【要是更合理就需要用dpdk提供的一些接口查下什么缓存命中率合理计算合理值,具体还没细看】
目前改成n=512,cache_size=32,验证长跑OK