私はDebian(Buster)ラップトップを持っています。8GBRAMと16GBのスワップ。私は非常に長い間実行されているタスクを実行しています。これは、私のラップトップが過去6日間点灯していたことを意味します。
これをしながら、定期的にラップトップをラップトップのように使用する必要があります。これは問題ではありません。長期実行ジョブはI/Oにバインドされており、USBハードドライブのコンテンツで作業し、RAM(<200MB)またはCPU(<4%)をあまり使用しません。
問題は数時間後にラップトップを再使用すると、速度が非常に遅くなり、通常に戻るまでに30分かかります。これは非常に深刻で、クラッシュモニターはそのアプリケーション(特にブラウザウィンドウ)をハングしたとマークし、誤ってクラッシュし始めました。
システムモニターを見ると、使用されている2.5GBの半分がスワップに移動しました。スワップスペース()を削除して問題であることを確認しましたswapoff /dev/sda8
。スワップスペースなしでそのままにすると、24時間経ってもほぼすぐに再び生き返ります。交換すると、最初の5分間は事実上ブリックで、残り時間は6時間だけです。メモリ使用量が絶対超過しないことを確認しました3GB周りにいなくても。
縮小しました交換性(参照:ウィキペディア)10
をとの値に変更し0
ましたが、問題は残ります。日中にアクティビティがない場合、カーネルはGUI全体が不要と判断し、それをRAMから削除します(ディスクに置き換えます)。長期実行タスクは、巨大なファイルツリーを読み、各ファイルを読み取ることです。したがって、カーネルはキャッシュが役に立つと誤って考えることができます。ただし、一度に約10億のファイル名を含む2 TB USB HDをスキャンするとき、追加のGB RAMはパフォーマンスに大きな影響を与えませんでした。これは遅いハードドライブを備えた安価なノートパソコンです。単にデータをRAMに十分速くリロードすることはできません。
緊急時にのみスワップスペースを使用するようにLinuxに指示する方法は?私はスワップなしで走りたくありません。予期しないことが起こり、OSに突然追加の数GBが必要な場合は、作業を中断したくないので、スワップを使用することを好みます。ただし、現在スワップを有効にすると、必要に応じてノートブックを使用できなくなります。
「緊急状況」の正確な定義は議論の余地があります。しかし、私が何を意味するのかを明確にすると、パニックはシステムにプロセスを交換またはシャットダウンする以外に他のオプションがないときです。
緊急事態とは何ですか?-ぜひ尋ねなければなりませんか? …燃える建物の中に自分自身を見つけないでください!
この質問では、緊急事態を構成できるすべてを定義することは不可能です。ただし、たとえば、カーネルにメモリが多すぎて次のようにプロセスを終了し始めると、パニックが発生する可能性があります。メモリオーバーフローキラー。カーネルがスワップを使用してパフォーマンスを向上させることができると思うとき、パニックはありません。
最終編集: OSレベルで要求されたものと正確に一致する回答を受け入れました。将来の読者は、アプリケーションレベルのソリューションを提供する答えも参照する必要があります。
答え1
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は、オプションをサービスファイルに入れるか、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)
。
答え2
今日、そのような大きな規模の交換をするのは一般的に悪い考えです。 OSが数GBのメモリしか交換しないと、システムはクロールされて死にます(見てわかるように)。
楽しむ使用zram
小さなバックアップスワップパーティションが必要です。。次のような多くのオペレーティングシステムChromeOS、Android、およびさまざまなLinuxディストリビューション(ルブンツ、Fedoraの帽子)zramは、特にRAMが少ないシステムでは、長年にわたってデフォルトで有効になっています。それはるかに早くこの場合、ハードドライブの交換と比較してシステムがどれだけ反応するかを確実に感じることができます。これはSSDではあまり真実ではありませんが、ベンチマーク結果はここにあります。基本的なlzoアルゴリズムを使用しても、まだ速いようです。次に変更できます。lz4少し低い圧縮率でより良いパフォーマンスを得る。デコード速度は公式ベンチマークによると、lzoよりほぼ5倍高速です。
実際にWindows 10そしてアップルシステムまた、次のようなものを使用してください。ページファイルの圧縮基本技術
しかもzswap
使ったことないけど。試してみて、どちらがあなたのユースケースに適しているかを比較する価値があるかもしれません。
それ以降のもう一つの提案はIO集中型プロセスの優先順位を下げます。また、システム負荷が高い場合でも、すぐにコマンドを実行できるように、端末をより高い優先順位で実行させることもできます。
追加読書
- Arch Linux - パフォーマンスの向上 - Zramまたはzswap
- パフォーマンスを向上させるためにZSwapを有効にする
- zRAMを有効にしてメモリ処理を改善し、スワッピングを減らします。
- Ubuntuメモリが不足していますか? ZRAMを有効にする
- ZRAMとZSWAPの違い
- zram、zswap、zcache 最終ガイド: いつどれを使うか
- Linux、SSD、スワップ
- https://wiki.debian.org/ZRam
- https://www.kernel.org/doc/Documentation/blockdev/zram.txt
- https://wiki.gentoo.org/wiki/Zram
答え3
日中にアクティビティがない場合、カーネルはGUI全体が不要と判断し、それをRAMから削除します(ディスクに置き換えます)。
カーネルがやっていること正しい仕事™信じてください。なぜRAMに1を使用せずに保持し、キャッシュなどとして使用するのではなく、実際に無駄にするのですか?
私はLinuxカーネルが理由や期待なしにページを交換するとは思いません。したがって、もしそうなら、長期実行ジョブのパフォーマンスを向上させるためにRAMに他のものを保存する必要があるか、少なくともそれが目標です。
ラップトップの再利用が必要な時期を事前に知っている場合at
(または)、コマンドを使用してcrontab
スワップクリーンアップをスケジュールできますswapoff -a;swapon -a
。
スワップ領域をクリーンアップすることは少し作業になる可能性があり、OOMキラーを引き起こす可能性があるため(何らかの理由ですべてがRAMに収まらない場合)、すべてのコンテンツを復元したい実行中のアプリケーションに関連する2を「スワップ解除」するだけです。
gdb
1つのアプローチは、影響を受ける各プロセスにデバッガを接続し、コアダンプの生成をトリガーすることです。
# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit
作成中に、長期実行アプリケーションは初期パス後に読み取ったデータを再利用しないため、長期キャッシュが役に立たない特定の状況に直面します。その後、Will Crawfordの提案に従って、直接I / Oを使用してキャッシュをバイパスするのが良い解決策になります。
あるいは、オペレーティングシステムがGUIアプリケーションと環境が変更されたと考える前に、エコーファイルまたは1
ダミーファイルを介して定期的にファイルキャッシュを更新することもできます。3
/proc/sys/vm/drop_caches
バラよりLinuxシステムでバッファとキャッシュを消去する方法は?もっと学ぶ。
1未使用の意味:かなりの期間、もはや積極的に使用されなくなりましたが、メモリは依然として所有者に関連付けられています。 2スワップ領域に保存されているRAMページを元に
戻します。
答え4
これは私がまだ試していないアイデアです(申し訳ありませんが、今は試してみる時間がありません)。
バックグラウンドプロセスのために、メモリがわずか512MBの小さなVMを作成するとします。私はスワップをしたいかどうかを呼び出し、ホストシステムでスワップをオフにしたいかどうかわかりません。