1. 序章

Linuxファイルシステムのバッファとキャッシュを使用すると、I/O操作が高速になります。 バッファとキャッシュをクリアする方法について話すとき、キャッシュがどのように機能するかを疑う余地なく調べることは明らかです。

そこで、最初に、Linuxファイルシステムのキャッシュがどのように機能するかについて説明します。 次に、キャッシュの使用状況を監視する方法を示し、最後に、バッファとキャッシュを空にする方法を示します。 同様に、いくつかの基本的な展示分析を行って、キャッシュがフォームに対して真に機能していること、およびキャッシュのフラッシュと空の方法論がフォームに対してさらに真に入力されていることを確認します。

2. Linuxファイルシステムキャッシュのしくみ

Linuxのキャッシュはページキャッシュと呼ばれます。カーネルがファイルシステムディスクアクセスをキャッシュするために予約するのは、特定の量のシステムメモリです。 これは、全体的なパフォーマンスを高速化するためです。 Linuxの読み取りシステムコール中に、カーネルはキャッシュに要求されたデータブロックが含まれているかどうかを確認します。 もしそうなら、それは成功したキャッシュヒットになります。 キャッシュは、ディスクシステムへのI/Oを実行せずにこのデータを返します。

Linuxキャッシュアプローチはライトバックキャッシュと呼ばれます。 これは、最初に、データがキャッシュメモリに書き込まれ、ディスクに同期されるまでダーティとしてマークされることを意味します。 次に、カーネルは内部データ構造を維持して、キャッシュが追加のスペースを必要とするときにキャッシュから削除するデータを最適化します。 たとえば、メモリ使用量が特定のしきい値に達すると、バックグラウンドタスクがダーティデータをディスクに書き込み始め、それによってメモリキャッシュが空になります。

2.1. バッファとキャッシュの内容

キャッシングとバッファリングという用語は、同じ意味で使用されることがありますそれでも、バッファとキャッシュを区別する固有の事実を知っておく必要があります。

大まかに分類すると、バッファは、ある場所から別の場所に移動するときにデータを一時的に保存するために使用されるメモリの領域です。 バッファは、ページキャッシュの下に保存されているデータのディスクブロック表現です。 さらに、バッファには、ページキャッシュの下にあるファイルまたはデータのメタデータが含まれています。

一方、キャッシュは、頻繁にアクセスされるデータを格納して迅速にアクセスするための一時的なストレージ領域です。

2.2. freeコマンドを使用してバッファとキャッシュの使用状況を表示する

Linux free コマンドは、システムメモリの量とバッファおよびキャッシュに割り当てられたメモリの分析に役立ちます。

# free -m
             total        used        free      shared  buff/cache   available
Mem:          7457         209         6580          0         667        7004
Swap:           0           0           0

free コマンドからわかるのは、合計RAMが7.5GBあることです。 このうち、209 MBのみが使用されており、6.5GBは無料です。 バッファとキャッシュはこの667MBを使用しています。 それでは、1 GBのファイルを生成して読み取るコマンドを実行して、その数を増やしてみましょう。

# dd if=/dev/random of=/root/data_file count=1400000
# for i in `seq 1 10`; do echo $i; cat data_file >> large_file; done

ここで、この1 GBのファイルを確認し、freeコマンドで使用状況をもう一度確認します。

# cat large_file > /dev/null; free -m
             total        used        free      shared  buff/cache   available
Mem:          7457         206         5515          0        1735        6992
Swap:           0           0           0

バッファとキャッシュの使用量が667MBから1735MBに増加し、使用量が約1GB増加したことがわかります。

2.3. キャッシュがどのように機能するかの実験的検証

カーネルがキャッシュを使用してファイルを読み取る方法を確認するために、パフォーマンスの検証を行ってみましょう。 ファイルを読み取って/dev / null に書き戻し、ディスクからファイルを読み取るのにかかる時間をテストしてみましょう。 timeコマンドでtimeします。

# ls -l                                                                                                                              
total 525448                                                                                                                                           
-rw-r--r-- 1 root root  49032472 Nov 20 09:13 data_file                                                                                                
-rw-r--r-- 1 root root 490324720 Nov 20 09:15 large_file
# time cat large_file >> /dev/null                                                                                                   
                                                                                                                                                       
real    0m4.478s                                                                                                                                       
user    0m0.004s                                                                                                                                       
sys     0m0.388s

ファイルの読み取りには4.478秒かかりました。 もう一度読みましょう。 ファイルはファイルシステムキャッシュにあるため、現在どのくらいの時間がかかるかを確認するのは興味深いことです。

# time cat large_file >> /dev/null                                                                                                   
                                                                                                                                                   
real    0m0.602s                                                                                                                                       
user    0m0.002s                                                                                                                                       
sys     0m0.393s

ファイルがキャッシュされたとき、ファイルの読み取りにはわずか0.602秒しかかかりませんでした。

言うまでもなく、バッファとキャッシュを使用すると、I/O操作が高速になります。

3. バッファ、キャッシュ、およびスワップを空にする方法

ディスクキャッシングにより、システムの速度と応答性が大幅に向上します。 ただし、ディスクキャッシュは、特定のパフォーマンスのボトルネックを引き起こすことも知られています。 本当の問題は、Linuxが積極的にメモリへのキャッシュを開始したときに発生します。 このような状況では、実行中のアプリケーションに割り当てるために使用できる空きメモリが少ないことがわかります。 このメモリ不足により、システムは代わりにスワッピングを開始します。 ページキャッシュが非常に大きくなると(現在のスワップ使用量よりもはるかに大きくなる)、スワップインとスワップアウトが交互に発生します。 これは、ドロップキャッシュが必要な場合です。

3.1. ProcSysVMドロップキャッシュコマンド

バッファとキャッシュを空にしたい場合は、次の一連のコマンドを使用できます。

free && sync && echo 3 > /proc/sys/vm/drop_caches && free

今見たのは、キャッシュを削除する1つの方法です。 Linuxカーネルがキャッシュされたアイテムをドロップする方法は3つあります。 それぞれが、異なるキャッシュアイテムを削除する方法です。 また、数値引数をechoコマンドに変更するだけで実現できます。

echo 1 を使用して、ページキャッシュを解放できます。

echo 1 > /proc/sys/vm/drop_caches

echo 2 を使用して、dentriesおよびinodesを解放できます。

echo 2 > /proc/sys/vm/drop_caches

また、 echo 3 を使用して、ページキャッシュ、デントリー、およびiノードを解放できます。

echo 3 > /proc/sys/vm/drop_caches

3.2. スワップをクリアするコマンド

特定の状況下では、スワップをクリアする必要がある状況に遭遇する可能性があります。 スワップを無効または有効にするコマンドについて説明する前に、ファイルシステムメモリのどの部分がスワップと呼ばれるかを知っておく必要があります。 スワップスペースは、システムRAMから移動されたデータを一時的に保持します。

Linuxでは、物理メモリ(RAM)の容量がいっぱいになると、データはスワップの一部になります。 システムがより多くのメモリリソースを必要とし、RAMがいっぱいになると、メモリ内の非アクティブなページがスワップスペースに移動します。 それでは、スワップを無効または有効にするコマンドを見てみましょう。

swapoff -a && swapon -a

4. 結論

この記事では、フラッシュ操作の前後のキャッシュ動作の実験的検証について説明しました。 また、 /procファイルシステムにechoコマンドを送信するだけでバッファとキャッシュを空にする方法についても説明しました。 これで、ディスクキャッシュによってアプリケーションの読み込みが速くなり、実行がスムーズになることがわかりましたが、メモリがアプリケーションから奪われることは決してありません。 ただし、問題を回避するためにRAMをすばやくクリアする必要がある場合は、Linuxに非破壊的にキャッシュをドロップするように強制できます。

記事の終わりに向けて、メモリ管理スキームでスワップが果たす役割について簡単に説明しました。 そのすべての側面をカバーしたので、ディスクキャッシングはアプリケーションが現在必要としないRAMのみを借用していると結論付けることができます。 スワップは使用しません。