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


41

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

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

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

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

swappinessWikipediaも参照)を10andの値に減らしてみました0が、問題は解決しません。非アクティブな状態が1日続くと、カーネルはGUI全体が不要になったと判断し、RAMから消去します(ディスクに消去します)。長時間実行されるタスクは、広大なファイルツリーを読み取り、すべてのファイルを読み取ることです。そのため、キャッシングが役立つと考えるようにカーネルが混乱している可能性があります。ただし、ファイル名が約10億個の2 TB USB HDを1回スイープするだけでは、GB RAMを追加してもパフォーマンスはあまり向上しません。これは、ハードドライブの動作が遅い安価なラップトップです。単に十分な速度でデータをRAMに読み込むことができません。

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

「緊急事態」の正確な定義は議論の余地があるかもしれません。しかし、私が言いたいことを明確にするために:緊急事態は、システムをプロセスの交換または強制終了以外のオプションなしで放置することです。


緊急事態とは何ですか?- 本当に質問する必要がありますか?

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


最終編集: オペレーティングシステムレベルで要求したことを正確に行う回答を受け入れました。将来の読者は、アプリケーションレベルのソリューションを提供する回答にも注意してください。


11
「緊急」を定義し、これがスワップが使用される通常の状況とどのように異なるかについて何かを言います。
クサラナンダ

4
カーネルがスワップを使用できるようにするが、それ以外の場合は使用されない特別な種類の範囲外の「緊急イベント」を何らかの形で定義するかどうかを知りたいと思いました。私の知る限り、メモリのページングは​​遅く、とにかく「緊急事態」でしか行われず、「スワッピング」だけがこの動作を調整するために使用できる唯一のものです(しかし、私はLinuxユーザーではありません)。
クサラナンダ

2
いいえ、それは正しくありません。それは緊急時に行われるだけではありません。少なくとも、私の質問から、8GBのうち3GBしか使用していないことが明らかになったと思います...これは、ほとんど緊急事態ではありませんが、カーネルはとにかくスワップしています。スワップ性と周辺のトピックを読むことをお勧めします。スワッピングのさまざまな理由については、かなりの議論があります。私がカーネルに存在しない概念のために求めているもっともらしいですが、それを求めるための私の理由は、合理的に正当化されている...
フィリップCouling

4
私はアドバイスが常に「スワップなしで実行されることはない」ことを認識しています。ただし、メモリサイズがハードドライブ(SSDではなくHDD)の読み取り/書き込み速度を超えているため、スワップはますます悪い考えになっています。8GB RAM + 8GBスワップが16GB RAM + 0スワップを実行すると信じている人もいるようです。本当にそうなれば、Linuxカーネルに何か問題があります。
フィリップクーリング

7
@Philip Couling:いいえ、ポイントは16 GB RAM + 16 GBスワップが16 GBおよび0スワップよりも優れていることです-特にコードに17 GBのメモリが必要な場合:-)
jamesqf

回答:


11

最近、このような大きなスワップを持つことは、しばしば悪い考えです。OSがスワップするために数GBのメモリをスワップするまでに、システムはすでにクロールして死にました(見たとおり)

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

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

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

参考文献


私が理解したように、あなたはzramブロックデバイスを作成し、それをスワップとして使用し、HDDパーティションとして優先度の低いスワップで使用できると言っていますか?
フィリップクーリング

@PhilipCouling HDDを使用している場合は、はい、間違いなくzramまたは同様のソリューションを使用する必要があります。スワップの優先度はzramよりも低くする必要があります。これにより、Linuxは最初にzramを使い果たし、次にスワップを検討します。Ubuntuを使用している場合は、zram-configパッケージがすでに優先順位の設定を処理しています
phuclv

3
この答えを受け入れているのは、私が求めていたとおりのことをするようだからです。優先順位を下げて16GBスワップを有効にしている場合、カーネルはzswapが使い果たされたときにのみ使用します。IE:「緊急時」。debian-busterについては、zram-toolsをインストールするだけで簡単にセットアップできます。
フィリップクーリング

25

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

あなたがsystemdにを使用している場合は、設定することができます+MemoryAccounting=yesし、どちらかMemoryHigh/ MemoryMaxまたはMemoryLimit単位で、またはスライスは、それを含む(あなたはcgroup内のv1またはv2のを使用している場合にdepenedsを)。スライスの場合、スライスsystemd-run内のプログラムを実行するために使用できます。

Firefoxをメモリ制限付きで実行するための私のシステムの完全な例。これは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)ます。


1
使用するだけで、同等のポータブルなことはできませんulimitか?
古いプロ

1
@OldProはそうではありません。まず、ページキャッシュを含む総メモリ使用量(ここでは過剰になっている使用量)に制限はありません。第二に、メモリのulimitはプロセスごとであり、長時間実行されるタスクが分岐してもcgroupは機能します。
デロバート

新しいシステムでメモリアカウンティングがデフォルトで有効になっている理由は、systemdバージョン238の変更が原因だと考えました。
sourcejedi

1
@sourcejediそれは比較的最近です。メモリコントローラーが最初に導入されたとき、それを使用可能(使用中でさえない)にするだけで十分なパフォーマンスコストが発生し、一部のディストリビューションでは少なくともデフォルトで無効になり、カーネルコマンドライン引数を渡して有効にする必要がありました。パフォーマンスの問題は修正されたため、変更され、最近ではデフォルトでsystemdでもアクティブ化されます。
デロバート

14

非アクティブな状態が1日続くと、カーネルはGUI全体が不要になったと判断し、RAMから消去します(ディスクに消去します)。

カーネルは、それを信じてRight Thing™を実行しています。なぜ未使用の1つのメモリをRAM に保持し、キャッシュや何かとして使用するのではなく、本質的にそれを浪費するのですか?

Linuxカーネルはページを不必要にまたは予期的にスワップアウトするとは思わないので、それを行う場合はRAMに何か他のものを保存する必要があります。したがって、長時間実行されるタスクのパフォーマンスを改善するか、少なくともこの目標を達成します。

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

スワップを掃除したよう行き過ぎ、といくつかの理由ではなく、RAM内のすべてのフィット感のために、あなただけの「unswap」可能性がある場合でも、OOMキラーをトリガーする可能性がある2あなたが復活したい実行中のアプリケーションに関連するすべてのもの。

そのための1つの方法gdbは、影響を受ける各プロセスにデバッガーを接続し、コアダンプ生成をトリガーすることです。

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

あなたが書いたように、長時間実行しているアプリケーションは最初のパスの後に読み込んだデータを再利用していないので、長期キャッシングが役に立たない特定のケースにいます。次に、ウィルクロフォードが提案したような直接I / Oを使用してキャッシュをバイパスすることは、適切な回避策です。

また、あなただけ定期的にエコーすることにより、ファイルキャッシュをフラッシュ可能性がある13/proc/sys/vm/drop_cachesOSが、それはあなたのGUIアプリケーションと環境をスワップアウトするのは良いアイデアだと思っ前に、擬似ファイル。

Linuxシステムでバッファとキャッシュを空にする方法を参照してください詳細については。

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


2
考えられる原因について考えてくれてありがとう。関連する可能性があるため、質問に少し追加しました。アプリケーションのメモリに対するキャッシュの優先度を下げる方法があるのだろうか。
フィリップクーリング

5
「Linuxカーネルがページを不必要にまたは予期的にスワップアウトするとは思わないので、そうする場合は、RAMに何かを保存して、パフォーマンスを向上させる必要があります。」–この言葉遣いは少し曖昧だと思います。カーネルは、チャンスがあればいつでも確実にスワップにページを書き込みます(たとえば、ディスクI / Oがほとんどない場合)。ただし、RAMから削除することはありません。そうすれば、両方の長所を利用できます。これらのページがすぐに再び必要になる場合、それらはすでにRAMにあり、何もする必要はありません。緊急時には(OPがそれを置くよう)が発生した場合は、という理由だけで、RAMにそれらのページを解放する必要が
イェルクWミッターク

3
…すでにスワップ状態です。そしてまさにそれが、「緊急時のみ」にスワップを使用したくない理由です。なぜなら、緊急時にはシステムはすでにストレス状態にあり、最後に必要なことは大量のディスクI / Oを追加するからです。
イェルクWミッターク

2
スワップアウトを引き起こす原因は、おそらく長時間実行されているプロセスです:ディスク上のファイルにアクセスしています。メモリ内のこれらのファイルは、GUIのメモリよりも最近使用されています。
jpmc26

3
@JörgWMittagI / O使用率が低い場合、Linuxカーネルが「念のため」に、つまりRAMからページを解放せずにスワップ領域にプリエンプティブにページを書き込むという証拠がありますか?
jlliagre

10

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

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

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


1
別の同様の(ただし、おそらく簡単です、O_DIRECTにはアライメントの制限があり、読み込みが大きくない場合はパフォーマンスが低下するので、かなり簡単です)カーネルにそのデータを再び必要としないことを伝え、ページキャッシュ。(電話またはリンクの提供、申し訳ありません)
derobert

1
@derobert 1つは、nocacheコマンドを実行するための便利なハックです。(LD_PRELOADを使用して、いくつかのlibc呼び出しをハイジャックします)。
sourcejedi

6

ここにアイデアがありますが、私は自分で試したことはありません(そして、これを試す時間がないのが残念です)。

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


3

最近の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に搭載されています。スワップの使用の兆候を見たことがありません。私はそれを、スペースのために(数ギガバイト以上)オフにする必要があると判断しました。


1
過去には、一部のアプリケーションベンダーは、RAMと同じサイズ、またはRAMの2倍のサイズのスワップを推奨していました。私はそれを見て、もっと古いと感じます... 528MBの障壁に2.5GBのHDDがまだあるにも関わらず、どういうわけかその引用-とても昔のことです...数年前に私が同様の問題を見た理由を説明するかもしれません。sysctlを使用して修正したと思いますが、それが前夜だった場合の設定を正確に覚えていません。
プリフタン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.