2408883_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2408883_ja-JP

2408883_ja-JP

セカンダリがDPDKプールからmbuffを割り当てるのに失敗しました

こんにちは、皆さん。

使用機器:LX2160 LSDK 2108 メイン
MCファームウェアバージョン:10.32.0

DPDKバージョン:dpdk_19_11_tags_LSDK20.04-isc-09

プライマリ ( DPDK ) プロセス: [ rte_pktmbuf_pool_create("dlmempool", ] を使用して mbuff プールを作成します。

セカンダリ(DPDK)プロセス:API [ rte_pktmbuf_alloc(mempool) ]を使用してmbuffを割り当てるのに失敗しました

セカンダリーでは、mempoolが正しいとわかります。ムバフは満杯です。rte_pktmbuf_alloc を使用した最初の mbuff 割り当て時にエラーが発生します。


これに対する解決策はありますか?ありがとう。


Re: Secondary failed allocate mbuff from DPDK Poolありがとうございます。これらのオプションを試してみて、明日までにご報告します。Re: Secondary failed allocate mbuff from DPDK Pool

こんにちは、

セカンダリプロセスは、プライマリプロセスと同じ仮想アドレスにhugepagesをマッピングする必要があります。ASLRが有効な場合、セカンダリはmempoolポインタを別の仮想アドレスに解決するため、最初の割り当てが失敗します。

echo 0 > /proc/sys/kernel/randomize_va_space
 

プライマリプロセスまたはセカンダリプロセスを起動する前に、これを実行してください。

2. 十分なDPMCPオブジェクトを用意する

プロセスの総数(プライマリプロセス+セカンダリプロセス)と同じ数のDPMCPオブジェクトを作成します。プライマリ1個とセカンダリ1個の場合、少なくとも2個のDMPCPが必要です。

export DPMCP_COUNT=3   # for 1 Primary + 2 Secondary (always provision +1 as buffer)
./dynamic_dpl.sh dpmac.X

3. 十分なDPIOオブジェクトを用意する

各プロセスにはそれぞれ専用のDPIOポータルが必要です。その式は次のとおりです。

(総プロセス数)×(プロセスあたりのコア数+プロセスあたりの追加コア数1)

例えば、プライマリ1(2コア)+ 1セカンダリ(2コア)= 最低9DPIOの場合。

export DPIO_COUNT=20   # set generously

4. セカンダリデバイスを正しくブラックリスト/ホワイトリストに登録する

二次プロセスは、I/O デバイス (dpni、dpbp、dpcon、dpseci) を再初期化してはなりません。セカンダリ側で初期化する必要があるのは、 dpiodpmcpのみである。正しいブラックリストフラグを渡してください。

# Secondary process example — blacklist all dpni/dpbp/dpcon, allow only dpio + dpmcp
./your_secondary_app --proc-type=secondary \
  -b fslmc:dpni.X \
  -b fslmc:dpbp.X \
  -b fslmc:dpcon.X \
  -- [app args]
 

または、セカンダリに割り当てられているdpioおよびdpmcpオブジェクトのみを明示的にホワイトリストに登録します。

./your_secondary_app --proc-type=secondary \
  -w fslmc:dpio.Y \
  -w fslmc:dpmcp.Z \
  -- [app args]

5. --proc-type=secondary EAL引数を使用する

セカンダリが正しいEALフラグで起動されていることを確認してください。

./your_secondary_app -c  -n 1 --proc-type=secondary ...
 

あるいは --proc-type=auto を使ってDPDKを自動検出させるのも良いでしょう。


6. セカンダリでMempoolルックアップを確認する

セカンダリでは、 rte_pktmbuf_pool_create再度呼び出さないでください。代わりに、プライマリによって作成された既存のプールを検索してください。

// In secondary process:
struct rte_mempool *mempool = rte_mempool_lookup("dlmempool");
if (mempool == NULL) {
    // Error: pool not found — ASLR or hugepage mapping issue
}
struct rte_mbuf *m = rte_pktmbuf_alloc(mempool);
 
 

rte_mempool_lookupが有効な非NULLポインタを返してもrte_pktmbuf_allocがNULLを返す場合、問題はほぼ間違いなくDPIOポータルがセカンダリのスレッド/コアに対して初期化されていないことです。

 

よろしくお願いします。

Re: Secondary failed allocate mbuff from DPDK Pool

迅速な解決策を提供してくれた@Bio_TICFSLに感謝します。

タグ(1)
評価なし
バージョン履歴
最終更新日:
金曜日
更新者: