スワップイベント直後にスワップスペースを確保

スワップイベント直後にスワップスペースを確保

私は多くの計算作業にLinuxマシンを使用していますが、時には特定の計算が多いRAMを消費します。作業が完了すると、使用されているスワップ領域と空きメモリがたくさん残ります。通常どおりに作業を実行すると、システム内の他のすべてのプロセスはその作業が完了するまで少し遅れます。 swapped back if すべてをすばやくRAMに再ページングするコマンドがあり、実行してから起きてトイレに行ったり戻ったりすると、すべてが早くなればいいようです。 。

私が見つけたこの問題これは、次のように(少なくともLinuxでは)これを行うことができることを意味します。

sudo swapoff -a
sudo swapon -a

ただし、これを実行しようとすると時間がかかります。永遠に- たった2-5MB/秒の速度でスワップスペースを確保します。方法必要以上に少なく価値がないようです。これは普通ですか? 「ランチに行く」時間の代わりに「トイレに行く」時に実行されるようにこのプロセスをスピードアップする方法はありますか?

答え1

最近同じ問題が発生し、スワップをすばやく整理するためにこれを作成しました。

#Single-proc function to core-dump swapped ranges > 1M to /dev/null
unswap(){ (awk -F'[ \t-]+' '/^[a-f0-9]*-[a-f0-9]* /{recent="0x"$1" 0x"$2}/Swap:/&&$2>1000{print recent}' /proc/$1/smaps | while read astart aend; do gdb --batch --pid $1 -ex "dump memory /dev/null $astart $aend" &>/dev/null; done&)2>/dev/null;};

#Loop to run unswap on the top 20 swap-consuming processes
grep VmSwap /proc/*/status 2>/dev/null | sort -nk2 | tail -n20 | cut -d/ -f3 | while read line; do unswap $line; done;

#Observe the number of core dumps currently running, along with free swap, over time. 
echo "Dumps Free(m)"; rcount=10; while [[ $rcount -gt 0 ]]; do rcount=$(ps fauxww | grep "dump memory" | grep -v grep | wc -l); echo "$rcount        $(free -m | awk '/Swap/{print $4}')"; sleep 1; done 

特定の環境でこれが機能しない場合、手順は次のとおりです。

1. 最も多くのスワップ領域を消費するプロセスのリストを取得します。

私の場合は、/proc/$pid/statusをチェックし、VmSwapラインでswapを使用していました。

# grep VmSwap /proc/*/status 2>/dev/null | sort -nk2 | tail -n5
/proc/22457/status:VmSwap:      3780 kB
/proc/22684/status:VmSwap:      4260 kB
/proc/7408/status:VmSwap:       4396 kB
/proc/31992/status:VmSwap:      9176 kB
/proc/2967/status:VmSwap:      60840 kB

2. 高スワッププロセスの場合、スワップ使用量が最も多いメモリアドレス範囲が見つかりました。

/proc/$pid/smapsからこれを取得します。

7f2fd1bc4000-7f2fd1d24000 rw-p 00000000 00:00 0 <<< Address range
Size:               1408 kB
Rss:                 900 kB
Pss:                 900 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:       900 kB
Referenced:            4 kB
Anonymous:           900 kB
AnonHugePages:         0 kB
Swap:                508 kB    << Swap used
KernelPageSize:        4 kB
MMUPageSize:           4 kB

3. gdb を使用して、これらのアドレス範囲を /dev/null に直接ダンプしました。

これにより、システムはそのメモリにアクセスしてスワップから取り出します。不要なIOを避けるために/ dev / nullに行ってください。

gdb --batch --pid $pid -ex "dump memory /dev/null $astart $aend"

私が最初に述べた手順では、かなり少ない数のコアダンプでほとんどのスワップを得るために1M未満のスワップを持つメモリ領域を使用することを省略しましたが、これは必須ではありません。

答え2

リストされたコマンドは、カーネルが必要なすべてのページをRAMに移動し、スワップを再度有効にする便利な方法です。パーティションではなく、ひどく断片化されたスワップファイルがある場合、または他のI / Oの実行中にこれを試していない場合は、なぜこれが遅いのかわかりません。

swappiness値()を調整することをお勧めします/proc/sys/vm/。値が低いほど、システムがページをディスクにページアウトする可能性が低くなります。

また、この機能を有効にすると、zswapページが圧縮され、スワップスペースが少なくなります。もちろん、いくつかのCPUを使用していますが、ページングよりも影響がはるかに少なくなります。

関連情報