VPPのヒント
1. パフォーマンスがから来ています。
オリジナルリンク:
http://www.360doc.com/content/18/0428/20/53742993_749517107.shtml
https://steeven.iteye.com/blog/2347150 DPDKコードレベルのパフォーマンスの最適化の概要
https://www.jianshu.com/p/346bf99b2fb1
https://www.jianshu.com/p/ed914b24f6da
https://blog.csdn.net/Dgh19940/article/details/79603843
アーキテクチャ角度:DPDK 巨大ページ、NUMA、D-キャッシュの最適化、VPP I-キャッシュの最適化。
アルゴリズムの角度:Bihash 、ルックアップテーブルロックなし。
コード角度:ベクトル、マクロコンストラクタ、構造キャッシュラインアラインメント、ねじ結合コア、命令プリフェッチ命令の最適化。
2. ルートルックアップ
https://blog.csdn.net/dog250/article/details/6596046
インターネットルーティングテーブルの検索アルゴリズムのルーティングの概要- ハッシュ/ LC-トライ木/ 256ウェイ-たmtrieの木
3. __constructor__の修飾子
導入する単純な例を GCC の__attribute__((コンストラクタ))プロパティの役割を。GCCを機能させる__attribute__を((コンストラクタ))と__attribute __((デストラクタ))2つの属性名は、それがコンストラクタまたはデストラクタの関数として変更される、示唆しています。プログラマは、以下の方法のようなものの関数として、これらのプロパティを設定することができます。
空funcBeforeMain()__attribute__((コンストラクタ));
空funcAfterMain()__attribute__((デストラクタ));
4.unlikely
CPUは、プログラムのパイプラインモードの命令を実行しています。いわゆるパイプラインは、単に次の命令が読み出され、命令の実行中として理解することができます。プログラムが大量に登場のためにのために:?ながら、それ以外の場合と他のシナリオは、条件判断を含んで、CPUはパイプラインがスムーズに実装することができるように、正しい次の命令を抽出できるようにする必要があります。一度に実行するプログラムの結果に影響を与えずに、命令の間違った枝を抽出しますが、全体のラインはクリアされ、正しい分岐命令、プロセスの効率に影響をたくさん再読み。
CPU 、一般的なハードウェア分岐予測が、我々はまた、使用することができます)((おそらく)/そう、設計プロセスにも指定されたなどのディスプレイは、分岐決意でもあり、このような順序集合として、同様に一定の規則性を持っています入力されたデータ。
最小限に抑えるために支店mispredicationのいくつかの一般的なブランチに変換できるように、パフォーマンスに影響することを決定する無店舗型を。
リンク:https://www.jianshu.com/p/ed914b24f6da
__builtin_expectロング(EXPロング、ロングC); !!(C)は使用しています。ブール値が得られるエフェクト、機能効果がより良い分岐予測である可能性が高い()行わあれば使用して次の文の大きなチャンス、そう()は、実行する他の原則の声明の後ろのよりよいチャンスをそれが生成注文して物事を最適化し、」プロセッサパイプラインの使用を最適化するために、正しくアセンブリコードを。そうする有力分岐があるように、彼らはコードを手配します(任意JMP命令実行せずに実行されるプロセッサパイプラインをフラッシュするの悪い効果を有している)」を
主に分岐予測誤差は、ジャンプ命令は、性能低下の多くをもたらすでしょう。なぜ?本の除去、「コンピュータシステムの深い理解」から P141:「一方、仕事のジャンプ命令が行われ、その後、正しい位置から開始された後、ジャンプ予測誤差プロセッサは、すべての手順については、それを失う必要ですパイプラインを埋めるために開始指示、約における廃棄物で20 〜40 クロック・サイクル」、アセンブリ・コード・レベルの参照、本明細書の第一の端部への参照を理解しました。
リンク:https://www.jianshu.com/p/346bf99b2fb1
5. 巨人ページhugepage
https://www.cnblogs.com/small-office/p/9766536.html 核の巨大ページで結ば
https://www.cnblogs.com/031602523liu/p/10537694.html UIO、巨大ページ、CPUアフィニティ、NUMAプロフィール
https://blog.csdn.net/qq_33611327/article/details/81738195 のmmap分析
このシステムは、その決定によって使用されるプロセッサの数に大きなページサイズをサポートして大規模なページをサポートすることができます。
大規模なページが予約された後、次の質問には、使用を含みます。DPDKは、ラージ・ページを使用するようにHUGETLBFSを使用しています。まず、そのようなは/ mnt /巨大としてパスに大きなページをマウントする必要があり、またはの/ dev /のhugepages / 、次の時間DPDKの実行、ユーザー状態の仮想アドレスにマッピングされ、大きなページを呼び出したmmap()システムを使用しますスペース、あなたは正常に使用することができます。
以来 DPDKカーネルモードで巨大ページながら、ユーザ空間で実行され、そのためにmmapでスペースをカーネルにユーザ空間への高速アクセスを可能にします。
6. CPUの親和性
https://www.cnblogs.com/031602523liu/p/10537694.html
pthread_setaffinity_npの 特定の実行スレッドの集合 CPU 核に
CPUの親和性は、CPUアフィニティ、機構内の指定されたプロセスを指すCPU 他のプロセッサ上で実行するように移行されることなく、可能な限り、関連するプロセッサによって、物理プロセッサ、仮想プロセッサにマッピングすることができます物理置くためにバインドされているプログラムのCPUを上。
そしてそれぞれ、マルチコアマシン上で実行されている CPU 自体が独自のキャッシュ、プロセスによって使用されるキャッシュ情報を持つことになり、処理をすることができるOSは、他に派遣CPU ので、上で、CPUキャッシュ率が低いヒット。プロセスまたはスレッドがバインドされている場合はCPUを、プログラムが指定されていますCPUを、実行するために別のオペレーティングシステムによって送出されませんCPU の削減キャッシュ・ミスのパフォーマンスと効率を向上させることができます。
7. D-キャッシュ&I-キャッシュ
7.1 I-キャッシュ
VPP グループメッセージとして処理は、解決するためにI-キャッシュジッタの問題を。
7.2 Dキャッシュ
オリジナルリンク:https://blog.csdn.net/Dgh19940/article/details/79603843 DPDK でキャッシュの最適化
1 )メモリー受信記述子に書き込み、データバッファへのポインタは、カードは、メッセージの内容に充填した後にアドレスに従ってパケットを受信し、充填されています。
2 受信したパケットは、パケットを受信したか否かを確認するために、カードの構造)(メモリ読み出し)を更新するときに)受信ディスクリプタは、(メモリから読み出されます。
3 )受信確認からディスクリプタパケット、メモリからのリードポインタ制御構造を受信し、その後、メモリ制御構造、制御記述子構造に受信から読み出したパディング情報から読み出します(メモリリード)。
4 )ソフトウェアが新しいメッセージを受信したことを示す受信キューレジスタを更新します。
5 )(メモリ読み出し)メモリからパケットヘッダを読み取り、ポートを転送することを決定しました。
6 )送信キューディスクリプタ送信、送信キュー更新レジスタに充填されたメッセージ情報の制御構造から。
7 )メモリからディスクリプタ(メモリ読み出し)を送信読み取り、ハードウェアパケットが送出されるチェック。
8 )もしあれば、制御構造(メモリ読み出し)に対応するメモリから読み出され、データバッファが解放されます。
パケット処理プロセスは、必要とすることがわかる 6 回(上記(メモリ読み出し))メモリを読み取ります。
言い換えれば、ことを確実にするために 80 処理されたクロック・サイクルメッセージDPDKは、データが読み込まれることを確認する必要がありますキャッシュのヒットを、あるいは場合はキャッシュミス、パフォーマンスが大幅に低下します。
7.3 キャッシュの一貫性
データ構造定義またはデータバッファが割り当てられた後、そこに対応するメモリアドレスであり、および手順を読み書き。読み出し時に、メモリは、最初にロードされたキャッシュ、および、内部プロセッサ・レジスタに送信され、書き込み動作時のレジスタから送信されるキャッシュ、最終的にメモリバスに書き戻します。
このように二つの質問があります:
1)データ構造 / に対応するデータバッファキャッシュラインが揃っていますか?ない場合は、データ領域がより小さくても、キャッシュライン、それは2本の取り上げるキャッシュ・ラインを、加えて、場合キャッシュラインが別のデータ構造に属し、他のプロセッサコア処理で、どのようにデータの同期?
回答:構造__rte_cache_aligned整列。
コンパイラは、あなたがこのように整列している変数またはフィールドへまたはからコピーを行うときに、メモリの最大のチャンクをコピーするものは何でも命令を使用することができますので、これを行うと、多くの場合、コピー操作がより効率的に行うことができます。
2)データ構造と仮定 / バッファのアドレスを開始することであるキャッシュライン競合を解決する方法を、整列したが、メモリの読み取りと書き込みを同時に複数のコアがありますか?
答え: DPDKのソリューションは、複数のコアが同じメモリアドレスやデータ構造にアクセス避けるために、すべての最初に簡単です。それによって結果のデータ共有に起因する誤差低減、他のコアとの間でデータを共有し、各核回避キャッシュ一貫性のオーバーヘッド。
8. Bhihs
9. データのプリフェッチ
__builtin_prefetch()
https://www.cnblogs.com/dongzhiquan/p/3694858.html
VPP 多数のパケットを処理するデータ処理操作
P4 = vlib_get_buffer(VM、から[4])。
vlib_prefetch_buffer_header(P4、LOAD)。
CLIB_PREFETCH(p4->パケット、CLIB_CACHE_LINE_BYTES、STORE)。