私のディレクトリはtmpfsを使います/tmp
。/tmp
コンピュータに使用中のファイルを置き換える前にアプリケーションのファイルを置き換えるにはどうすればよいですか?
/tmp
デフォルトでは、内部ファイルはプロセスで使用されるメモリよりもスワップ可能でなければなりません。
この答えのようですhttps://unix.stackexchange.com/a/90337/56970言葉になりますが、個々のディレクトリの互換性を変更することはできません。 cgroupについて知っていますが、tmpをcgroupに切り替える方法はありませんか?
答え1
すべてが順調に進むなら、カーネルは自分で「正しいことをする」と決めなければなりません。メモリプレッシャーがある場合は、さまざまな高度な経験的方法を使用して、何を交換して何を維持するかを決定します。これらの経験的な方法は、メモリ管理の広範な経験を持つ本当にスマートな人々が慎重に構築し、改善するのが難しいほど十分に優れています。
カーネルは、次の組み合わせを使用して何を変更するかを決定します。
- 最近のメモリ使用量。
- マッピング後にメモリが変更されたかどうか。たとえば、ヒープメモリが汚れてスワップに書き込まれる必要があるため、共有ライブラリはヒープメモリにプッシュされますが、共有ライブラリマッピングメモリは必要に応じてディスク上の元のファイルから再ロードできます。したがって、置き換えるためにそのページを作成する必要はありません。ここでは
tmpfs
バックアップがないため、メモリが常に汚れていることに注意してください(ゼロでいっぱいの新しいページでない限り)。 - のヒント
mprotect()
。 - さらにあるかもしれません。
短い答え:いいえ。メモリ管理方法に対するカーネルの決定を直接無視することはできません。
答え2
cgroupは、ファイルシステムではなくアプリケーションを制御するように設計されています。必要なのは、ファイルシステム全体に適用されるsysctlまたはmountオプションです。残念ながら、両方の機能はこの問題を念頭に置いて作成されたようではありません。これは、このような問題が非常にユニークであるためです。
この問題を解決するには、次のcronjobを作成してみてください。
*/5 * * * * find /tmp -type f -exec cat {} \; >/dev/null 2>&1
これにより、カーネルはすべてのファイルを読み取ってページをメモリに再スワップします。
つまり、ワークロードアプリケーションで頻繁にアクセスされるファイルは、基本的にcronjobで実行されるものと同じです(フルマウントではなく実際に使用する特定のファイルに対してのみ)。私はこれには何の利点もないと思います。
ここで実際の目標は何ですか?