メモリは大量に使用されますが、時間は非常に少なく使用するサーバーアプリケーションがあります。それで、大きなスワップと通常のメモリで実行するのが経済的でなければならないと思います。
非同期ディスクIOについて学んだとき、ディスクから大容量ファイルを提供する方法を読んで、FreeBSDがLinuxよりもそれをよりよくサポートしているというニュースを聞きました。
私の質問は:スワップパーティションが多いディスクの読み取りと書き込みを実行するので、非同期ディスクIOはスワップスペースのパフォーマンスに影響しますか? FreeBSDを選択する理由はありますか?私はLinux(Ubuntu)タスクの幅広い経験を持っており、それをアプリケーションで使用することを好みます。
答え1
- FreeBSDの非同期IOはLinuxよりも優れていません。あなたのソースはAIOコールファミリ(
aio_read
など)がFreeBSDカーネルに直接実装されていますが、可能であればリクエストをIOCP(ソケット、パイプ、フラットディスクアクセスなど)に内部的に変換し、ファイルシステムI /カーネルスレッドを生成します。対照的に、Linux は一連の AIO 呼び出しにユーザー空間スレッドを使用します。これは明示的ですが、タスクを公開し、より大きなスレッドコンテキストが必要です。他のすべての側面は、システム管理者の調整技術を含む多くの機能に依存する共通のカーネルアーキテクチャとパフォーマンスに関連しています。 - AIOが明示的にスレッドを要求する場合、いくつかのアプローチがあります。主なケースは、ファイルがメモリマップされ、メモリ領域に読み込まれ、実際の読み取りがページエラーとして扱われる場合です。ページエラーは特定の制御フロー(つまりスレッド)を中断するため、独立した処理には別のスレッドが必要です。これは、あなたが想定しているメカニズムと非常に似ているように見えますが、RAM使用量を正しく制御する場合にのみ必要な
madvise
領域と不要な領域を指定するための呼び出しが少なくとも多いことを意味します。場合によっては、直接* read()/ * write()が処理されたセグメントをRAMに公開する必要がないため、より簡単です。 - AIO自体はスイッチングとは何の関係もありません。 IO方式を使用するには、最適な速度で入出力が必要です。しかし、問題は、プロセスメモリに大量のデータを保存すると、交換が発生して入ってくることになります。 「ワークセット」(プロセスのパフォーマンスが大幅に低下せず、作業するためにRAMに必要なページセット)がRAMに収まるもの(カーネルデータ、ディスクキャッシュなどのオーバーヘッドを含む)より大きい場合、継続的な交換の途中で立ち往生しています。この場合、作業セットを十分に小さく保つようにアルゴリズムを調整することが唯一の解決策です。
- 特にLinuxの場合問題 12309心。これらの問題は解決されたことが知られていますが、チケットで記録と結果の重要な部分が欠落しているため、ディスクキャッシュの消去と一括交換後に問題が再発する可能性があります。 FreeBSDとの重要な違いは、BSDシステムにはこのような問題がないことです。