web-dev-qa-db-ja.com

緊急時にのみスワップ領域を使用するにはどうすればよいですか?

8 GBRAMおよび16GBスワップ)のDebian(バスター)ラップトップを持っています。非常に長時間実行しています実行中のタスク。これは、私のラップトップがチャーンする間、過去6日間電源が入っていないことを意味します。

これをしている間、私は定期的に自分のラップトップをラップトップとして使用する必要があります。これは問題にはなりません。長時間実行されるタスクはI/Oバウンドであり、USBハードディスク上のものを処理するため、RAM(<200 MB)またはCPU(<4%)はかかりません)。

問題は数時間後にラップトップに戻ると、非常に遅くなり、正常に戻るまで30分かかることがあります。これは非常に悪いので、クラッシュモニターはそれぞれのアプリケーションにフリーズ(特にブラウザウィンドウ)のフラグを付け、物事が誤ってクラッシュし始めます。

システムモニターを見ると、2.5 GBのうち、約半分がスワップにシフトされています。スワップスペース(swapoff /dev/sda8)を削除して、これが問題であることを確認しました。スワップスペースなしでそのままにしておくと、24時間後でもほぼ瞬時に元に戻ります。スワップを使用すると、最初の5分間は6時間しか残っていないので、実質的にはブリックです。離れている間でも、メモリ使用量が3 GBを超えないことを確認しました。

swappinessWikipedia )を10および0の値に減らしてみましたが、問題は解決しません。 1日間の非アクティブ状態の後、カーネルはGUI全体が不要になったと判断し、RAM(ディスクにスワップ)からワイプします)。長時間実行されているタスクは、広大なファイルツリーを読み取っていますすべてのファイルを読み取っています。そのため、キャッシュが役立つとカーネルが誤解している可能性があります。ただし、最大10億のファイル名を持つ2 TB USB HDを1回スイープすると、追加のGB RAM =は、パフォーマンスをあまり向上させません。これは、低速のハードドライブを備えた安価なノートパソコンです。データをRAMに十分な速度でロードすることはできません。

緊急時にスワップスペースのみを使用するようにLinuxに指示するにはどうすればよいですか?スワップなしで実行したくありません。予期しないことが起こり、OSが突然追加のGBを必要とする場合、タスクを強制終了させたくないので、スワップの使用を開始したいと思います。しかし、現時点では、スワップを有効のままにしておくと、必要なときにラップトップを使用できません。

「緊急事態」の正確な定義は議論の余地があるかもしれません。しかし、私が何を意味するのかを明確にするために:緊急事態とは、プロセスをスワップまたは強制終了する以外の方法なしでシステムが放置されることです。


緊急事態とは何ですか?-本当に質問しなければなりませんか?...建物!

この質問で緊急事態を構成する可能性のあるすべてを定義することはできません。しかし、たとえば、緊急事態は、カーネルがメモリにプッシュされて OOM Killer でプロセスの強制終了が開始された場合です。カーネルがスワップを使用してパフォーマンスを改善できると考えている場合、緊急事態ではありません。


最終編集:私は、オペレーティングシステムレベルで要求したとおりの答えを受け入れました。将来の読者は、アプリケーションレベルのソリューションを提供する回答にも注意する必要があります。

42
Philip Couling

最近このような巨大なスワップを行うことはしばしば悪い考えです。 OSがスワップする数GBのメモリをスワップするまでに、システムは既にクロールされていました(ご覧のように)。

se zram with a backup backup swap partitionを使用することをお勧めします。 ChromeOS 、AndroidおよびさまざまなLinuxディストリビューション( LubuntuFedora )は、特にRAMが少ないシステムの場合、何年もデフォルトでzramを有効にしています。これははるかに高速 HDD上のスワップよりも速く、この場合、システムの応答性を明確に感じることができます。SSDではそれほどではありませんが、ここでの ベンチマークの結果 によると、デフォルトのlzoアルゴリズムを使用した場合でも、まだ高速に見えます。 lz4 圧縮率を少し下げてパフォーマンスをさらに向上させます。デコード速度は 公式のベンチマークに基づいてlzoよりも約5倍高速です

実際、 Windows 10 および macOS も、デフォルトで同様の ページファイル圧縮 テクニックを使用します

zswap もありますが、使用したことはありません。おそらく試してみる価値があり、どちらがあなたのユースケースに適しているかを比較してください

その後、別の提案はこれらのIOにバインドされたプロセスの優先順位を下げるであり、システムが高負荷の場合でもすぐにコマンドを実行できるように、端末をより高い優先順位で実行したままにすることができます

参考文献

11
phuclv

1つの修正は、メモリcgroupコントローラーが有効になっていることを確認することです(デフォルトでは、半分最近のカーネルでも有効です。そうでない場合は、カーネルコマンドラインに_cgroup_enable=memory_を追加する必要があります)。次に、メモリ制限のあるcgroupでI/O集中型タスクを実行できます。これにより、消費できるキャッシュの量も制限されます。

Systemdを使用している場合、_+MemoryAccounting=yes_とMemoryHigh/MemoryMaxまたはMemoryLimitのいずれかを設定できます(cgroup v1またはv2を使用している場合は異なります)。ユニット内、またはそれを含むスライス。スライスの場合、_systemd-run_を使用してプログラムをスライスで実行できます。

メモリ制限付きでFirefoxを実行している私のシステムの1つからの完全な例。これはcgroups v2を使用し、rootではなくユーザーとしてセットアップされていることに注意してください(v1に対するv2の利点の1つは、これを非rootに委任することが安全であるため、systemdがそれを行うことです)。

_$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/Thunderbird &
_

スライスを使用する必要があったユーザーを1つ動作させることがわかりました。システム1は、サービスファイルにオプションを配置する(またはサービスで_systemctl set-property_を使用する)だけで機能します。

以下はサービスの例です(cgroup v1を使用)。最後の2行に注意してください。これはシステム(pid = 1)インスタンスの一部です。

_[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G
_

ドキュメントはsystemd.resource-control(5)にあります。

25
derobert

1日間の非アクティブ状態の後、カーネルはGUI全体が不要であると判断し、RAM(ディスクにスワップする)からワイプします。

カーネルはそれを信じてThe Right Thing™を行っています。なぜそれを未使用にしておくのか1 RAMのメモリなので、キャッシュまたは何かとして使用するのではなく、本質的にそれを無駄にしますか?

Linuxカーネルがページをスワップアウトしているのは当然のこととか予想外のものとは思わないので、そうする場合、RAMに何かを保存する必要があり、長期実行タスクのパフォーマンスを向上させる必要があります。

ラップトップを事前に再利用する必要がある時期がわかっている場合は、atコマンド(またはcrontab)を使用して、スワップのクリーンアップ(swapoff -a;swapon -a)をスケジュールできます。

スワップのクリーニングはやり過ぎであり、何らかの理由ですべてがRAMに収まらない場合にOOMキラーをトリガーすることもあるので、単に「スワップを解除する」ことができます。2 あなたが復活させたい実行中のアプリケーションに関連するすべて。

これを行う1つの方法は、影響を受ける各プロセスにgdbのようなデバッガーをアタッチし、コアダンプの生成をトリガーすることです。

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

あなたが書いたように、実行時間の長いアプリケーションは、最初のパスの後に読み取ったデータを再利用していないため、長期間のキャッシュが役に立たない特定のケースにいます。次に、Will Crawfordによって提案されたようなダイレクトI/Oを使用してキャッシュをバイパスすることは、適切な回避策です。

または、OSがGUIアプリケーションと環境をスワップアウトすることをお勧めする前に、1または3/proc/sys/vm/drop_caches疑似ファイルにエコーすることにより、定期的にファイルキャッシュをフラッシュすることもできます。

詳細については、Linuxシステムでバッファとキャッシュを空にするにはどうすればよいですか?を参照してください。

1ある意味で未使用:かなりの期間からアクティブに使用されなくなったため、メモリは所有者に関連しています。
2スワップ領域に保存されているRAMページに戻します。

14
jlliagre

実行しているプロセスは、自分で作成したものですか?

その場合、引用符を付けるO_DIRECTフラグを使用してファイルを開くようにコードを調整する価値があるかもしれません マニュアルページ -

このファイルとの間のI/Oのキャッシュ効果を最小限に抑えるようにしてください。これは一般にパフォーマンスを低下させますが、アプリケーションが独自のキャッシュを行う場合など、特別な状況で役立ちます。ファイルI/Oは、ユーザー空間バッファとの間で直接行われます。 O_DIRECTフラグは、それ自体でデータを同期的に転送しようとしますが、データと必要なメタデータが転送されるというO_SYNCフラグの保証はしません。同期I/Oを保証するには、O_DIRECTに加えてO_SYNCを使用する必要があります。詳細については、以下の注を参照してください。

10
Will Crawford

これは私がまだ試していないアイデアです(そして、今これを試す時間がないので残念です)。

小さなVMをバックグラウンドプロセス用に512MBのメモリで作成するとします。これにスワップ、コールを行い、ホストシステムのスワップをオフにするかどうかはわかりません。 。

6
X Tian

最近のOSは数年前と同じようにスワップを使用していないため、スワップを削除するか、約20%削減します(はシステムによって異なります)。それはおそらくあなたの質問のいくつかに答えます:

->公式redhat.com

以下のRed Hat情報の一部、

以前は、一部のアプリケーションベンダーはRAMと同じサイズ、またはRAMの2倍のサイズのスワップを推奨していました。ここで、2GBのRAMおよび2GBのスワップを備えた上記のシステムを想像してみてください。システム上のデータベースは、誤って5GBのRAMを備えたシステム用に構成されました。物理メモリが使用されるとスワップが使用されます。スワップディスクはRAMよりもはるかに遅いため、パフォーマンスが低下し、スラッシングが発生します。この時点で、システムへのログインも不可能になる可能性があります。書き込まれるメモリが増えるにつれて、最終的には両方の物理-スワップメモリ​​が完全に使い果たされ、OOMキラーが起動し、1つ以上のプロセスが強制終了します。この場合、かなりの量のスワップが利用できるため、パフォーマンスが低下する時間が長くなります。

そして

https://wiki.debian.org/Swap

上記のDebianリンクの一部、

使用するスワップの量に関する情報と考慮事項:

「推奨されるスワップ領域の容量は、従来、システムメモリの容量の2倍でした。これは、時間の経過とともにシステムメモリの1.5倍に変化しました。どちらの回答も適切なベースラインですが、時間の経過とともに質問に対する回答は次第に少なくなっています。システムおよび使用目的については、使用可能なシステムスワップを決定するさまざまな変数があります。」

あなたは試すことができます:

"Linuxでスワップを無効にする最良の方法"


パーソナルノート:


6 GBなので、RAMと最近のすべてのLinux OSで、Swapの使用を示す兆候は見たことがありません。私は必要があると判断しましたそれをオフにしますスペースのために(数ギガバイト以上)、システムが遅くなることがあります。

3
Tyþë-Ø