• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:freeコマンドのfree,swapについて)

freeコマンドのfree容量、swap容量の開放タイミングと回収動作について

このQ&Aのポイント
  • freeコマンドのfree容量、swap容量の開放タイミングについて教えてください。
  • 24時間運転の場合、freeコマンドのfree,swapはどのような場合に回収動作が実行されるのか、値は増え続けて問題はないのかについて教えてください。
  • メモリの回収時の閾値設定について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

実メモリの話と仮想メモリ量の話を混同されていますね。 書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。 (文中括弧内はfreeの表示項目名) 実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はありません。 swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言うことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、減りません。 厳密に言うと、メモリリークじゃなくて、仕様かもしれません。例えば、メモリ上で扱うデータがどんどん増える一方だとか。その場合は、無限大サイズのswapエリアが要ります。まあ、その前にOSで扱える最大量を超えた時点で終わりますが。無限の仮想メモリを必要なプログラムというのは、仕様のバグですね。メモリリークとは呼びませんが。

sinrin2011
質問者

お礼

ご返答、ありがとうございます。 大変参考になりました。 >swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言う >ことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、 >減りません。 OSでのswapの開放タイミングは、プログラムが仮想メモリを開放するタイミングに依存するという ことですね。 アプリはアプリ担当で調べるとして、OS側でのswap開放で判定される設定値と、 OS側でのswap開放されるタイミングについて、また確認してみます。 この辺は中々、明確な答え、断言が難しいところですね。 夜、遅い時間に返答をいただきまして感謝しております。

その他の回答 (4)

回答No.4

> swapが減らないのはおかしいという認識でよろしいでしょうか。 おかしそうには思いますが、どのプロセスで使っているメモリが増え続けているのかは確認した方が確実です。 ※今思っているのと違うソフトで問題が起こっている可能性も皆無ではないでしょうし。 > ソフトに原因がある場合、ソフトを修正するにしても、swap領域を手動で解放するというのは > swapoffコマンドの使用を指していますでしょうか。 手動で解放はプロセスの再起動やJavaVMでの強制GCなど。多分、プロセスの再起動一択になりそうな気がします。 swapoffコマンドは、物理メモリ以上のメモリを使っている時にやればすぐには終了しないのでは。 > swapoffコマンドはswap容量がゼロになると思うのですが、 > 運用中に(swap領域を使用している状態で)swapoffコマンドを実行して影響は無いでしょうか。 多分、ソフトがクラッシュする気がします。 swapoffすれば、メモリの替わりにhddを使っている部分を可能な限り物理メモリに戻そうとするのと新規にswapoutするのを止めると思います。で、メモリ不足な状態だったら新規にスワップアウトするのを抑止されるとメモリ確保に失敗するようになるかと。ソフトがメモリ不足でも問題ない様に書かれていれば動き続ける(例えば、自分で作業ファイル作ってメモリの替わりに使うなど)でしょうが、そうでないソフトが大半でしょうからその場合メモリ不足で問題が発生するかと思います。 swapは一つとは限らない(物理ドライブを複数使っていれば分散した方が速い[大きな帯域が使える])ので、複数ある中の一つを開放してもゼロにならない場合もあります。 swapoffしたからって、各ソフトで使っているメモリが減ったりはしないので、十分なメモリが割り当てられなくなればその状況の動作になります。 私が書いた『swap領域を手動で解放』というのはメモリリークを起こしているソフトの再起動などですよ。プロセスの使っている(不具合のためなどで実際に使う以外に取得したままになっている)メモリを解放しようと思えば、動きながらできるような機能を加えたり再起動したりする必要があるかと。自主的に引き継ぎたいデータを引き継いで自身で制御して再起動すれば影響を少なくできるでしょうけど。

sinrin2011
質問者

お礼

ご返答ありがとうございます。 そうですよね、運用中にswapoffコマンドは使えませんよね。 24時間運用中なので、プロセスの再起動がままならないので、 swapの開放タイミングって、随時行われているとしたら、増え続けているのが心配になっている 次第です。 ホントはOS再起動なりしたいのです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

もう一度書きますが、プロセス数がどんどん増えると言うこと無しに、swap使用量が単調に増え続けるのなら、メモリリークが起こっています。 根本対策としては、バグを無くすしかありません。 バグ対策が出来ないのであれば、暫定手段として、定期的にプロセスを再起動するしかないです。プログラムの問題なので、システム側ではどうしようもないです。 なお上で言う「swap使用量」というのは、freeコマンドで表示される Swap: の行の2番目のused欄の数字のことです。あなたがいう「swap容量」というのがそれと違う数字のことなら、上記は関係ないですが、その場合、どの数字を指してswap容量と言っているのか書いてください。 普通の言葉の使い方では「swap容量」とはSwap:行の一番目のtotal欄の数字、つまりSwapパーティション(あるいはswapファイル)のサイズのことです。これが何もしないで増えるとは考えられないので、使用量のことかと推測しています。

sinrin2011
質問者

お礼

ご返答ありがとうございます。 わたしの言うswap容量は、freeコマンドで表示される Swap: の行の2番目のused欄のことですので、 ご返答いただいた説明と一致しています。 カーネル本(Linuxカーネル2.6解読室、Linuxカーネル第三版)での解説、 特に、Linuxカーネル2.6解読室の記載に、下記のような記載があります。 引用-- Linuxカーネル2.6解読室  14章 ページの回収処理 抜粋 回収処理の実体は、2つあります。 1つはkswapdデーモンです。これはカーネル内のスレッドで、ノードごとに存在 しています。kswapdデーモンは普段はずっと寝ています が、残りページが少なくなったときに バディシステムから起動されます。 回収処理の契機は、ゾーンの残りページが閾値以下になることです。 もう一つは、try_to_free_pages関数です。こちらは本当に残りページが少なくなって きたときに呼び出される関数で、閾値の判定をせずに回収処理を始めます。この関数を 呼び出しているのは、バディシステム(__alloc_pages関数)と バッファアロケータ(create_fuffer関数)の2箇所しかありません。 -- 日々、swapが増え続けているのは、freeが足りなくなったらswapから回収されるはずだから 大丈夫なはず・・・と思う反面、メモリ枯渇してアプリかOSがダウンしてから対応じゃ遅いよな・・・ と思う日々です。 >プロセス数がどんどん増えると言うこと無しに、swap使用量が単調に増え続けるのなら、メモリリーク>が起こっています。 >根本対策としては、バグを無くすしかありません。 そうですよね。わたしもそう思いつつも、本にはLinuxでは基本的にメモリが足りなくなったら、 LRU制御してある回収可能な領域から回収をはじめるはず・・・だから毎日freeが減っているけど、 大丈夫・・・だと思いたい。 という気持ちでいましたが、たとえJavaVM内のスレッドがどんどん増えようが、OSから見ると プロセス数がどんどん増える訳ではないので、swap使用量が単調に増え続けるのはおかしい ですよね。 大変参考になりました。 ありがとうございました。

回答No.2

> 24時間運転のJavaアプリが動作している環境で、freeコマンドfree容量、swap容量は > 毎日増え続けています。 動かしているソフトに問題がある可能性はないでしょうか。 > Linuxカーネル本では、回収アルゴリズムはメモリが少なくなったら動作すると記載がありますが 使っているメモリは開放しませんよ。上の記述をみるとメモリが開放されてない様に見えます。 実際に使われてなくてもカーネルに割り当ててもらったままならそのメモリは解放されません。 > 1.freeコマンドのfree容量、swap容量の開放タイミングはいつかを教えてください。 基本的には常に。ただし、物理メモリのみ使っている状況では全く解放されない事もある。(解放しなければ同じデータを読み込む必要がないので将来の読み込み動作をなくす事のできる可能性がある。使い切ってもいないのに解放する必要はない) swap使われている様だと、適宜開放される。 > 3.メモリはどんどん使っていって、少なくなったら回収する時の閾値設定は何になるのでしょうか? > > 例:/proc/~ の・・・の値を超えた場合、swapの回収を行う。 swap発生(正しくは物理メモリが充分でないためのページング動作)している時点で、無駄なものは適宜回収されるはずですよ。 ※ プロセス全体をハードディスクに退避する動作をスワップといいます。プロセスの一部をハードディスクに退避するのはスワップではなくページング。良く使うプロセスがスワップされるのは深刻な物理メモリ不足です。ほとんど動かないプロセスがスワップされているのはそうとは限りませんが。 システム全体で使用メモリがどんどん増えて行く状況だと、どのプロセスのメモリ使用が増えつづけているのか調べてそれが適切なのか不適切なのか調べ、不適切な場合には対策を施すのが良いかと。 ただし、どのプロセスも関係ないところでメモリ使用が増えている場合もあるし、個別に対応が必要となる事もありますよ。 例えば、共有メモリ使うソフトで使用終わった後も共有メモリ確保したまま終了してだれも使ってない共有メモリ領域が確保されたままになっているとか。psやtopと平行してipcs -a何かでも調べて不要な場合は手動で解放しないと使わないメモリが確保されたままになったりする場合があります。問題があればソフト直すのが理想ですが。 状況わからないですが、Javaアプリがそのうちメモリ食いつぶして落ちたりする事は考えられそうなので、どんだけ使ってしまったらJavaアプリを再起動するなども必要となるかも知れませんね。なぜメモリ使用量が増加一方なのか調べた方が良さそうに感じます。

sinrin2011
質問者

お礼

ご返答、ありがとうございます。 やはり、24時間運用であってもswapが減らないのはおかしいという認識でよろしいでしょうか。 ソフトに原因がある場合、ソフトを修正するにしても、swap領域を手動で解放するというのは swapoffコマンドの使用を指していますでしょうか。 swapoffコマンドはswap容量がゼロになると思うのですが、 運用中に(swap領域を使用している状態で)swapoffコマンドを実行して影響は無いでしょうか。 ご返答いただけましたら幸いです。 よろしくお願いいたします。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

1. Swap量:必要がなくなればとしか言いようがないです。 「プロセスの要求する論理(仮想)メモリ量」の全プロセスについての総和+OSが割り当てるキャッシュ・バッファ=総仮想メモリ量 総仮想メモリ量 ー 実メモリ量 = swapサイズ なので、プロセスが使う論理メモリが減ればswapも減ります。 「free容量の解放」??freeのサイズは「何にも使われずその時点で無駄になっているメモリ量」です。 まあ、予備なので必要な時にすぐ使えるサイズとも言えます。 2. swapが単調に増えているならメモリリークが考えられます。プロセス毎の仮想メモリ量を見て、単調に増えている物があれば、そのプログラムにバグがあると言うことです。バグ修正まで、暫定的には定期的にプロセスの再起動が必要。 freeが増え続けるというのはあり得ないです。 3. 「使おうとした時に空きがなければ」だと思いますが、バッファ・キャッシュの使用量は何らかの上限値があるはず。ただ、固定値じゃなくて動的に決まる値だと思います。

sinrin2011
質問者

お礼

ご返答ありがとうございます。 freeは開放でく減っているという意味です。 このまま運用を続けていくと、いつswapは開放されてfreeは増えるのか心配です。 もちろんアプリのバグの可能性は常にありますが、swapの開放タイミングはfreeが足りなくなったら、 増えると思っていますが、24時間運用なのでOS、APLの再起動は非常時しかありません。 swap容量の開放タイミングは、OS設定のしきい値を判定して行われると認識していますが、 カーネル本の足りなくなったらswapを開放するという記述を信じていれば大丈夫なのか心配になっています。

関連するQ&A