質問: なぜノーチラスは遅いのですか? たくさんのファイルを含むディレクトリを開くときに、なぜnautilusが非常に遅いのか疑問に思います。たとえば、私の/ usr/libディレクトリには1900個のファイルがあり、すべてを表示するのに約5秒以上かかります。数ヶ月前にubuntuをインストールして以来、こんな感じで、とても面倒なこともあります。私は強力なハードウェアを持っていませんが、windowsエクスプローラーがこれよりもはるかに高速であることを知っています。それをスピードアップするためにできることはありますか?ubuntu 10.04
回答: これは、 私が行った話 と alexander larsson 、nautilusおよびgvfsを含む他のプロジェクトの主任開発者を思い出させました。giles 彼の答え 、特にnautilusがファイルのコンテンツの内部を調べていることについて、nautilusが「遅い」主な理由に触れています。ただし、gilesはなぜこれが遅いのかを説明していません。これは一部の人には明らかかもしれませんが、他の人には明らかではないかもしれません。アレックスが言わなければならなかったことは次のとおりです。 白紙の状態から始めた、つまりファイルシステムにまったくアクセスしていないとします。ここで、stat(“/some/dir/file”)を実行するとします。まず、カーネルはファイルを見つける必要があります。これは技術用語ではiノードと呼ばれます。まず、ルートディレクトリのiノードを格納するファイルシステムスーパーブロックを調べます。次に、ルートディレクトリを開き、「some」を見つけ、それを開き、「dir」などを見つけ、最終的にファイルのiノードを見つけます。 次に、実際にiノードデータを読み取る必要があります。最初に読み取った後、これもramにキャッシュされます。したがって、読み取りは1回だけ行う必要があります。 hdを古いレコードプレーヤーのように考えてください。針を適切な場所に配置すると、回転しながらすばやく読み続けることができます。ただし、「シーク」と呼ばれる別の場所に移動する必要があると、まったく異なることをしていることになります。腕を物理的に動かしてから、適切な場所が針の下になるまでプラッターが回転するのを待つ必要があります。この種の物理的な動きは本質的に遅いため、ディスクのシーク時間はかなり長くなります。 それで、私たちはいつ探しますか?もちろん、ファイルシステムのレイアウトによって異なります。ファイルシステムは、読み取りパフォーマンスを向上させるためにファイルを連続して保存しようとします。また、通常、互いに近い単一のディレクトリのiノードも保存しようとしますが、ファイルの書き込み時期、ファイルシステムの断片化などに依存します。したがって、最悪の場合この場合、ファイルの各統計がシークを引き起こし、次にファイルを開くたびに2回目のシークが発生します。したがって、何もキャッシュされていない場合、物事に非常に長い時間がかかるのはそのためです。 一部のファイルシステムは他のファイルシステムよりも優れているため、最適化が役立つ場合があります。あなたはアプリでいくつかのことをすることができます。たとえば、gioは、受信したiノードをreaddir()からソートしてから、iノード番号がディスクの順序と何らかの関係があることを期待して(通常は関係があります)、ランダムシークを最小限に抑えます。 重要なことの1つは、シークを最小限に抑えるようにデータストレージとアプリを設計することです。 たとえば、nautilusが/ usr/binを読み取るのが遅いのはこのためです。通常、そこにあるファイルには拡張子がないため、それぞれに魔法のスニッフィングを行う必要があります。したがって、各ファイルを開く必要があります=>ファイルごとに1つのシーク=> slooooow。別の例は、以前のgconfのように、多くの小さなファイルに情報を格納するアプリです。 、また悪い考え。とにかく、実際には、レイテンシーを隠そうとする以外にできることはあまりないと思います。 彼は次のメモで終わりました: このジレンマ全体の本当の解決策は、回転するメディアから離れることです。 intelssdは素晴らしいと聞きました。ライナスは彼らに誓う。 :-)