dpdk qos

11
DPDK QoS May 17, 2015 Masaru OKI @masaru0714

Upload: masaru-oki

Post on 29-Jul-2015

408 views

Category:

Technology


3 download

TRANSCRIPT

DPDK QoSMay 17, 2015

Masaru OKI @masaru0714

● Linux上で動く、高速なパケットI/O処理を実現するためのライブラリ。○ C言語で書かれている。C++からも呼び出し可能。○ 特定のEthrenetポートを「DPDK専用」に切り替えて送受信する。○ 特定のCPU(コア/スレッド)を「DPDK専用」として動作させる。○ 受信パケットの単純転送で、10GbEワイヤーレートが出せる。○ メモリープール管理やロックレスリングバッファなどの機能も提供。○ ネットワークスタックは含まない。

● Intelが開発し、現在はhttp://dpdk.org/ にて開発が続いている。● 2015年5月時点での最新バージョンはv2.0.0● BSD Licenseで公開されている。

About DPDK

main() {rte_mbuf *array[size]; /* パケット受信用バッファ */

init(); /* もろもろ初期化 */for (;;) {

rte_eth_rx_burst(0, 0, array, size); /* API: portid 0のパケットを受信 */rte_eth_tx_burst(1, 0, array, size); /* API: パケットをportid 1に送信 */

}}

「パケットを受信」「データをパケットとして送信」がAPIになっているので呼び出す。複数ポートを処理する場合はこれらを並べるか、スレッドを分けて並列に動かす。

DPDKのプログラム

QoS: Quality of Service (サービス品質)通信パケットをすべて均等に扱うのではなく、種類や宛先、通信量等の種類により流量を加減したり優先度を変えるなど、通信内容にに対して要求される通信品質を適切に確保する技術および実装。

DPDKで提供されているQoSの実装は2つある。● qos_meter: メータリング(パケットを流量によって3段階に色分けする)● qos_sched: スケジューリング(優先度等によるパケットの並べ替え)

DPDKのQoS

RFCに基づく2種類のメータリングAPIが用意されている。● RFC2697 srtcm (Single Rate Three Color Meter)● RFC2698 trtcm (Two Rate Three Color Meter)使い方

経過時間(Time Stamp Counterの値)とともにパケットをパラメータに与えてrte_meter APIを呼び出すと、3種類のcolorのどれに相当するかが返ってくる。(パラメータ詳細はRFCやDPDKのドキュメントを参照)

○ GREEN○ YELLOW○ REDユーザプログラムはcolorに応じて処理をする。(REDはdropするなど)

DPDK QoS (meter)

階層化スケジューラが用意されている。● あらかじめEthernetポートを論理的に分割しておく。● 分割単位は階層化されている。● ユーザプログラムは受信パケットに対して分割単位の情報を書き込む● スケジューラは分割単位の優先度などに応じてパケットを並べ替える。● スケジューラはキューを持っていて、あふれたパケットはdropされる。階層は下記となっている。1. Port2. Subport3. Pipe4. Traffic Class5. Queue

DPDK QoS (sched)

● Port○ Ethernetポート。複数ポートの優先順位は均等。

● Subport○ Portを単数あるいは複数に分割したもの。○ それぞれ転送レートを指定できる。

● Pipe○ Subportを単数あるいは複数に分割したもの。帯域は等分される。

● Traffic class○ Pipeを流れるパケットを優先度別にクラスわけする。4クラス固定。

● Queue○ Pipeを流れるパケットをキューイングする最小単位。○ Traffic classごとに4固定。Weighted Round Robin(WRR)でdequeueされる。

QoS(sched)の各階層

4キュー

4クラス

図にするとこう

sched_port

subport 0 subport 1 subport 2

pipe 2pipe 1pipe 0 pipe 0 pipe 1

tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3

tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3

任意の帯域

pipe 1pipe 0subportを等分割

1. 準備1.1. rte_eth_dev_configure()等でポートの使用準備1.2. rte_sched_port_config()1.3. rte_sched_subport_config()1.4. rte_sched_pipe_config()

2. 送受信2.1. rte_eth_rx_burst()でパケット受信2.2. rte_sched_port_pkt_write()2.3. rte_sched_port_enqueue()2.4. rte_sched_port_dequeue()2.5. rte_eth_tx_burst()でパケット送信

使い方

1. rte_sched_*_configあらかじめスケジューリングの階層パラメータを設定

2. rte_sched_port_pkt_writeパケットをどのキューに入れるか情報を書き込み

3. rte_sched_port_enqueueキューイングすると

4. rte_sched_port_dequeueスケジューリング設定に応じた順序でパケットを取り出せる。

大雑把な解説

4キュー

4クラス

rte_sched_port_pkt_write()

subport 0 subport 1 subport 2

pipe 2pipe 1pipe 0 pipe 0 pipe 1

tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3

tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3tc0 tc1 tc2 tc3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3q0 q1 q2 q3

q0 q1 q2 q3

任意の帯域

pipe 1pipe 0subportを等分割

パケットをどのキューに書き込むかを具体的に指定。

sched_port