10Gbps ラインレートとは?
ネットワーキングテクノロジーサークルでは良く「10Gbpsラインレート」のような「ラインレート」という用語を耳にします。これは簡単に言うとネットワークトラフィックの最大容量で、この場合10Gbit/秒になります。簡単に聞こえますが実際のデータ転送レートについてはちょっと分かりづらいです。
まず始めに10Gbpsラインレートについて知るべきことは、正確に10,000,000,000 bits/秒ではなく若干高いということです。どのくらい高いでしょうか?こここにある前回の投稿で説明しているように正確には10.3125Gbitです。その投稿の要約は、実データで10.0000Gbpsに達成するにはデータ管理のために追加の312.5Mbpsに相当する帯域幅が必要ということです。その投稿はさらにデータが配線上で実際どのようにエンコードされるかというあなたが驚くかも知れない詳細に進みます。
キーポイントとしては、tcpdump「配線上」で見る64B ICMP Pingデータは実際に配線を通るデータの一部だけであるという点です。そのようなパケットがいかにXGMIIに変換されるかについては最初の10Gイーサネットレイヤーの抽象化の詳細についての以前の投稿All about XGMIIで説明しています。要約すると、それぞれのデータパケットは下図のようにイーサネットプリアンブル、フレームチェックシーケンス、イーサネットエピローグと最小インターフレームギャップで囲まれています。
この例の場合、それぞれのセクションは次になります:
プリアンブル | 青 | 8バイト |
ペイロード | 緑 | 変数 |
フレームチェックシーケンス(FCS) | 黄 | 4バイト |
エピローグ | 紫 | 1バイト |
インターフレームギャップ IFG(+エピローグ12B) | 赤 | 11バイト |
ベンダー(弊社のような)が「ラインレート」パフォーマンスをブーストする場合、それはデバイスが上図プロトコルを使ってシリアル化された最大のデータペイロード量を処理できるという意味です。それではネットワークデバイスに関してゴールドスタンダードと言われる「10Gbpsラインレート 64Bパケット」が実際に何を意味をするかもっと具体化し計算してみましょう。
10gbitラインレート 64バイト
64Bパケット部分から説明すると、イーサネットプリアンブルとイーサネットエピローグ間が64バイトで、60Bのデータと4BのFCSを転送します。
プレアンブル | 青 | 8 バイト | 8 B |
ペイロード | 緑 | 60 バイト | 68 B |
フレームチェックシーケンス(FCS) | 黄 | 4 バイト | 72 B |
エピローグ | 紫 | 1 バイト | 73 B |
インターフレームギャップ IFG(+エピローグ 12B) | 赤 | 11 バイト | 84 B |
このように60バイトデータが配線上で合計84Bに増大します。次に厳密に10.00Gbpsでプッシュされるこれらのパケットの合計を計算します。
10.00e9 bits / (8 bits * 84 bytes) = 14.88e6 packets
そして馴染みのある毎秒14.88Mパケットという皆さんが書くのが好きな数字になります。これは10Gbitリンクで60 バイトデータ(プラス4B FCS)のパケット最大値が14.88Mパケットであることを示します。しかし実際のデータ転送レートはいくつでしょうか?
14.88e6 packets * 60 bytes * 8 bits = 7.14Gbps
つまり60 バイトのパケットデータをできるだけ速く送信し、10Gbpsの帯域幅を完全に使用しても、たった7.14Gbpsのデータだけを送信しています。
10gbitラインレート1500バイト
上述したように64Bパケットを使って最大帯域幅を実現するのはあまりいい考えではありません。それでは1500バイトパケットの数字を見てみましょう。
プレアンブル | 青 | 8 バイト | 8 B |
ペイロード | 緑 | 1500 バイト | 1508 B |
フレームチェックシーケンス (FCS) | 黄 | 4 バイト | 1512 B |
エピローグ | 紫 | 1 バイト | 1513 B |
インターフレームギャップ IFG (+エピローグ 12B) | 赤 | 11 バイト | 1524 B |
..そして上のデータを利用して毎秒10.0Gbpsのパケットの数字を取得すると
10.00e9 bits / (8bits * 1524 bytes) = 820,209 packets
次のデータ帯域量の結果になります
820,209 packets * 1500 bytes * 8 bits = 9.85 Gbps
これは1500Bパケットを10Gbpsリンクラインレートで送信すると実際のペイロードデータの9.85Gbpsという結果になります。明らかに7 Gbpsよりは良いですが、1500Bパケットでも完全に10.0Gbpsに値するデータには到達できません。
tcp 10gbitラインレート1500バイトパケット
…しかし上述した9.85Gbpsの計算は生のイーサネットフレーム帯域だけであるために誤解を与える数字です。実際の世界においてパケットはFTP、SSH、HTTP、HTTPS等といったハイレベルプロトコルが使用され、そして99%はTCP接続が使用されます。そこで新しい疑問です: 1500バイトイーサネットフレームを使用した場合、TCPパケットの本当のペイロード帯域はいくつでしょうか?
プレアンブル | 青 | 8 バイト | 8 B |
イーサネットヘッダー | 緑 | 14 バイト | 22 B |
IPv4ヘッダー | 緑 | 20 バイト | 42 B |
TCPヘッダー | 緑 | 20 バイト | 82 B |
データペイロード | 緑 | 1426 バイト | 1508 B |
フレームチェックシーケンス(FCS) | 黄 | 4 バイト | 1512 B |
エピローグ | 紫 | 1 バイト | 1513B |
インターフレームギャップ IFG (+エピローグ 12B) | 赤 | 11 バイト | 1524 B |
上図のテーブルで確認できるように、1426Bのデータペイロードが10G帯域の1524Bで囲まれています。これを
10.00e9 bits / (8bits * 1524 bytes) = 820,209 packets
効率の良いTCPペイロード帯域で計算してみると
820,209 packets * 1426 bytes * 8 bits = 9.36 Gbps
悪くはありませんが、イーサネット + IP + TCPエンコーディングから帯域の1Gbps近くを実際に失っています。そのためもしあなたがTCP帯域テストで8.xx Gbpsという高い数値を獲得した場合は、かなり良くやっているという意味になります。
要約
あなたのかっこよくて新しい10Gbpsリンクが10Gbpsに相当する市場データ、猫の面白画像(その順序で)プッシュできたら最高ですが、それは決して実現できず決して起こりません。上述のように「12バイトの平均インターフレームギャップ」という技術的に過度に単純化した場合でもです。ほとんど全てのハードウェアはパケットがXGMIIサイクルで開始/停止できるアライメント制限があります。例えば弊社のFPGAベースのトラッフィックジェネレーターが8B IFG、16B IFG、8B IFC...などと出力した場合、IFG(8 + 16 + 8 + 16)/パケット数 = 平均12Bとなります。
10Gbpsラインレートが何であるかという混乱、そして10G イーサネットは10Gbpsのデータではないという点を明確にできたなら幸いです。