Rust, Go, Python Parallel I/O を比較してみた

Kota Tsuyuzaki
nttlabs
Published in
Jun 25, 2021

こんにちは. NTT研究所の露崎です. 最近Rustの話題をよく見かけるようになり興味が湧いたので触ってみた内容を記事にします.

プログラミング言語のI/O性能

今回触ってみた内容はRust言語での並列I/O性能についてです. 私が以前 PythonベースのObject Storageの開発に関わった際に複数のdiskへの並列I/Oにも関わらず言語・ライブラリの制約によりオーバヘッドが大きく, 並列効果が出なかったり, diskの半故障などの際には大きく待たされるなどの問題に頭を悩ませていました. [1][2]

diskへのI/OはCPUだけの計算処理に比べて非常に時間のかかる処理ですので, I/O待ちの間に他の処理を実行すると言った処理の並列性を言語レベルで確保できるという性質は, システムを開発する際にはとても重要になります.

ベンチマークモデル

今回は以下のようなモデルで, 一つのプロセスから複数のwrite threadを起動し, 各threadは割り当てられた1つのNVMe SSDにデータを書き込むというモデルで実験を行いました. 書き込みの際にはthread同士は必ず別のdiskへの書き込みとなるように設定してあります. ストレージシステムを想定し, それぞれのtheαdは1単位の書き込み毎に必ずfsyncを行いデータをdiskに同期させるとともに, オーバーヘッドを見る実験のためこのfsyncの1単位を1024 bytesという小さいデータサイズ毎に実行しています. この1024 bytesの書き込みを各threadで102400回, 合計100MBになるように書き込みを行います.

今回はこのモデルのベンチマークをRust, Python, そして当時そのObject StorageでPythonの代用として置き換えを検討されていたGo言語で実装し比較しました.

ベンチマークで使用したRustコードは以下のとおりです.

各言語分の全てのコードを 記載すると長くなるので[3]にまとめました. 気になる方はご覧になって試してみてください. Pythonでは特に, asyncio, futuresなど3系から導入されたasyncライブラリも試してみましたが最も性能の良かったeventletのasync I/O libraryを使用した結果, コードを載せています.

ベンチマーク結果

ベンチマークの結果は以下のようになりました. thread数を1から20まで4刻みで増やして言ったときにPythonでは1 threadで6秒程度だった経過時間が20 threads では20秒程度まで増えています. 6秒かかる書き込みを20 thread分, 逐次実行すると120秒かかる処理のため, これでも並列効果自体は出ていると言えるでしょう. 一方でRust, Goでは20 threadsでも8秒程度と多少のオーバヘッドはあるもののPythonより十分に小さく抑えられていることがわかります. 速いですね. また, Rust, Goで比較するとRustの方が約0.5秒ほど早いという結果になりました.

まとめ

このように並列性, 特にファイル I/Oのような時間のかかる処理を実行するシステムにおいて言語の選択は非常に重要であることがわかりました. もう少しRustを勉強してシステム開発に活用してみたいと思います.

時間が取れれば, “部分的に遅いdiskがあった場合の影響” や “Read時のオーバヘッド”, “TCPなどNetworkに対するthreadのオーバヘッド” なども調査してみたいと思っています.

NTTはこのような様々な言語の特性の研究やシステム開発をする仲間を募集中です.

1: https://governance.openstack.org/tc/resolutions/20170329-golang-use-case.html

2: http://lists.openstack.org/pipermail/openstack-dev/2016-May/094549.html

3. https://gist.github.com/bloodeagle40234/5fd694af2171fbedb025013839bf0516

--

--

Kota Tsuyuzaki
nttlabs
Writer for

Research Engineer at Nippon Telegraph and Telephone Corporation (NTT). OpenStack Swift core team member, OpenStack Storlets Project Team Lead.