回転:linuxファイルシステムIO性能最適化


LINUX SAでは、CPU、IO、メモリなどのシステムの最適化が重要になります.ここでは、IOの最適化に関する非常に良い記事を転載し、参考と学習を提供します.

一、ページキャッシュの情報について、


cat/proc/meminfo 
見えます.ここでCachedとはpagecacheに使用されるメモリサイズ(diskcache-SwapCache)を指す.キャッシュ・ページに書き込むと、Dirtyの値が増加します.
キャッシュページのハードディスクへの書き込みを開始すると、Writebackの値は書き込みが終了するまで増加します. 
Linuxはpdflushプロセスでデータをキャッシュページからハードディスクに書き込んで、どれだけのpdflushプロセスがあるかを確認します
cat/proc/sys/vm/nr_pdflush_threads
pdflushの動作は/proc/sys/vmのパラメータによって制御される
/proc/sys/vm/dirty_writeback_centisecs (default 500): 
1/100秒、pdflushを起動してキャッシュページデータをハードディスクに書き込む時間はどれくらいですか.デフォルトでは、5秒で2つ(複数)のスレッドが起動します.
wrtebackの時間がdirtyより長い場合writeback_centisecsの時間、問題が発生する可能性があります.
 
pdflushの最初のことは/proc/sys/vm/dirty_の読み取りですexpire_centiseconds(default 3000)1/100秒.キャッシュページのデータの有効期限(古いデータ)は、次のサイクルでハードディスクに書き込まれます.デフォルトの30秒は長い時間です.
2つ目は、メモリがハードディスク(HDD)に書き込む限度額に達しているかどうかを判断することです.パラメータによって、/proc/sys/vm/dirty_background_ratio(default 10)パーセンテージ値は、期限切れページキャッシュ(ダーティページキャッシュ)の最大値を保持します.MmeFree+Cached-Mappedの値を基準としています
pdflushはハードディスクに書き込み、2つのパラメータを見ます.1データがページキャッシュに30秒を超えているかどうか、もしそうであれば、汚れたページキャッシュとしてマークされています.2ダーティページキャッシュがワークメモリの10%に達しているかどうか.
以下のパラメータはpdflush/proc/sys/vm/dirty_にも影響します.ratio(default 40)の総メモリの最大パーセント、システムが持つことができる最大の汚れたページキャッシュの総量.この値を超えると、pdflush書き込みハードディスク(HDD)が開きます.cacheの成長がpdflushより速い場合、システム全体が40%のときにI/Oボトルネックに遭遇し、すべてのI/Oがpdflushによってハードディスクに格納されるのを待ってから再開します.
高度な書き込み操作があるシステムdirty_background_ratio:主にパラメータを調整します.ハードディスク(HDD)に一気に大量に書き込むのではなく、キャッシュを継続する必要がある場合は、この値を下げます.dirty_ratio:第2の調整パラメータ.
Swappingパラメータ/proc/sys/vm/swappinesのデフォルトでは、linuxは物理メモリからハードディスクキャッシュにマッピングする傾向があり、ハードディスクキャッシュをできるだけ大きく維持します.未使用のページキャッシュはswap領域に格納されます.数値が0の場合、swapping 100の使用は避けられ、できるだけswappingを使用してswappingを少なくすると、プログラムの応答速度が増加します.swappingを多用すると、システムの可用性が向上します.
大量の書き込みがある場合は、I/Oの長時間の待ち時間を避けるために、$echo 5>/proc/sys/vm/dirty_を設定できます.background_ratio$ echo 10 >/proc/sys/vm/dirty_ratio
ファイルシステムのデータバッファには頻繁なメモリ割り当てが必要です.メモリを保持する値を大きくすると、システムの速度と安定性が向上します.8 G未満のメモリ、保持メモリ64 M、8 G以上の設定256 M$echo 65536>/proc/sys/vm/min_free_kbytes
I/Oスケジューラcat/sys/block/[disk]/queue/scheduler
4におけるスケジューリングアルゴリズムnoop anticipatory deadline[cfq]deadline:deadlineアルゴリズムは、既定のIO要求に対して最小の遅延時間を保証する.anticipatory:IOが発生した後、プロセス要求IOが追加された場合、デフォルトの6 ms推測時間が生成され、次のプロセス要求IOが何をしているのか推測されます.これは、ランダム読み出しに大きな遅延をもたらします.データベースへの応用はまずいが,Webサーバなどではうまくいく.cfq:各プロセスに対してIOキューを維持し、各プロセスからのIOリクエストはcfqによって順番に処理され、各IOリクエストに対して公平である.離散読解の応用に適している.noop:すべてのIOリクエストをFIFOキュー形式で処理します.デフォルトIOではパフォーマンスに問題はありません.
スケジューラ$echo deadline>/sys/block/sdX/queue/schedulerを変更するには、データベース・サーバでdeadlineアルゴリズムが推奨されます.
スケジューラリクエストキューの$echo 4096>/sys/block/sdX/queue/nr_を上げるrequests
大量のリードリクエストがあり、デフォルトのリクエストキューが対応できず、この値を上げることができます.欠点は、一定のメモリを犠牲にすることです.連続読み出しのスループットを増加させるために、プリフェッチデータ量を増加させることができる.プリフェッチの実際の値は適応的であるため、小さなランダムアクセスのパフォーマンスを低下させることなく、より高い値を使用します.$echo 4096 >/sys/block/sdX/queue/read_ahead_kb LINUXがプロセスが順次ファイルを読み出すと判断した場合、プロセスに必要なファイルのデータを事前に読み出し、キャッシュに格納します.
サーバがディスク書き込みのピークに達し、リクエスト処理の遅延が3秒を超える.カーネルパラメータを調整することで、書き込みアクティビティのピークを頻繁に複数回書き込み、書き込みごとのデータが少ないように分散します.これにより,スパイクの書き込み操作を平成の複数回書き込み操作に削ることができる.カーネルが書き込み操作を組み合わせる機会があまりないため、このように実行する効率は低い.しかし、忙しいサーバでは、書き込み操作がより一貫して行われ、インタラクティブなパフォーマンスが大幅に向上します.
<strong>/proc/sys/vm/dirty_ratio </strong>

ファイル・システムのライト・バッファのサイズを制御します.単位はパーセントです.システム・メモリに占める割合を示します.ライト・バッファがシステム・メモリにどのくらい使用されているかを示します.ディスクへのデータの書き出しを開始します.増大すると、ディスク書き込みバッファにより多くのシステムメモリが使用され、システムの書き込みパフォーマンスが大幅に向上します.ただし、継続的で一定の書き込みが必要な場合は、その数値を下げる必要があります.
<strong>/proc/sys/vm/dirty_background_ratio</strong>

ファイルシステムのpdflushプロセスを制御し、ディスクをリフレッシュするタイミングを指定します.単位はパーセンテージで、システムメモリのパーセンテージを表し、pdflushはメモリの内容とファイルシステムを同期するために使用され、例えば、ファイルがメモリの中で変更されると、pdflushはそれをハードディスクに書き込む責任を負う.メモリのゴミページが10%を超えるたびに、pdflushはこれらのページをハードディスクにバックアップします.増大すると、ディスク書き込みバッファにより多くのシステムメモリが使用され、システムの書き込みパフォーマンスが大幅に向上します.ただし、継続的で一定の書き込みが必要な場合は、次の値を下げます.
<strong>/proc/sys/vm/dirty_writeback_centisecs</strong>

カーネルの汚れたデータリフレッシュプロセスpdflushの実行間隔を制御します.単位は1/100秒です.デフォルト値は500、つまり5秒です.もしあなたのシステムが動作を書き続けるならば、実際にはこの数値を下げたほうがいいです.そうすれば、ピークの書き込み操作を平成の複数回書き込み操作に削ることができます.もしあなたのシステムが短期的にピーク式の書き込み操作であり、書き込みデータがあまり(数十M/回)なく、メモリが比較的豊かである場合は、この数値を大きくする必要があります.このパラメータの設定はdirty_より小さいはずです.expire_centisecsですが、小さすぎたり、I/Oが小さすぎたりして、かえってシステムの性能を低下させます.具体的には、生産環境でテストする必要がある場合があります.1:6(dirty_expire_centisecs:dirty_writeback_centisecs)の割合が良いそうです.
<strong>/proc/sys/vm/dirty_expire_centisecs</strong>

Linuxカーネル書き込みバッファ内のデータが「古い」ことを宣言すると、pdflushプロセスはディスクに書き込むことを考え始めます.単位は1/100秒です.デフォルトでは30000、つまり30秒のデータが古くなってもディスクがリフレッシュされます.特別なリロードの書き込み操作では、この値を適切に縮小してもよいが、あまり縮小することはできない.縮小しすぎるとIOの向上が早すぎるからだ.もちろん、システムメモリが大きく、書き込みモードが間欠的で、書き込むたびにデータが大きくない(例えば数十M)場合は、この値は大きいほうがいいです.
<strong>/proc/sys/vm/vfs_cache_pressure</strong>

カーネル回収がdirectoryとinode cacheメモリに使用される傾向を示す.デフォルト値100は、カーネルがpagecacheとswapcacheに基づいてdirectoryとinode cacheを合理的なパーセントに維持することを示す.この値を100未満に下げると、カーネルはdirectoryとinode cacheを保持する傾向にあります.この値を100を超えると、カーネルがdirectoryとinode cacheを回収する傾向にあります.
<strong>/proc/sys/vm/min_free_kbytes</strong>

Linux VMの空きメモリの最低保持量(Kbytes)を示します.デフォルト設定:724(512 M物理メモリ)
<strong>/proc/sys/vm/nr_pdflush_threads</strong>

現在実行中のpdflushプロセスの数を示します.I/O負荷が高い場合、カーネルは自動的にpdflushプロセスを増やします.
<strong>/proc/sys/vm/overcommit_memory</strong>

カーネルがメモリに割り当てられるポリシーを指定します.値は0、1、2です.
0は、カーネルが使用可能なメモリ供給用プロセスが十分に使用されているかどうかを確認することを示します.十分なメモリがある場合は、メモリ申請が許可されます.そうでない場合、メモリ申請に失敗し、エラーを適用プロセスに返します.
1は、カーネルが現在のメモリの状態にかかわらず、すべての物理メモリを割り当てることができることを示します.
2は、カーネルがすべての物理メモリとスワップ領域の合計を超えるメモリの割り当てを許可することを示す(overcommit_ratio参照).
デフォルト:0
<strong>/proc/sys/vm/overcommit_ratio</strong>

overcommit_memory=2で、メモリのパーセンテージをオーバーロードでき、システム全体で使用可能なメモリを以下の式で計算します.システムはメモリを割り当てることができます=空間を交換します+物理のメモリ*overcommit_ratio/100デフォルト:50(%)
<strong>/proc/sys/vm/page-cluster</strong>

一度swap領域に書くときに書き込むページ数を表し、0は1ページ、1は2ページ、2は4ページを表す.デフォルト:3(2の3次、8ページ)
<strong>/proc/sys/vm/swapiness</strong>

システムのスワップ動作の程度を示し、数値(0-100)が高いほどディスクスワップが発生する可能性があります.
変更:/etc/sysctl.conf
<strong>vm.dirty_ratio = 40</strong>

sysctl -p
表示:
<strong>find /proc/sys/vm -name dirty* -print | while read name; do echo $name ;cat ${<strong>name</strong> </strong>