現(xiàn)象
VPP在轉(zhuǎn)發(fā)時(shí)犁功,如果有莫名丟包花墩。而且在命令行輸入vppctl show error
的時(shí)候出現(xiàn)某個(gè)節(jié)點(diǎn)no available buffer字樣雳刺。或者在show interface
的時(shí)候出現(xiàn)out of buffer等字樣仲锄。 說(shuō)明可能是buffer不足導(dǎo)致的丟包。
調(diào)試
在命令行輸入vppctl show buffers
看一下avail字段是否變?yōu)?了湃鹊。如果是0的話(huà)那就是沒(méi)有可用的buffer了儒喊。如下所示,Avail字段就為0了
vpp# show buffers
Pool Name Index NUMA Size Data Size Total Avail Cached Used
default-numa-0 0 0 2496 2048 16800 0 0 16800
default-numa-1 1 1 2496 2048 16800 16800 0 0
目前發(fā)現(xiàn)造成這個(gè)問(wèn)題的原因可能有幾個(gè)币呵,主要是調(diào)整啟動(dòng)配置文件startup.conf怀愧,啟動(dòng)dpdk項(xiàng)里面,num-rx-queues 4和num-tx-queues 4等字段會(huì)影響buffer占用余赢,這個(gè)隊(duì)列的數(shù)值越大芯义,占用的buffer越多∑奁猓可以適當(dāng)調(diào)小試一下扛拨。
也可以增大buffer的空間,我使用的VPP版本是19.04 release版本举塔,可以在startup.conf中添加下面的內(nèi)容绑警,數(shù)值可以自行調(diào)整。
buffers
{
buffers-per-numa 30000
}
由于VPP的版本更新比較快央渣,但是資料更新很慢计盒,所以很多資料上的參數(shù)都可能已經(jīng)不適用了,我這個(gè)也不保證不同版本可以適用痹屹。主要的思路就是查看自己版本對(duì)應(yīng)的VPP源碼章郁,找到src\vlib\buffer.c
目錄,查看vlib_buffers_configure
buffer模塊的配置函數(shù)志衍,例如我這個(gè)版本代碼是下面,解析命令行時(shí)聊替,有解析關(guān)鍵字buffers-per-numa
所以就可以使用buffers-per-numa
去嘗試添加到startup.conf文件中調(diào)試楼肪。
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "buffers-per-numa %u", &bm->buffers_per_numa))
;
else if (unformat (input, "default data-size %u",
&bm->default_data_size))
;
else
return unformat_parse_error (input);
}