1時間ごとにスワップを空にするcronスクリプトを作成するのは悪い考えですか?


26

長年、小さなUbuntu構成でも同じ問題を抱えていました。使用されるスワップスペースは時間とともに増加します。これは、スワップを無効にするなどのユーザーアクションの場合を除いて、割り当てられたメモリが十分なスペースがあってもRAMに戻らないことが主な理由であるという印象を受けます。

cronこれを自動化する短いコマンドを作成しましたが、良い結果が得られました。

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

しかし、これはこの問題の実際の解決策というよりもトリックであるため、それが悪い考えかもしれない潜在的な理由について疑問に思っています。


29
私の無知を許してください。しかし、SWAPが時間とともに大きくなり、割り当てられたメモリのRAMが空になる正確にはどういう意味ですか?通常、システムへのスワップとしていくつかのスペースを割り当て、それから再び聞くことはありません。スワップの実際の使用量は誰が気にしますか?どうしたの?
デザート

5
なぜこれをしたいのですか?スワップの使用が悪いと思うのはなぜですか?スワップの使用量はどのくらいですか?
-marcelm

25
私はちょっと困惑しています。「問題」について話し続けますが、実際にはいかなる種類の悪影響も説明しません。なぜこれを問題と考えますか?
デビッドシュワルツ

17
何かがスワップに入ってそこに留まるのは、何も使用していないからです。何がそれを使用していない場合と、それはRAMが何かのために使用することができるようにする方が良いですされるスワップのデータのバックよりも、キャッシュのように、アクセスする。
ホッブズ

12
これは単にスワップをオフにするよりも優れていますか?
user253751

回答:


51

そのように使用する:はい、悪い。スワップをオフにする前に、使用可能なメモリが十分にあるかどうかを本当に確認する必要があります。より良いバージョンについては、https://askubuntu.com/a/90399/15811を参照してください

また、これについて本当によろしいですか?割り当てられているスワップは、使用されているスワップを意味しません。コマンドvmstat、列si(スワップイン)およびso(スワップアウト)。これらが0のままの場合は、別の問題が発生しています。私の経験では、スワップはほとんど使用されておらず、空にならないが空にするものはないと考えて使用することはないでしょう。


3
ちょっと待って スワップオフが成功するのに十分なメモリがない場合、スワップオフは最初にOOMキラーによって殺されます。はい、彼らは実際にそれをハードコーディングしました(システムコールでチェックします)。
ジョシュア

@ジョシュアは確かですが、彼はそれが自動で動作することを望んでいます。エラーはありません。
リンツウィンド

4
私自身の答えを書かずに詳しく説明するために、時間の経過とともに増加するスワップ使用は悪いことではありません。つまり、カーネルは、メモリを消費しているジャンクが使用されないジャンクをゆっくり見つけ出し、スワップに移動して、実際に役立つものに使用できるようにします(より多くのfsデータをキャッシュしておくことができるように破棄してディスクから再読み込みする必要はありません)。
R ..

@Rinzwind cronは、エラーが発生したジョブでも問題なく機能し、リンクされたスクリプトでもを使用しませんvmstat
jpaugh

41

それは悪い考えだと思います。空きメモリがあり、アクティブなプロセスがスワップからRAMに移動していないと思われる場合は、考えているほどの空きメモリがないか、プロセスが思ったほどアクティブではありませんです。

アクティブなプロセスが引き続きスワップされる場合、メモリに負荷をかけている原因を修正する必要があります。アクティブなプロセスでない場合、大したことは何ですか?


1
+1:大したことは何ですか?実行中のシステムを変更しないでください。特にそのようなシステムのコア機能を台無しにすべきではないと思います。特に必要はありません。
デザート

3
メモリリークのあるプロセスを強制終了して(他のすべてをスワップに強制する)、10%のRAMが使用されたままになる問題がありますが、実行中のプログラムはすべて、再度アクセスするまでスワップ状態になります。そのため、何かに触れるたびに2秒の遅延があります。私はOPがどこから来ているのかを見ることができ、それが自動的に行われるのは良いことですが、これは正しい方法ではありません。
どこかの誰か

1
@SomeoneSomewhereしかし、それはとにかくそれがどのように機能するかではありません。プロセスがメモリをリークしている場合、定義上、そのメモリを積極的に使用していません(読み取りと書き込みを行っていません)。偶然に割り当てられただけです。他にアクティブなプロセスが存在する場合、リークされたメモリはスワップアウトされ、物理RAMではなくガベージでいっぱいのスワップになります。
デヴィッドリチャービー

@DavidRicherbyバックグラウンドでプログラムを開いている場合、そのプログラムはメモリリークよりもまだアクティブではありません。そして、プログラムを元に戻すと、スワップから抜け出す必要があります。
どこかの誰か

@SomeoneSomewhereあなたはメモリシステムの仕組みを誤解しているようです。プロセス全体を物理RAMに配置する必要はありません。スワップは単一ページの粒度で管理されます。しばらく使用されていないページはスワップアウトされる可能性があり、リークしたメモリのみで構成されるページは二度と使用されないため、スワップアウト後にスワップインされることはありません。
デビッドリチャービー

34

それは悪い考えです。

カーネルは、物理メモリがいっぱいになる前にスワップするためにデータのコピーを開始します(移動しない)。プロセスが大量のメモリを必要とする場合、スワップにすでに有効なコピーがあるページは、別の書き込みを必要とせずにすぐに再利用できるためディスクに。

一般的に、これは長時間アクセスされていないページで主に発生します。これは、すぐにアクセスされる可能性が低いことを示す良い指標です。

明示的にコピーを破棄する場合、データはまだRAMに存在しますが、多くのメモリを割り当てたいプロセスがあり、スワップが必要になると速度が低下する可能性があるため、メリットはありません。

また、カーネルは、物理メモリが50%を超えるとすぐに常にスワップ領域を使用するため、十分なメモリがインストールされていても、これらの数値はゼロ以外になります。


4
常に/proc/sys/vm/swappinessデフォルト値のままにしておくと仮定していると思います。70これは、サーバーに適しています。ページキャッシュを増やすためにしばらく触れていないプロセスからダーティページをかなり積極的にページアウトします。alt-tabが遅くなる可能性があるため、これは多くの場合、デスクトップには不適切です。
ピーターコーデス

@PeterCordes、ページが実際に削除された場合、キャッシュは問題のアプリケーションページよりも多くのアクセスを確認しているため、これらをディスクキャッシュとして使用することには実質的な利点があります。たとえば、大規模プロジェクトのコンパイル時間よりもAlt-Tabのパフォーマンスがユーザーに見えやすいことがわかりますが、パフォーマンスをあまり犠牲にせずに即座に応答することを保証するポリシーを策定することは困難です。
サイモンリヒター

1
別の言い方をすると、カーネルはスループット(swappiness=70)に合わせて調整されますが、デスクトップでのユーザーエクスペリエンスにとってレイテンシはより重要です。それはトレードオフです。少し大きすぎてページキャッシュにとどまらないものを定期的にコンパイルする場合swappinessは、5または10の代わりに20または30など、少し高くしてください。akitaonrails.com/ 2017/01/17 / optimizing-linux-forも参照してください。-遅いコンピューター。見てvm.vfs_cache_pressure未満100は、あまりにもUIの応答性のためにいいですこれは、データページ上のinode /ディレクトリのメタデータをキャッシュ好みます。
ピーターコーデス

1
その他の調整:ライトバックしきい値lonesysadmin.net/2013/12/22/...。これらは、何かがファイルに書き込んだ後にLinuxがディスクへの書き込みを開始する速さ、および許可されるダーティページの数を制御します。(つまり、どのくらいのメモリが書き込みキャッシュに支出することができます)
ピーター・コルド

21

これは悪い考えです。これが便利な場合、Linuxカーネルはこの方法で実装します。このような単純なシェルスクリプトは、おそらくカーネル開発者のアルゴリズムほど賢くないため、いくつかのチューニングパラメーターを変更する理由はないと思います。

基本的に2つのケースがあります。

  • とにかく、スワップ領域のプロセスは使用されません。なぜそれらをRAMに戻すのですか?
  • RAMが少ないため、スワップアウトされ、RAMに戻します。その後、システムはできるだけ早くそれらを再びスワップに入れます。

そのため、2つの主要なポイントがあります。

  1. まず、すべてのプログラムを一度に実行するにはRAMが少なすぎるとシステムが遅くなります。スワップを使用すると、より多くのプログラムを実行できますが、めったに使用されないプログラムにすばやく切り替えることはできません。スワップはめったに使用されないものを強制終了したり、現在使用されているものをメモリ不足例外にしたりすることはできません。
  2. 第二に、スワップは良いことであり、スワップを使用することもできます。これは、現在使用していないプログラムのコストで空きRAMを使用できるためです。

あまりにも多くのプログラムでメモリ不足の問題は発生していませんが、一部のプログラムは現在の空きRAMに基づいてメモリを割り当てる場合があり(ブラウザはより多くのmemcacheを使用し、より速くブラウジングできます)、カーネルはディスクキャッシュに空きRAMを使用できます。同様の最適化。強制的にスワップを空にすると、カーネルは読み取りキャッシュをドロップします。たとえば、新しいFirefoxインスタンスの起動には、Firefoxがまだディスクキャッシュにある場合よりも時間がかかります。

カーネルの動作を調整する場合は、swapinessパラメーターを参照してください

@ peter-cordesによる2つの追加リソースが貢献します。

空のスワップが本当に必要な場合は、スワップを完全にオフにすることができます。私はなぜそれを1時間オンにして、それを空にすることがスワップを持っていないよりも利点があるのか​​わかりません。


1
チューニングの提案/詳細については、akitaonrails.com / 2017/01/17 / optimizing-linux- for -slow-computersおよびlonesysadmin.net/2013/12/22/…も参照してください。
ピーターコーデス

5

キャッシュを解放するようカーネルに指示することにより、同じ結果を得ることができます。

echo 3 > /proc/sys/vm/drop_caches

これにより、メモリ不足の可能性のある瞬間を避け、必要なものと破棄できるものをカーネルに決定させます。


0

一般的な考え方に反して、SWAP自体は悪くありません
実際にシステムの速度を低下させるのは、RAMからSWAPにデータを移動し、RAMに戻すカーネルアクティビティですswappiness
システムは、で構成されているため、これを自動的に行いswappinessます。
これにより、非アクティブなプロセスのメモリがハードディスクスワップパーティションにダンプされます。
私自身は、それほど多くのRAMメモリを搭載していないマシンで何年も働いており、常にいくつかのスワップメモリ​​を使用していました。それでも、おそらく開いているアプリケーションを閉じようとして、メモリをRAMに戻すまで、私のマシンは正常に動作しました。その後、作業負荷が増加し始めました。

  • したがって、SWAPメモリを絶えず消去することにより、マシンの作業負荷が大幅に増加します。
  • SWAPパーティションにメモリがあるアプリケーションを実行すると、実行中に破損する可能性があります。

むしろ、htopアプリケーションのコマンドラインでメモリを使用しているアプリケーションを厳密に検討し、一部のアプリケーションを閉じることをお勧めします。gnome-system-monitorそのプロセス・タブでは、同様にあなたに良い洞察力を与えることができます。
大量のRAMを使用する大きなアプリケーションがある場合。一度にすべて実行しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.