ファイルキャッシュを使用せずに大きなファイルをより速くコピーできますか?


19

preloadパッケージを追加した後、アプリケーションは高速化されたように見えますが、大きなファイルをコピーすると、ファイルキャッシュがファイルのサイズの2倍以上に増えます。

単一の3〜4 GBの仮想ボックスイメージまたはビデオファイルを外部ドライブに転送することにより、この巨大なキャッシュはプリロードされたすべてのアプリケーションをメモリから削除し、ロード時間の増加と一般的なパフォーマンスの低下につながります。

キャッシュせに(つまり、ファイルキャッシュをバイパスして)大きなマルチギガバイトのファイルをコピーする方法はありますか?または、特定のフォルダーがキャッシュされるのをホワイトリストまたはブラックリストに登録する方法はありますか?

回答:


19

やなどのnocacheコマンドの前に追加できるユーティリティがあります。これは、追加のライブラリプリロードすることで動作して開いているすべての呼び出しにフラグを。ioniceniceposix_fadvisePOSIX_FADV_DONTNEED

簡単に言えば、それはアドバイスキャッシュがその特定のファイルのために必要されていないことをカーネルが。カーネルは通常、ファイルをキャッシュしません。参照してください。ここでの技術的な詳細については。

巨大なコピージョブには驚かされます。たとえば、実行中のシステムへの影響を最小限に抑えながらバックグラウンドでマルチテラバイトのディスクをバックアップしたい場合は、に沿って何かを行うことができますnice -n19 ionice -c3 nocache cp -a /vol /vol2

パッケージはUbuntu 13.10以降で利用可能になります。以前のリリースを使用している場合は、13.10パッケージをインストールするか、FrançoisMarierによるこの12.04バックポートを選択できます。


GUIを介して実行できること、および「キャッシュなし」フォルダーを単にブラックリストに登録する方法を期待していましたが、今のところこれを行う必要があります。
Veazer

12

単一の大きなファイルの場合dd直接 I / Oを使用してファイルキャッシュをバイパスします。

1つ(または数個)の大きなマルチギガバイトファイルを転送する場合は、次のように簡単に実行できますdd

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • directフラグは言うddカーネルのダイレクトI / Oオプションを(使用するO_DIRECTので、完全ファイル・キャッシュをバイパスし、リーディング、ライティングながら)。
  • bs物理ディスク操作の数を最小限に抑えるため、ブロックサイズオプションを合理的に大きな値に設定する必要がありますdd実行する必要があります読み込むために、/書き込みは、もはやキャッシュされませんし、あまりにも多くの小さな直接操作が深刻な景気後退につながることができます。
    • 1〜32 MBの値を自由に試してください。上記の設定は4 MB(4M)です。

複数/再帰的なディレクトリコピーの場合、残念ながら、簡単に利用できるツールはありません。通常cp、など直接I / Oをサポートしません

/ e iflags&oflagsが正しいiflag&oflagに変更されました


1
zsh**演算子で再帰を行うことができます。zshリポジトリから手動でインストールする必要があります。
モニカの復活-ζ--12年

1
実は違う。ddの奇妙な構文は**演算子を汚します。まだ引数を(dd.sh in.file out.fileファイル名に**を付けて)取得dd$1$2ddの奇妙な構文で汚されるべきではない、などを使用してファイル名を与えたシェルスクリプトを使用できます。
モニカの復職-ζ--12年

1
AFAIKは先読みキャッシュも無効にするため、Direct Makeは非常に遅くなります。これはおそらく必要ではなく、ベンチマークシナリオでも現実的ではありません。代わりに「iflag = nocache oflag = nocache」を使用します。これは、インファイルまたはアウトファイルをキャッシュする必要がないことをOSに正確に伝えます。
stolsvik

1

and をdd使用して、ディレクトリを再帰的にコピーできますfindmkdir

次の2つの問題を回避する必要があります。

  1. dd ディレクトリをどうするかわからない
  2. dd 一度に1つのファイルしかコピーできません

まず、入力ディレクトリと出力ディレクトリを定義しましょう。

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

次にcd、ソースディレクトリに移動して、find簡単に操作できる相対ディレクトリを報告します。

cd "$SOURCE"

からディレクトリツリーを複製$SOURCEします$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

からファイルを複製して、書き込みキャッシュ$SOURCE$TARGET省略します(ただし、読み取りキャッシュを利用します!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

これにより、ファイルの変更時間、所有権、およびその他の属性が保持されないことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.