ユーザーレベルのプログラムがSSDでページレベルまたはブロックレベルのI / Oを実行できますか?
ディスクデバイスを見ましたが、パーティションにファイルシステムがある場合にのみ機能するため、この機能を提供するかどうかはわかりません。
アップデート#1
SSD用の高性能なKey-Valueストアを作成したいので、低レベルのアクセス(読み取り、書き込み、消去を含む)を実行する方法が必要です。
私は私の方法がカーネルレベルでなければならないことを知っていますが、その前に(カーネルレベルのプログラミングの複雑さを学ぶために)ユーザースペースでテストしたいと思います。
答え1
以下を使用すると、あらゆる種類のストレージで低レベルのディスクI / Oを実行できます。ブロックデバイス、Linuxの/dev/sda
(フルディスクの場合)または/dev/sda1
(パーティションの場合)と似ています。これはファイルシステムを完全にバイパスします。
独自のKey-Valueストアを実装する場合は、専門家が作成したファイルシステムやデータベースよりも結果がはるかに遅く、バグが多いと確信しています。効率的なストレージメカニズムは、キャッシュ、同時書き込み、停電回復機能などを考慮する必要があります。これは非常に難しいです!
答え2
私はユーザープログラムがこのレベルのI / O最適化を達成できないと思います(これを行うために必要な最適化メカニズムは言うまでもありません)。したがって、私のアプローチは、設定されたデータしきい値を超えると、その内容を目的の出力にフラッシュするキューなどを実装してアプリケーションのフローを最適化することです。疑似コードは次のとおりです。
MAX_OBJS=100
M[100]=new M[100]
function saveObj(obj) {
if (M.size > MAX_OBJS-1) {
outputStream.appendArrayToBinary(M)
M = new M[100]
}
M.add(obj)
}
while (true) {
saveObj( new Obj )
}
ご覧のとおりバッファーオブジェクト100個。 101番目のオブジェクトが試された場合保存済みこれにより、別の100個のオブジェクトがディスクに書き込まれ、バッファが消去され、別の100個のオブジェクトのためのスペースが作成されます。もちろん、他のスレッドで書き込みを行い、オブジェクトがディスクに書き込まれ、バッファがクリアされるまで追加のオブジェクトが追加されないように配列をロックするなど、より複雑な技術を実装することもできます。またはそのようなもの。
答え3
すでに私指摘他の質問では、なぜカーネルレベルのアプローチを放棄するのですか?
そのような努力を始める前に、次のことを明確にする必要があります。
「高性能」は、すべての場合に適用される特性ではない。
最適化は、特定の状況で主なボトルネックが見つかった場合にのみ実行する必要があります。
自分に次のような質問をしなければなりません。
- 現在、主流のKey-Valueストレージシステムの実装を評価しましたか?そうでなければなぜならないのですか?
- これが私のユースケースに合わないのはなぜですか?幅広いベンチマークとテストを行いましたか?主なボトルネックを見つけましたか?現在の最先端の実装でこれを修正できますか?そうでなければ、なぜ直接実装して修正できると思いますか?
- 具体的なパフォーマンス要件は何ですか? 「パフォーマンス」を定義し、それを測定する方法を見つけましたか?ストレージ作業中に高性能が欲しいですか?検索作業中に高性能が欲しいですか?多数のクライアント接続が高い負荷で高性能を発揮しますか?
何かをよく理解したら正確に達成しようとする目標は、現在の最先端のソフトウェアを拒否した後にのみ、潜在的な実装戦略を探索し始めなければなりません。
カーネルはあなたが触れたい最後の場所です。特に以前のカーネル開発経験がない場合にはさらにそうです。ほとんどのカーネルサブシステムは、高度に熟練したエンジニアの長年のテストおよび開発プロセスを通じて高度に最適化されています。
私が提案するのは、プリフォーク、スマートキャッシング、遅延書き込みの組み合わせによって最適化することを検討することです。広く使用されているキャッシュアルゴリズム、ロードバランシング方法の知識、および最新のファイルシステムの理解(例:事前に読む、政策開発、LRU) - これはあなたの問題と直接関係がないかもしれませんが、同様の分野で人々がパフォーマンスの問題をどのように解決するかを理解するのに役立ちます。もちろん、これはファイルシステム自体がすでにこれらの機能をよりよく実装しているため、アプリケーションでこれらの機能を再実装することが推奨されるわけではありません。ほとんどの場合、これはアプリケーションのパフォーマンスを向上させるのではなく、むしろ害を及ぼします。