web-dev-qa-db-ja.com

Linuxにスワップをメモリに読み込ませる

Linuxカーネルは、16 GBの物理メモリのほとんどを使用するアプリケーションを実行すると、メモリからほとんどのページをスワップアウトします。アプリケーションの終了後、関連するページを最初にスワップから読み込む必要があるため、すべてのアクション(コマンドの入力、ワークスペースの切り替え、新しいWebページを開くなど)が完了するまでに非常に長い時間がかかります。

Linuxカーネルに、各アプリケーションを手動で操作(および待機)せずに、スワップから物理メモリにページをコピーするように指示する方法はありますか?私はたくさんのアプリケーションを実行しているので、待機は常に苦痛です。

私はよくswapoff -a && swapon -aを使用してシステムを再び応答可能にしますが、これによりページがスワップからクリアされるため、次回スクリプトを実行するときにページを再度書き込む必要があります。

カーネルにすべてのページをスワップから読み取るように指示するために、おそらくsysfsを使用するカーネルインターフェイスはありますか?

編集:私は実際にすべてのスワップをswapcachedにする方法を探しています。 (derobertに感謝!)

[PS serverfault.com/questions/153946/… および serverfault.com/questions/100448/… は関連トピックですが、Linuxカーネルを取得する方法の質問には対応していませんスワップをクリアせずにページをスワップからメモリにコピーします。]

29
drrossum

memdumpプログラムに基づいて 最初に見つかった ここに スクリプトを作成して指定されたアプリケーションを選択的にメモリに読み込みます。 remember

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

使用法:のようなもの

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

スワップされていないメモリ(ギガバイト/秒)をすばやくスキップし、スワップが必要になると速度が低下します。

4
Vi.

それは/proc/sys/vm/page-cluster(デフォルト:3)。

カーネルのドキュメント(sysctl/vm.txt):

ページクラスター

page-clusterは、連続するページが1回の試行でスワップから読み込まれる最大ページ数を制御します。これは、ページキャッシュの先読みに対応するスワップです。上記の接続性は、仮想/物理アドレスではなく、スワップ空間で連続しています。つまり、それらは一緒にスワップアウトされました。

これは対数値です。ゼロに設定すると「1ページ」を意味し、1に設定すると「2ページ」を意味し、2に設定すると「4ページ」を意味します。ゼロはスワップ先読みを完全に無効にします。

デフォルト値は3(一度に8ページ)です。ワークロードがスワップを多用する場合、これを別の値に調整することにはいくつかの小さな利点があるかもしれません。

値が小さいほど、初期フォールトのレイテンシは低くなりますが、連続するページの先読みの一部であった場合、追加のフォールトと後続のフォールトのI/O遅延が発生します。

ドキュメントでは制限について言及されていないため、これを不当に高く設定して、すべてのスワップをすぐに読み戻すことができます。そしてもちろん、後でそれを正気な値に戻します。

11
derobert

魔法のように「システムを再び応答可能にする」ことはできないようです。ペナルティが発生するか、ページをスワップスペースからメモリに読み戻すか、後で発生しますが、いずれかの方法で発生します。確かに、あなたがswapoff -a && swapon -aすると、moreより少ないというよりむしろ苦痛を感じるかもしれません。そうでなければ、二度と必要とされなかったページがメモリにコピーされ、最終的には読み込まれずにドロップされるからです(考えてみてください:ヒープの大部分がスワップアウトされている間、アプリケーション。これらのページは、メモリに読み込まれることなく、完全に破棄できます)。

ただし、これによりスワップからページがクリアされるため、次回スクリプトを実行するときにページを再度書き込む必要があります。

ええと、スワップからメインメモリにコピーされたページのほとんどはとにかく変更されようとしているので、将来再びスワップするために元に戻す必要がある場合は、とにかくスワップに新たに書き込む必要があります。スワップは主にヒープメモリであり、読み取り専用ページ(通常はファイルバックアップ)ではないことに注意してください。

swapoff -a && swapon -aトリックはあなたが思いつくすべてのものと同じくらい良いです。

5
Celada

一番気になるプログラムを追加してみてください cgroupに追加してswappinessを調整する 。次にアプリケーションを実行したときに、追加したプログラムがスワッピングの候補になる可能性が低くなります。

一部のページはまだスワップアウトされている可能性がありますが、パフォーマンスの問題を回避できる場合があります。プログラムの多くのページがスワップされ、ページをRAMにスワップするためにプログラムが継続的に一時停止する必要がある場合、その多くはおそらく「停止して開始する」動作だけです。 4k刻みで。

または、実行中のアプリケーションをcgroupに追加してswappinessを調整し、そのアプリケーションが最もスワップファイルを使用する傾向があるアプリケーションにすることもできます。アプリケーションの速度は低下しますが、システムの残りの部分は節約されます。

5
Bratchley

ここでとても素敵な議論があります http://rudd-o.com/en/linux-and-free-software/tales-from-sensitivenessland-why-linux-feels-slow-and-how-to -fix-that これは、システムの認識された応答性を高めるために、コードのスワップアウトを防ぐ必要があるという考えで、スワップピネスの減少に要約されます(これが起こります)。これは実際にはあなたの質問に対する答えではありませんが、これにより問題が発生するのを防ぐことができます(アプリケーションがスワップされず、未使用のデータとページキャッシュのみがスワップされます)。

0
Fedxa