Linux ファイル システムの仕組みインデックス ノードとディレクトリ エントリ
Linux ではすべてがファイルです。通常のファイル、ディレクトリ、ブロック デバイス、ソケット、パイプも、統一されたファイル システムを通じて管理する必要があります。
Linux は、インデックス ノードとディレクトリ エントリという 2 つのデータ構造を各ファイルに割り当てます。これらは主にファイルのメタ情報とディレクトリ構造を記録するために使用されます。
インデックス ノードは各ファイルの唯一の識別子です。ディレクトリ エントリはファイル システムのツリー構造を維持します。ディレクトリ エントリとインデックス ノードの関係は多対 1 です。これは次のように単純に理解できます。ファイルには複数の名前を付けることができます。
ハード リンクを介してファイルに対して作成されたエイリアスは、異なるディレクトリ エントリに対応します。このようなディレクトリ エントリは基本的に同じファイルにリンクされているため、インデックス ノードは同じです。
c ディスクの最小単位はトラック (512B) ですが、それぞれの読み取りと書き込みが非常に小さいため、効率が非常に低くなります。したがって、ファイルシステムでは、連続するトラックを論理ブロックにまとめ、そのたびに論理ブロックを最小単位としてデータを管理し、論理ブロックを最小単位としてデータを管理します。 4KB、8トラックの連続コンポーズで構成されています。
注意すべき 2 つのポイント:
仮想ファイル システム
ディレクトリ エントリ、インデックス ノード、論理ブロック、およびスーパー ブロックは、Linux ファイル システムの 4 つの主要な要素を構成します。さまざまなファイル システムをサポートするために、Linux ではユーザー プロセスとファイル システムの間に具体的な層、つまり仮想ファイル システム VFS を導入しています。
VFS は、すべてのファイル システムでサポートされる一連のデータ構造と標準ソケットを定義します。
ファイルシステムI/O
I/O 分類: バッファー付き I/O とバッファーなし I/O、直接 I/O と間接 I/O、ブロッキング I/O と非ブロッキング I/O、同期 I/O と非同期 I/O。
スペースが不足しています。DF が C ドライブを確認したところ、十分なスペースが残っていることがわかりました。
ファイル データだけでなくインデックス ノードも C ドライブの領域を占有しますが、次のコマンドを使用します。
df-i
i ノードが不足しており、C ドライブに十分なスペースがない場合は、小さなファイルが多すぎることが原因である可能性があります。この問題は、これらの小さなファイルを削除するか、十分なインデックス ノードを持つ他の C ドライブに接続することで解決できます。
カーネルは、スラブ メカニズムを使用して、ディレクトリ エントリとインデックス ノードのキャッシュを管理します。 /proc/meminfo はスラブ全体のサイズのみを示します。各スラブ キャッシュについては、/proc/slabinfo も確認する必要があります。
ストレージ システムの I/O 動作原理:
ストレージ システムの I/O は、通常、システム全体で最も遅いリンクです。したがって、Linux はさまざまなキャッシュ メカニズムを使用して I/O 効率を最適化します。たとえば、ファイル アクセスのパフォーマンスを最適化するために、ページ キャッシュ、インデックス ノード キャッシュ、ディレクトリ エントリ キャッシュなどのさまざまなキャッシュ メカニズムが使用され、上位層のブロック デバイスへの直接呼び出しが削減されます。同様に、ブロック デバイスのアクセス効率を最適化するために、バッファを使用してブロック デバイス データをキャッシュします。
c ドライブパフォーマンス指標
使用法では、I/O のサイズではなく、I/O があるかどうかのみが考慮されます。言い換えれば、使用率が 100% の場合でも、C ドライブは新しい I/O リクエストを受け入れることができます
特定の指標を単独で比較することはできませんが、データベースや大規模な環境などのランダムな状況では、読み取り/書き込み比率、I/O タイプ (ランダムまたは連続)、および I/O サイズを組み合わせて包括的に分析する必要があります。多くの読み取りと書き込みが行われる組み込み Linux シナリオでは、IOPS がシステム全体のパフォーマンスをより適切に反映できます。マルチメディアなど、多数のシーケンシャル読み取りと書き込みが行われるシナリオでは、スループットが全体のパフォーマンスをより適切に反映できます。システムのパフォーマンス
このような「異常なロギング」シナリオが発生した場合は、iostat、strace、lsof、およびその他のツールを使用してロギング プロセスを特定し、対応するログ ファイルを見つけて、アプリケーション インターフェイスを通じてログ レベルを調整できます。問題を解決します。アプリケーションがログ レベルを動的に調整できない場合は、アプリケーションの構成を変更し、構成を有効にするためにアプリケーションを再起動する必要がある場合もあります。
strace はこのプロセスを追跡するのに、書き込みシステム コールを検出しないのはなぜですか?
ファイルの書き込みは子スレッドによって実行されるため、すべての strace 追跡プロセスは write システム コールを認識しません。pstree を通じてプロセスのスレッド情報を表示し、strace を使用して追跡するか、strace を通じてすべてのスレッドを追跡できます。 fppid
スロークエリ分析
top と iostat は、システムの CPU と C ドライブの使用状況を分析し、C ドライブの I/O ジレンマを発見しました。次に、pidstat を使用したところ、問題の原因が mysqld であることがわかりました。その直後、strace と lsoflinux ファイル システム最適化を使用して、mysqld が読み取っていたファイルを見つけました。同時に、ファイルの名前とパスから、mysqld が操作しているデータベースとデータ テーブルがわかりました。この情報に基づいて、これはインデックスを使用していないことが原因でクエリが遅くなる問題であると判断しました。
データサービスを停止すると、IO の問題は解消されます。なぜですか?
ケースアプリケーションがアクセスするデータテーブルはMyISAMエンジンをベースにしており、MyISAMの特徴としてインデックスのみをビデオメモリにキャッシュし、データはキャッシュしません。したがって、クエリ文がインデックスを利用できない場合には、データベースファイルからデータテーブルをビデオメモリに読み込んで処理する必要がある。
Dataservice はファイル キャッシュを継続的に解放するため、mysql は C ドライブ キャッシュを使用しなくなります。
Redis low は、最初に top と iostat を使用してシステムの CPU、メモリ、および C ドライブの使用状況を分析しましたが、システム リソースにジレンマがないことがわかりました。さらに分析するには、システムとアプリケーションがどのように動作するかをある程度理解する必要があります。たとえば、明日のケースでは、C ディスク I/O にはジレンマはありませんが、Redis の原理によれば、キャッシュをクエリするときに多数の C ディスク I/O 書き込み操作が発生するべきではありません。この考え方に沿って、私たちは pidstat、strace、lsof、nsenter などの一連のツールを使用し続け、2 つの潜在的な問題を発見しました。1 つは Redis の不合理な構成で、もう 1 つは Python アプリケーションによる Redis の悪用でした。 I/Oベンチマークテストツール
fio(フレキシブルI/OTester)
I/Oパフォーマンスの最適化
アプリケーションの最適化
ランダム書き込みを追加書き込みに置き換えて、ポーリング費用を削減し、I/O 書き込み速度を向上させます。キャッシュされた I/OLinux ファイル システムの最適化を使用し、システム キャッシュを最大限に活用して、I/O 書き込み数を増やします。アプリケーション内部で独自のキャッシュを作成するか、Redis などの外部キャッシュ システムを使用します。このようにして、キャッシュされたデータとライフサイクルをアプリケーション内で制御できる一方で、キャッシュを使用する他のアプリケーション自体への影響を軽減することもできます。 C標準ライブラリが提供するfopenやfreadなどのライブラリ関数は、標準ライブラリのキャッシュを利用してCドライブの動作を軽減します。 open や read などのシステム コールを直接使用する場合、オペレーティング システムが提供するページ キャッシュとバッファのみを使用でき、ライブラリ関数のキャッシュは利用できません。同じ C ディスク領域を頻繁に読み書きする必要がある場合, read./write の代わりに mmap を使用して、ビデオ メモリのコピー数を減らすことができます。同期書き込みが必要なシナリオでは、各リクエストを C ドライブに同期的に書き込むのではなく、書き込みリクエストをマージしてみてください。 O_SYNC の代わりに fsync() を使用すると、複数のアプリケーションで同じファイルを共有できます。C ドライブで Linux メモリ管理を使用する場合、I/O がアプリケーションによって完全に占有されないようにするために、次のことをお勧めします。 cgroups の I/O サブシステムを使用して、プロセス/プロセス グループの IOPS とスループットを制限します。CFQ スケジューラを使用する場合、ionice を使用してプロセスの I/O スケジューリング優先度を調整し、特に I/O を改善できます。コアアプリケーションの優先順位。 ionice は、アイドル、ベストエフォート、リアルタイムの 3 つの優先クラスをサポートします。このうち、ベストエフォートとリアルタイムもそれぞれ 0 ~ 7 のレベルをサポートしており、値が小さいほど優先度が高くなります。
以上がLinux ファイル システムの仕組み: インデックス ノードとディレクトリ エントリ内のすべてがファイルですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。