radix_tree_node
キャッシュ全体のサイズを減らすことなく、Linuxでキャッシュに使用されるスペースを減らすことは可能ですか?
たとえば、私は現在
$ sudo slabtop -sc --once | awk '{ if (0 + $1 > 0) { printf "%20s: % 6d MB, active %3.0f%%\n", $8, $7 / 1024, (100*$2/$1); } }'
ext4_inode_cache: 10387 MB, active 100%
dentry: 2042 MB, active 100%
radix_tree_node: 263 MB, active 90%
buffer_head: 117 MB, active 100%
kmalloc-rcl-64: 92 MB, active 100%
kmalloc-rcl-96: 79 MB, active 100%
dmaengine-unmap-2: 43 MB, active 100%
vm_area_struct: 18 MB, active 99%
task_struct: 13 MB, active 98%
ext4_extent_status: 12 MB, active 100%
ext4_groupinfo_4k: 10 MB, active 100%
inode_cache: 10 MB, active 90%
kmalloc-4k: 7 MB, active 99%
kmalloc-rcl-128: 7 MB, active 100%
kernfs_node_cache: 5 MB, active 100%
proc_inode_cache: 5 MB, active 99%
したがって、他のすべてのキャッシュに少なくとも98%アクティブですが、radix_tree_node
90%のみアクティブです。システムは多くのメモリを無駄にしませんが、radix_tree_node
非アクティブキャッシュを削除するためにサイズを縮小すると、キャッシュ全体の使用量が増加するようです。slabtop -sc
を実行しましたが、それは間違った会計だと思いますUSE 0%
。radix_tree_node
たとえば、キャッシュはわずか20%で、/proc/sys/vm/vfs_cache_pressure
どちらもアクティブな状態が100%であるため、削減する必要があるようです。私のワークロードの場合、システムは多数のディレクトリエントリを計算する必要があります。dentry
ext4_inode_cache
ベストアンサー1
実験の後は、Linuxカーネルバージョン5.4以降を実行し、必要に応じて調整する必要があると言いたいと思います/proc/sys/vm/vfs_cache_pressure
。システムが遅くならない可能な最小値を使用しようとしています。私の経験ではvfs_cache_pressure
、カーネルバージョン5.3では1〜10の範囲の値がうまく機能しますが、カーネルバージョン5.4では同様の動作を得るには100に近い値が必要です。
値が低いほど、vfs_cache_pressure
より多くのディレクトリメタデータをRAMに保持できるため、プロセスがファイルにアクセスするときに記憶媒体はファイルの実際の内容を取得するだけです。これは、ランダムアクセス速度が遅いHDDの場合に特に重要です。ストレージメディアの場合、システムは複数のレベルのディレクトリを読み取る必要があり、各ディレクトリが物理ストレージメディアの異なる領域にあるため、ディープディレクトリ層のメタデータを取得することはランダムなデータアクセスとして見えます。
ただし、あまりにも小さくすると、vfs_cache_pressure
システムがキャッシュからディレクトリメタデータを削除するのではなくスワップを開始でき、パフォーマンスが低下する可能性があります。私はこれがカーネルバージョン5.3と5.4の最も重要な違いだと思います。バージョン5.3では、システムがRAMに残るようにスワップを開始しないようにvfs_cache_pressure
常に設定できます。カーネルバージョン5.4を使用しているシステムでは、次のことを知っていると交換が楽しくなります。1
dentries
100
/proc/sys/vm/vfs_cache_pressure
との様々な組み合わせをベンチマークしてみるべきだと思います/proc/sys/vm/swappiness
。現在
vfs_cache_pressure
120とswappiness
80を実行していますが、バックグラウンドプロセスがシステム内の多くのディレクトリをチェックするときに時折遅くなることがあります(たとえば、バックアップスクリプトがシステム上の新しいファイルをチェックする場合など)。私の考えでは、システムがキャッシュにRAMを使用する現在の方法はあまりにもdentries
積極的であり、より多くのメモリを要求するプログラムは、要求を処理する前に他のキャッシュを削除してRAMを解放する必要があるときに遅くなります。