追加読書

追加読書

私は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またはを設定できますMemoryMaxMemoryLimitcgroup 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)

おすすめ記事