前説
この記事は「GMOペパボエンジニア Advent Calendar 2022」の23日目の記事です!
目次
- 前説
- 目次
- 本編
- 要件整理
- 結論
- なにはともあれボトルネック特定/改善をしてみる
- 「1TBのディスクコピーが5秒位で終わったっす」を満たすのに必要なもの
- (おまけ)macOSのファイルシステム:APFSだとコピーが一瞬で終わる
- (おまけ)InfiniBand および RDMA
- (おまけ)永続化メモリ
- 感想
本編
「1TBのディスクコピーが5秒位で終わったっす」 これは流石に、絶対エラー起きてるとか、何かが起きてると思う人が大多数だと思うが、10分や、30分だとどうだろうか?
これは確かにとなった一方で2022年も終わりで1TBくらいなら5秒くらいでコピーが終わるケースが実はあるんじゃないか?と思って調べた。検証とかを一切していないので実現できるかは分からない妄想寄りの記事になります!!!!
出てくる速度は以下のサイトの数値あたりを参考にざっくり出しています。
要件整理
記事の文章から要件の整理をします。ざっくり以下のような状態を満たせればオッケーとします。
- OSはコピー元、コピー先ともにLinuxを使用
- コピー開始時点でクライアントのメモリに全データが載っていること
- 完了した時点でコピー先のサーバで永続化まで行われていること(scpしたら最後にsync(2)の戻りまでを処理時間とする)
結論
技術的には1TBをネットワーク経由で5秒くらいで終わらせることは可能である。ただし前提条件などが大分厳しいと考えられる。「5秒で終わるケースもあるよ!!」って言うことは不可能ではない
なにはともあれボトルネック特定/改善をしてみる
記事にあるような環境からそれぞれのボトルネックを説いていって最終的に1TBのデータをネットワーク越しに5秒で遅れるかを検討してみる。
家庭用サーバの場合
- ネットワーク: 10Gbps(1250MB/s)
- ディスクスループット: 500MB/s
DiskからのReadは今回は時間に含まれないので30分あたり〜くらいが妥当な数値になると思う。ちなみにうちはマルチGbEですらない1Gbpsの環境なのでさらに時間がかかる。専用環境でこのくらいの時間なので他に何かしらの作業をしてればさらに遅くなる。転送プロトコルがnfsなのかsambaなのかscpなのかrsyncなのかあたりでも大きく変わりそうですがプロトコルのオーバーヘッドはこの時点では無視していきます。
Disk性能を上げてみる
M.2 SSDのインターフェース規格(NVMe)あたりに変えてみる。SATAのSSDと比べて大体10倍くらいは出るはずなのそれくらいで仮定してみる。
- ネットワーク: 1.25[GB/s]
- ディスクスループット: 5[GB/s]
この場合は1000GBの転送には1000/1.25/60 ≒ 14分程度となる。この環境でも「1TBのディスクコピーが5秒位で終わったっす」と言われたら肌間的にエラーだろうとなりそうだ。
ネットワーク性能を上げてみる
ちょっと前にこんな記事が上がっていた。一般普及は一切されていないが仮にこの環境で検証する場合を考えてみる。400Gbpsなので5GB/sまで転送が可能となる。こうなるとまたディスクがボトルネックになる。
- ネットワーク: 50[GB/s]
- ディスクスループット: 5[GB/s]
この場合は1000GBの転送には1000/5/60 ≒ 3.3分程度なる。1分すら切れないので5秒で終わるなんてありえないと考えるであろう。もう少しディスクをどうにかがんばらんとダメそう。現在市販されているNVMe 1枚だとこの辺が限界かなという感じとなる。
RAID 0で頑張る
RAID0では、複数のディスクに同時に分散して読み書きを実行する。M.2 SSDをたくさん積んでRAID 0を組んでみるとどうだろう(ハードウェア、ソフトウェアは一旦スルー)。この時点で数秒で終わらせるには逆算していくと最低10枚は必要になる。そんなに挿せるマザーボードあるのだろうか。。ちょっと見た感じなかったので1台で頑張るのはこの辺が限界なんじゃないかと思い始めた。仮に4枚でRAIDを組むとしたらこんな感じ
- ネットワーク: 50[GB/s]
- ディスクスループット: 20[GB/s]
1000GBの転送には1000/5/60 ≒ 50秒程度。数秒で終わるとは思えないのは変わらない。(ここまでがある程度一般的にやれそうな範囲で以降は割とロマン枠になるかなと思っていますw)
分散並列ファイルシステムをいれる
分散並列ファイルシステムとは
サーバ1台で頑張る方針ではハードウェアの限界が先に来そうということが分かった。こういう話はHPCの分野が大分進んでいる。IOが大量になった際のアプローチとしてHPCの分野では分散並列ファイルシステムを使っている。とても簡単に説明するとクライアントがファイルシステムに対して書き込みや読み込みを実行するとデータを分割して複数のサーバに並列に分散して書き込みを行うというもの。通信プロトコルソフトウェアの実行にかかるCPU時間すらも惜しい世界なのでこういった手法が取られている。有名所だと「Lustre」とか「GlusterFS」とか「Hadoop分散ファイルシステム」がある。
今回は検証データなどが一番多いLustreの性能データを元にどうなるかを考察していきます。(HPCの分野でも66%がLastreを使われているらしいくらいシェアがあるとのこと)。サーバを分散させることで1台あたりのディスクスループットの最大値*用意した台数という性能が出ます。(プロトコルオーバーヘッドなどやメタデータ更新などでの性能に影響は出るかもですが無視しています)。Lustre Clients(カーネルモジュール)をインストールすることでユーザはファイルシステムを意識せずともいい感じにファイルを複数サーバへ分散して並列に書き込んでくれます。(透過性というもの、プログラムやユーザーから見ればネットワーク経由のファイルがローカルディスク上のファイルと全く同じに扱える)
Lastreでスループットを上げて頑張る
IOサーバを増やした分だけ理論的にはスループットは向上する。例えば1TB/sまで書き込めるようにサーバを並べたとして今度はネットワークがボトルネックになる。
- ネットワーク: 50[GB/s]
- ディスクスループット: 1,000[GB/s]
ここでネットワークは50[GB/s]が限界値と言っていますがLinuxでは、複数のNICを束ねてスループットを上げるBondingという機能があります。1Gbps * 2を束ねることで2Gbpsになるイメージです。400Gbpsを複数束ねることで理論的にはここの数値を増やすことが可能になります。20本束ねることで8000Gbps = 1000[GB/s]になります(これは可能なのか...??)これでコピー先のサーバのディスク性能とネットワーク性能が同じで理論的にはボトルネックがない状態となります。(この場合のボトルネックはIPやTCPやその上のプロトコル処理あたりのLinuxネットワークスタックとかNICとかスイッチとかのネットワーク機器がボトルネックになりそう)
- ネットワーク: (400GbpsのNIC*20本をBonding) = 1,000[GB/s]
- デイスク: LastreでIOサーバを並列化することで1,000[GB/s]を実現
ちなみにここまでやらずとも5秒まで時間をかけて良いなら200[GB/s]の性能が出せればよい。
- ネットワーク: (400GbpsのNIC*4本をBonding) = 200[GB/s]
- デイスク: LastreでIOサーバを並列化することで200[GB/s]を実現
これならもしかしたら実現できそうにも見える。1.6TbeというのいIEEEのロードマップでは2022年には標準化が済んでいるようになっていて実装フェーズにあるのではないかと思う(ググったがちゃんとして情報が見つけられなかったのでちょっと不明)。
これは現実的なのか
ネットワークの方は今日時点では現実的では無いと思われる。というのもIPAの記事を見ても一般普及はまだまだ先で実験段階であるとのこと。一方でLastreを用いて1TBのスループットはどうだろうか。Lastreをそれなりの規模で構築するならうん千万かかってしまうしなんなら運用するのも大変。使うという判断すらも危うい中でAmazon FSx for LustreがAWSからマネージドサービスとして提供されているので一気に現実味がました。スライドがあったので詳細についてみていく。
www.slideshare.net
AWSのドキュメントに性能比較があるのでそれを見ると最大スループットは1,000[GB/s]となっている。ファイルシステムサイズで性能は変わるようなので最大値となるように調整すれば1TBを1秒で書き込むことが可能となる。(1TBごとに200MB/sの性能向上するらしい。)
もちろんファイルシステム性能がそのようになっていても書き込む側が1,000[GB/s]でデータを転送して上げる必要がある。100Gbpsのネットワーク帯域に対応するC5nインスタンスというのが現時点での最高ネットワーク性能になるのでクライアント側は複数台用意して上げる必要がある。Lastre側は受け取れるのにクライアントが足りていないという状態でやはりネットワークがボトルネックとなるようだ。1クライアントあたりの最大スループットもドキュメントに明記されておりこの値よりは出ない。後はクライアントのメモリ速度もDDR4であれば最大でも3,200Mbpsまでしか出ないのでメモリからの読み出しでのここでもボトルネックになりそうである。
Googleの記事だが1,000 個の C2 VM インスタンス(Lustre クライアント)に、1.8 PB の Lustre ファイル システムを構築して10Tbpsまで出せたというもの。想像できない世界でおもしろいがこのくらになってくると何がボトルネックになってるのかが気になってしまう。
クライアントを増やせば良い?
「要件整理」を見ると実はクライアントの台数は明記されていない。最終的に1TBのファイルがコピー先のサーバのディスクへ書き込まれていればよいのであればクライアントを100台近く用意してそれぞれでlseekなりしてデータをそれぞれでメモリに用意しておいて一斉に書き込みを開始すれば1秒でデータコピーを終えることが出来る。データコピー開始までの準備が長いので現実的かどうかはちょっと微妙である。
「1TBのディスクコピーが5秒位で終わったっす」を満たすのに必要なもの
以下の条件が揃った場合に「5秒位で終わったっす」と言われたときに「そっかぁ〜」と返せる環境になりそうである。この環境で普段から仕事している必要がありそうでHPCとかそのへんのお仕事をしている人たちはそんな感じなのだろうか?w
会話の流れっぽくするなら「複数クライアントで書き込むのに最適化された状態からネットワーク越しの分散並列ファイルシステムへ1TBのファイルをコピーしたら5秒くらいで終わったっす」と言われたら「そんなもんだよね〜」となるかもしれない。はい。
(おまけ)macOSのファイルシステム:APFSだとコピーが一瞬で終わる
コピーオンライトファイルシステムというもので特定のオプションでcpを実行したら一瞬でコマンドが戻るというもの。1TBだろうが一瞬で戻る。どういう仕組かというとプロセスのコピーオンライトなどの仕組みに近くて書き込みが発生した時点でそのページだけのデータを更新するというもの。macのAPFS以外にもBtrFSとかでも実装されている。
(おまけ)InfiniBand および RDMA
InfiniBandはトランスポート層の処理をハードウェアでやること(等)で高速化へアプローチしている。他にもOSを通さずに対向サーバへデータを送る仕組みもあるらしい。
(おまけ)永続化メモリ
PMEMというSSDのように不揮発で永続化が可能なメモリというものがあったりします。DRAM に匹敵するアクセス速度で読み書きが可能となっており仮にDDR5の理論値の最大速度で書き込みができれば数秒は無理でも1分以内に完了させることは可能そうには見えた。ただ以下の記事でも書いてあるがwrite性能についてはDRAMとは結構な差があるらしいのでまだ先にはなりそう。(プログラム上で書き込んだデータよりも多くのデータをデバイスに書き込む現象をWrite Amplification というものを挙げている。これを解決する方法が今後の課題になってたりするのだろうか?)
(コラム)1TBくらいメモリを積んでみると
メモリ書き込みは10Gbpsよりも早いのでボトルネックは今度ネットワークになってくるはず。10Gbpsだと1秒間に1250MB書けるので「1024[GB] / 1[GB] = 1024[sec]」なので17.0666666667[分]で20分くらいだろうか。ネットワークを早くすれば早くするほど時間は短縮できる。400Gbpsが話題になっていたがこれでも5GB/sにしかならないので1024[GB]/5[GB] = 204.8[秒] = 3.41333333333で4分近い数値となる。この世界でも5秒で終わったと言われたエラーだろと返してしまいそうである。ディスクスループット: 20[GB/s]が20倍となり400[GB/s]となり50台用意すれば1000[GB/s]で1TBのデータであれば1秒でデータを書き込むことが可能になります。
(コラム)TCPは理論的に限界性能が決まっている
Layer4でTCPを使う場合、TCPは内部変数に32bit値を用いるというプロトコルの規定、パケット形式の規定と実装上の制限から性能の上限がある。理論最大値でも29Gbit/secが上限になっているらしくそれを克服するためにLFTCPというものが開発されているらしい。32bit値の変数をなくして2倍以上となる73Gbit/secで通信を実現させたとのこと。
TCPが信頼できるネットワークにおいては使用が適さないという話はなるほどとなりました。
TCPがデータセンター内の通信のような高速かつ信頼できるホスト間で信頼性のある通信をする用途にあまりにも適さない問題と、TCPに代わるプロトコルがどのような物であるべきかについての話https://t.co/hKCqG3igML
— Fadis (@fadis_) 2022年11月3日
(コラム)メモリ遅くない..??
DDR4は100GB/sでDDR5でも倍くらいの数値しか(?)でないとのことメニーメニーコアで処理をするようなHPC分野でこれでは性能問題になっていないのだろうか?と思って調べてみたらどうやらHBM(High Bandwidth Memory)というものがあるらしい。
感想
1TBのコピーが数秒で終わる世界はまだまだ先かなぁと思いました。8Kとか16K放送とかが主流になる世界だとM-1を録画しただけで1TBくらい行きそうです。移動時間中に見たい!となった場合に数秒でコピーできたらどれだけ嬉しいことか。そんな世界が早く来ると嬉しいです!