web-dev-qa-db-ja.com

LinuxでApache2のすべてのディスクキャッシュを無効にする

ベンチマークの目的で、Apache 2に、メモリ内のキャッシュからロードするのではなく、要求された各ファイルをディスクからロードするように強制したいと思います。私が読んだことから、syncを実行し、

echo 3 > /proc/sys/vm/drop_caches

linuxのキャッシュを削除させてください。その後、特定のファイルに対する後続の要求はLinuxのキャッシュから処理されませんが、同じファイルに対するそれ以降の要求はLinuxのキャッシュから再度処理されます。これは、/ proc/sys/vm/drop_cachesがキャッシュを無効にしないため、その時点までにキャッシュされたもののみを破棄するためです。リクエストの前にキャッシュを削除することもできますが、別の解決策をお勧めします。 Apacheが要求された各ファイルをディスクから確実にロードするために他にできることはありますか?

なぜこれをしたいのですか:通常の操作ではキャッシュが有効になっていることを知っています。ただし、サーバーは、htmlページ、小さな画像など、頻繁にアクセスされる小さくてアクセス可能なファイルを提供していません。代わりに、非常に大きなファイルのセットから大部分が数メガバイトのサイズのファイルを提供しています。これらのファイルはかなり均一にアクセスされるため、個々のファイルにはほとんどアクセスされません。したがって、通常の操作では、ほとんどのアクセスでキャッシュヒットは発生しないが、ファイルをディスクからロードする必要があると思います。 Apacheのabベンチマークを使用してアクセスし、サーバーが処理できる1秒あたりのトランザクション数を測定するサンプルファイルがいくつかあります。残念ながら、私が得ている結果は、キャッシュのために楽観的すぎると思います。したがって、私はLinuxのディスクキャッシングを無効にしたいと思っています。

更新: これまでの回答 は、Apache自体のキャッシュを無効にする方法を教えてくれますが、Linuxカーネルによって行われるキャッシュを無効にする方法があるかどうかまだ疑問に思っています。

7
davitenio

Linuxですべてのディスクキャッシュを無効にできるとは思いません。

ハックとして、「sync; echo 3>/proc/sys/vm/drop_caches」を実行し続けて、メモリにキャッシュされているほとんどすべてのものをフラッシュすることができます。コンソールから

watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`

トリックを行います。上記の例では、Apacheまたは他のプロセスによってメモリに保持されているデータには影響しませんが、カーネルによって1秒以上キャッシュされたままになるものはありません。また、一部がロックされたまま開いているメモリマップファイルからデータをフラッシュしない場合もあります。

テスト実行の開始時に何もキャッシュしたくない場合で、テスト中にキャッシュするかどうかを気にしない場合は、「sync」と「echo 3>/proc/sys/vm」への呼び出しを1つ追加するだけです。テスト実行の開始時に「/ drop_caches」。

テストにデータベースにアクセスするスクリプトが含まれる場合は、データベースバックエンドに、RAMテスト間もキャッシュしないように指示する必要があります。

7
David Spillett

Mod_cacheモジュールを無効にすることで、Apacheのキャッシュの大部分を無効にできます。構成内の次の行をコメントアウトすると、うまくいくはずです。

  • LoadModule cache_module
  • LoadModule disk_cache_module
  • LoadModule mem_cache_module
2
David

いいえ、バッファキャッシュの使用を無効にすることはできません。これをプログラムで行う方法はいくつかありますが(たとえば、O_DIRECTでファイルを開く)、これを行うにはApacheを書き直す必要があります。

コアでは、IOサブシステムを複数のストリーミングメガバイトサイズのファイルに対してベンチマークしようとしているようです。Apacheのオーバーヘッドを画像に混ぜずにこれを行うには、もっと良い方法があります。

これを試みることに決めた場合は、マシンの物理メモリのほとんどをmallocする小さなプログラムを作成して、利用可能なディスクキャッシュの量を減らしてみてください。ベンチマークの実行中にプロセスが作成されないようにStartServersMinServers、およびMaxServersを同じ値に設定しない限り、モデルはこれとうまく相互作用しません)

1
Dave Cheney

私はここでひどくオフキルターかもしれませんが(間違った仮定をしている場合は知らせてください)、Linuxのディスクキャッシングはスワップと呼ばれ、スワップファイルまたはスワップパーティションを使用します。

swapoff -a 

ディスクキャッシュを無効にする必要があります。

0
Matt Simmons