IntelのThe Distributed Asynchronous Object Storage (DAOS)概要紹介


本稿では、現在Intel主導で開発中の[The Distributed Asynchronous Object Storage (DAOS)](https://wiki.hpdd.intel.com/display/DC/DAOS+Community+Home) (発音はデイオス)の概要を紹介します。今回はほんの概要しか紹介できないので、興味を持たれた方は是非本家のドキュメントを読んでみてください。

# TL; DR
* スパコン向けのオブジェクトストレージソフト
* 2019/11発表のI/O 500 10 node challengeで2位にダブルスコアをつけての1位

# イントロ：DAOSとは何か？

DAOSは、SCMやNVMeをターゲットとした分散オブジェクトストレージソフトウェアで、2021年に稼働するスーパーコンピュータ[Aurora](https://press3.mcs.anl.gov/aurora/)で導入予定です。DAOSは米国の研究機関や民間が共同で行った研究[1]がベースとなっており、個人的には今米国が一番力を入れて開発しているストレージソフトウェアなのでは？と思っています。

DAOS自体はオブジェクトストレージですが、DAOSを使ったPOSIXファイルシステムがすでに開発されており、2019年11月のSC'19で発表された[I/O 500 (※1) 10 Node challenge](https://www.vi4io.org/io500/list/19-11/10node?fields=information__system,information__institution,information__storage_vendor,information__filesystem_type,information__client_nodes,information__client_total_procs,io500__score,io500__bw,io500__md,information__data,information__list_id&equation=&sort_asc=false&sort_by=io500__score&radarmax=6&query=)で2位にダブルスコアの差をつけて1位を取っています。3位のWekaIOやGekkoFSもNVMe、SCMをターゲットとしたファイルシステムですが、それらに対しても大きな差をつけているあたり、DAOSが（少なくともベンチマークの上では）優秀であることを物語っています。
(※1)　POSIXファイルシステムのメタデータアクセス性能とREAD/WRITE性能のベンチマークランキング

# スーパーコンピュータにおけるストレージソフトスタックの課題
DAOSは、従来（現行）スーパーコンピュータのストレージシステムにおける課題を解決することを目的として開発されています。従来のスーパーコンピュータでは、LustreなどのPOSIXファイルシステムをベースとしており、HDF5などの各I/O middlewareはその上に実装されることが一般的です。

![HPC-IO-System.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90546/dbad5587-da35-f383-ac12-2ca9c2447b76.jpeg)
従来のストレージソフトウェアスタック（引用元：[Best Practice Guide – Parallel I/O](http://www.prace-ri.eu/best-practice-guide-parallel-i-o/)）

図を見れば明らかですが、ソフトウェアスタックは非常に厚いです。例えば、並列でHDF5を使おうとすると、その下にMPI-IO、POSIX-IO(※2)が存在しています。このソフトスタックで真面目に性能最適化を行おうとすると、HDF5がどのように実装されているかだけでなく、MPI-IOがPOSIX-IOでどのように作られているか、また、POSIXファイルシステムの実装まで意識しなければならないため、非常に難しくなります。
(※2) 本稿ではAPIを意味する場合はPOSIX-IO、システムを意味する場合はPOSIXファイルシステム、と使い分けています。

現在のスーパーコンピュータでは、I/O時間がアプリケーションの実行時間に占める割合は比較的短いので、I/O性能は大きな問題にはなっていないと思います。しかし、今後さらにスーパーコンピュータの演算性能は向上すると、I/O性能がアプリケーション実行時間に占める割合が大きくなり、I/O性能のチューニング機会が増えてくると考えられるため、このような課題を解決する必要が出てきます。

（DAOSの論文[1]には他の課題も挙げられていますが、理解が追い付いていないのでここでは性能についてのみ言及しました。その他の課題については論文を参照ください。）

# DAOSを使った場合のソフトスタック

DAOSは、上記課題を解決するために開発されているオブジェクトストレージです。従来のソフトウェアスタックにおけるPOSIXファイルシステムをDAOSに置き換え、各種I/O middlewareがDAOSの上にフラットに実装される想定をしています。

<img width="588" alt="daos_software_stack.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90546/e0dee20c-2ad7-2c86-f390-da30ecb86f46.png">
DAOSを使ったストレージソフトウェアスタック[2]

DAOSでは、DAOSを使う手段として[DAOS API](https://github.com/daos-stack/daos/blob/master/src/client/api/README.md)が提供されています。また、I/O middleware実装として既に[POSIX-IO](https://github.com/daos-stack/daos/tree/master/src/client/dfuse), [MPI-IO](https://github.com/daos-stack/mpich/tree/daos_adio), HDF5があるようです。DAOS APIは、オブジェクトストレージAPIやKVS APIなどがあります。

単にPOSIXファイルシステムがオブジェクトストレージに置き換わっただけじゃないか、と思われるかもしれないですが、POSIXファイルシステムはオブジェクトストレージに比べ暗黙的に行っている処理が多く、これをベースとしてI/O middlewareを実装する場合、性能観点では少し難儀することが多いと思われます。DAOSでは、性能にかかわる部分についてはなるべくユーザが制御できるようにAPIとして開示することで、各I/O middlewareの性能を引き出しやすい柔軟性を提供しようとしています。
（オブジェクトストレージは素人なので間違っていたら指摘ください）

以下は私見です。
POSIX-IOは非常に長く使われているAPIで今後もなくなることはないと思っています。その名前の通りPortable（POSIXはPortable Operating System Interface for UNIXの略）なソフトウェアを実装するのであれば、POSIX-IOを使うのが良いですが、今後の性能要求を満たすためにはPOSIX仕様がネックになりかねません。DAOSや現在存在するAPIはPOSIX-IO（POSIXファイルシステム）では満たすことが出来ない要求を満たすためのものという位置づけととらえており、どちらが優れているという問題ではないと考えています。
# 使ってみる（進行中）

[DAOSのビルド on ubuntu 18.04](https://qiita.com/tkokamo/items/4114c12cf260f2948e01)

# DAOSの内部アーキテクチャ
（後日追記予定）


# おわりに

DAOSを構成するソフトウェアは非常に多くもっと色々書きたい気持ちはありましたが、私自身勉強中なので今回は表面的な紹介にとどめました。

私は分散POSIXファイルシステム屋さんなのですが、DAOSの内部はデータベース屋さん、オブジェクトストレージ屋さんのほうが馴染んでいる技術が多い気がするので、本稿に目を通された界隈の方々は是非ドキュメントを読んで教えていただけると助かります。

最後までお読みいただきありがとうございました。

## For further reading

[1][DAOS and Friends: A Proposal for an Exascale Storage System](https://ieeexplore.ieee.org/document/7877128)
[2][DAOS for Extreme-scale Systems in Scientific Applications](https://arxiv.org/abs/1712.00423)


その他の文献

* [DAOS documentation](https://daos-stack.github.io/)  
DAOSの公式ドキュメント。インストール方法を含めた使い方も書かれています。
* [DAOS githubレポジトリ](https://github.com/daos-stack/daos)  
各ディレクトリのREADME.mdが充実しています。ドキュメントにも書かれていない内部のアーキテクチャについてかなり詳しく書かれています。
* [Mochi project](https://press3.mcs.anl.gov/mochi/)  
DAOSが使っているMercuryやArgobotsなどをはじめとしたSDSプロジェクトのページです。