パフォーマンス テストを実行する場合、ファイル システム キャッシュのヒットまたはミスがテスト結果に大きな影響を与える可能性があります。したがって、通常、このようなテストを実行する前に、使用されたファイルはシステム キャッシュから削除されます。Linuxでそれを行う方法は?
明確化:可能であれば、ソリューションに root 権限は必要ありません。
パフォーマンス テストを実行する場合、ファイル システム キャッシュのヒットまたはミスがテスト結果に大きな影響を与える可能性があります。したがって、通常、このようなテストを実行する前に、使用されたファイルはシステム キャッシュから削除されます。Linuxでそれを行う方法は?
明確化:可能であれば、ソリューションに root 権限は必要ありません。
スーパーユーザーとして、次のことができます。
ページキャッシュを解放するには:
dentry と inode を解放するには:
ページキャッシュ、dentry、inode を解放するには:
この操作によってデータが「失われる」ことはありません (キャッシュは、データが削除される前にディスクに書き込まれます)。たとえば、実行した場合、すべてのキャッシュをクリアする必要があります
sync; echo 3 > /proc/sys/vm/drop_caches
私が言ったように、スーパーユーザー (root) だけがそうすることができます。
ハ、私は答えを持っています:
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
int fd;
fd = open(argv[1], O_RDONLY);
fdatasync(fd);
posix_fadvise(fd, 0,0,POSIX_FADV_DONTNEED);
close(fd);
return 0;
}
posix_fadvise を簡単に呼び出すことができる、Eric Wong によるコマンド ライン ユーティリティがあります。
http://git.bogomips.org/cgit/pcu.git/tree/README
それは次のように簡単です
$ pcu-fadvise -a dontneed filename-to-evict
O_DIRECTの使用に関して:それは別の方法で結果を混乱させるでしょう。カーネルはファイルシステムデータをread()バッファに直接DMAしようとするため、追加のコピーを行わなくてもアプリケーションに渡すことができます。O_DIRECTがない場合、カーネルはファイルデータをページキャッシュにDMAし、ページキャッシュからread()バッファにコピーします。
アプリが実際に本番環境でO_DIRECTを使用する場合、これは問題ありません。O_DIRECTを使用してパフォーマンステストを実行してから、本番用にO_DIRECTを削除すると、パフォーマンステストは非現実的になります。
テストデータを別のファイルシステムに配置できる場合、テストのためにファイルシステムを新たにマウントすると、空のキャッシュが得られます。
"user" オプションを指定して /etc/fstab にテスト ファイルシステムをリストすると、スーパーユーザーにならずにテスト用にマウントできます。