近年は動画ストリーミングサービスの利用者が増加しており、インターネットトラフィックの大部分を占めていると指摘されています。世界最大級の動画ストリーミングサービスであるNetflixが、日々大量のデータを全世界のユーザーに送信するためにどのような工夫を凝らしているのかを説明するスライドを公開しています。

2022-Streaming-Summit-Netflix.pdf

(PDFファイル)http://nabstreamingsummit.com/wp-content/uploads/2022/05/2022-Streaming-Summit-Netflix.pdf

Netflixは800Gb/sもの動画データを1つのサーバーで送信するシステムの構築を目指し、長い道のりを歩んできました。



Netflixのワークロードでは、動画を「静的メディアファイル」として送信しており、すべてのコーデック/ビットレートをプリエンコーディングすることで、映像品質を保っているとのこと。



今回のスライドで解説するデータ送信の改善における主なステップは、「非同期型Sendfile(2014年)」「カーネルTLS(2016年)」「NUMA(2019年)」「インラインハードウェア(NIC)のカーネルTLS(2022年)」の4つに分けられます。



まずは2014年に開始された「非同期型Sendfile」についてです。Sendfileとはデータのコピー・転送を行うLinuxコマンドで、Netflixは静的メディアファイルを送信しているため、Sendfileを使用することが可能だとのこと。これにより、カーネルにデータをコピーしたり取り出したりする必要がなくなります。



Sendfileを使用することで、データがディスクから直接ネットワークカードに送信され、ホストCPUを経由しないで済むとのこと。



この際、ウェブサーバーであるnginxのワーカープロセスがブロックされると他のリクエストに対応できなくなり、ファイル転送がブロックされてしまうという問題が発生する場合があります。Netflixはこの問題に対処するため、空のバッファをTCPソケットのバッファに追加し、ディスク読み出しが完了するとTCPに送信準備ができたことを知らせる非同期型システムを採用しています。



続いて、2016年には「カーネルTLS(kTLS)」が導入されました。、



TLSはトラフィックを暗号化するプロトコルですが、ディスクからメモリに送られたデータをホストCPUに送信して暗号化し、メモリへ送り返してネットワークカードに送信するのでは、速やかな大容量データ送信ができません。



そこでNetflixは、TLSをカーネルに実装することでユーザー空間とカーネル空間におけるコピーの必要性を大幅に減らし、パフォーマンスを向上させているとのこと。なお、TLSハンドシェイク自体はホストCPUで処理されています。



2019年には「NUMA(Non-Uniform Memory Access/不均一メモリアーキテクチャー)」が採用されました。



以前のマルチCPUはメモリへのアクセス権限が均等であり、各コアはすべてのメモリとIOデバイスに平等かつダイレクトにアクセス可能でしたが……



NUMAでは各コアのアクセス権限が不均一であり、NUMAドメインまたはNUMAノードと呼ばれるローカルなゾーンに分割されています。



データがNUMAをまたいでやり取りされると、ファブリックが飽和して負荷に耐えられなくなってしまうので……



Netflixはコンテンツが格納されているNUMAノードですべてを実行できるようにして、データがNUMAをまたがないようにしているとのことです。



そして2022年には、「インラインハードウェア(NIC/ネットワークインタフェースカード)のカーネルTLS」が導入されました。



SendfileとkTLSを使用する従来の方式では、データの暗号化自体はホストCPUで処理されていますが、これをNICでやってしまおうという発想です。



Netflixは2016年からイスラエルのデータセンター関連半導体企業・Mellanoxと協議を重ね、2020年にNVIDIAが買収した後もハイパフォーマンスなNICの製品化に向けた取り組みを継続してきました。そして製品化されたNIC・ConnectX-6 Dxを導入し……



暗号化のためにデータがCPUを経由しない「NIC kTLS」方式を実現したとのことです。



こうして構築された800Gb/sプロトタイプの構成は、「Dell R7525」「AMD EPYC 7713 64c/128tが2枚」「xGMIのリンクソケットが3本」「512GBのRAM」「Mellanox ConnectX-6 Dxが4枚(100GbEのポートが8個)」「Intel Gen4x4対応のNVME(14TB)が16枚」となっています。



Netflixがプロトタイプを使って試行錯誤したところ、720Gb/sまで性能を引き出すことができたとのことです。



このスライドはソーシャルニュースサイトのHacker Newsでも話題になっており、「私はこのような技術的コンテンツが大好きです。信じられないほど面白くて有益なだけでなく、Hacker Newsなどのフォーラムで人気の『なぜNetflixには数千人ものエンジニアが必要なのか?あんなもの週末に構築できる』という主張への対比としても機能します。ソフトウェアの構築とスケーリングは2つのまったく異なる問題であり、後者の方がはるかに困難です」というコメントなどが寄せられていました。

Serving Netflix Video Traffic at 800Gb/s and Beyond [pdf] | Hacker News

https://news.ycombinator.com/item?id=32519881