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


28

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

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

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

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

編集:私は確かにすべてのスワップをswapcachedにする方法を探しています。(デロバートに感謝!)

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


すべてのスワップをシステムのメモリのキャッシュにしたいですか?だからあなたはあなたが自由にリロードできるシステムのメモリのイメージが必要ですか?これは基本的に休止状態の仕組みです。システムはメモリをディスクにイメージ化し、電源をオフにし、電源投入時にイメージを復元します。そのスレッドに続くクエリであなたに役立つ可能性があると思いますか?たとえば、メモリのイメージを作成し、スワップを無効にし、タスクを完了し、イメージを復元して繰り返した場合、それはあなたがやりたいことですか?
mikeserv

これにより、スワップがswapcached状態のままになるとは思わない。このように、あなたの提案はswapoff-swaponメソッドの代替案であるように思えます。
drrossum

いいえ、それはスワップをキャッシュしません(確かに、私には少し奇妙です)、あなたが最も不可欠だと思ういくつかの時点でRAMをキャッシュし、次にタスクが完了しました。集中的なタスク中のスワップが必要な場合は、そのタスクの速度を落とすだけです。ページを入れ替えるのに余分な時間が必要になります。
mikeserv

回答:


4

ここで最初に見つかった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] [   <=>    ]
# 

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


このツールは、まさに私が探していたものです。ありがとう!
drrossum

私の観察から、スワップされたページはRAMにコピーされますが、スワップからは削除されません(少なくとも、スワップの使用量がわずかに減少するため、ほとんどは削除されません)。私の解釈では、Linuxは各ページの2つのコピーを保持し、1つはRAMに、もう1つはスワップに保持します。これが正しく処理されると、スワップをキャンセルして再度追加するよりも優れています。これは、二重ページを再度スワップする必要がある場合、別のコピーが不要になるためです。確認できるカーネルの専門家に感謝します。
ジョヴァンニマスチェラーニ

11

それが役立つ/proc/sys/vm/page-cluster場合があります(デフォルト:3)。

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

ページクラスター

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

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

デフォルト値は3(一度に8ページ)です。ワークロードがスワップ集約型である場合、これを異なる値にチューニングすると、いくつかの小さな利点があります。

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

ドキュメントには制限が記載されていないため、このバカげた値を設定して、すべてのスワップをすぐに読み返すことができます。そしてもちろん、後でそれを正常な値に戻します。


これは有用な回避策のように聞こえます。2つの手動介入をスリープコマンドと組み合わせて、単一のユーザー介入にすることができます。ただし、アクセスされるページから連続して読み取るだけであるため、必ずしもすべてのスワップが非常に高速にスワップキャッシュされるわけではありません。ただし、これはこれまでの最善のソリューションです。ありがとう!
drrossum

tbhこれはおそらくあなたが得るつもりの最良の解決策です。聞いたことはありませんが、スワップインが一連の小さなIOPではなく一連の大きなIOPに変わるように見えるため、パフォーマンスの問題の原因となっている可能性があります。あなたの個々の状況に完全に対応した何かがあった場合、私は合法的に驚くでしょう。
ブラッチリー

さらに言えば、多数の小さなスワップインが連続してスローダウンする場合、page-cluster値を恒久的に調整するだけでもパフォーマンスが向上する可能性があります。
イルマリカロネン

5

最も関心のあるプログラムをcgroupに追加し、swappinessを調整して、アプリケーションが次に追加したプログラムを実行するときにスワップの候補となる可能性が低くなるようにすることができます。

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

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


4

魔法のように「システムを再び応答可能にする」ことはできないように思えます。ペナルティーを負うか、スワップ領域からメモリにページを読み戻すか、後で発生しますが、いずれにせよ発生します。あなたのような何かを行う場合には確かに、swapoff -a && swapon -aあなたが感じることがあり、よりそうでない場合は再度必要ありませんし、最終的に読まれずに廃棄されたことがないでしょう、あなたがメモリに戻ってコピーする一部のページを強制するので、痛みというよりも少ない(と思う:あなたは、アプリケーションの中を終了そのヒープの大部分はスワップアウトされます;それらのページは、メモリに読み込まれることなく完全に破棄されます)。

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

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

あなたのswapoff -a && swapon -aトリックは思いつくものなら何でも良いと思います。


それは、私たち2人が同時にまったく同じことを言っていることです;)
goldilocks

@goldilocksええ、私の準備が整う前にあなたの答えが表示されましたが、すでに¾完了したので、それで固執しました:
Celada

あなたとgoldilocksは同じことを言っていますが、これがスワップキャッシングの仕組みだとは思いません。私の理解では、スワップとメモリに同時にページを置くことができます。スワップページは、メモリ内のページが更新されると無効になります。
drrossum

私はそれを信頼し、あなたがデビッドSpillettで呼ば答えは正しいです:あなたは確かに同時にスワップとRAM内のページを持つことができます...しかし、RAMのバージョンが変更されますまでの間だけ。次に、スワップ内の古いコピーを破棄する必要があります。「スワップからコピーされたページはほとんど変更されそうです」と言ったとき、私はこれがほとんどの場合に起こることを期待しているので、ページは期待していません両方の場所で心配する価値のある重要な部分です。
セラダ

使用シナリオは異なる場合があります。大きなヒープを持つアプリケーションが多数あり、頻繁に読み取りと書き込みが行われる場合があります。私の感覚では、ほとんどの人はそのようなシナリオを持っていません。しかし、あなたがそうするなら、私はあなたが正しいと思います:swapoff -a && swapon -aあなたにとって良くないでしょう。その場合/proc/<each-process>/mem、メモリの各ページをスキャンして読み取り、RAMに存在することを確認するものが必要になると思います。それが存在するかどうかわからない。
セラダ

0

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


これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.