Linuxカーネル本では、回収アルゴリズムはメモリが少なくなったら動作すると記載がありますが、
24時間運転のJavaアプリが動作している環境で、freeコマンドfree容量、swap容量は
毎日増え続けています。
1.freeコマンドのfree容量、swap容量の開放タイミングはいつかを教えてください。
2.24時間運転のような、再起動のタイミングが無い場合、freeコマンドのfree,swapはどういう場合、
回収動作が実行されるか、free,swapの値は増え続けて問題は無いでしょうか。
3.メモリはどんどん使っていって、少なくなったら回収する時の閾値設定は何になるのでしょうか?
例:/proc/~ の・・・の値を超えた場合、swapの回収を行う。
よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
実メモリの話と仮想メモリ量の話を混同されていますね。
書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。
(文中括弧内はfreeの表示項目名)
実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はありません。
swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言うことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、減りません。
厳密に言うと、メモリリークじゃなくて、仕様かもしれません。例えば、メモリ上で扱うデータがどんどん増える一方だとか。その場合は、無限大サイズのswapエリアが要ります。まあ、その前にOSで扱える最大量を超えた時点で終わりますが。無限の仮想メモリを必要なプログラムというのは、仕様のバグですね。メモリリークとは呼びませんが。
ご返答、ありがとうございます。
大変参考になりました。
>swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言う
>ことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、
>減りません。
OSでのswapの開放タイミングは、プログラムが仮想メモリを開放するタイミングに依存するという
ことですね。
アプリはアプリ担当で調べるとして、OS側でのswap開放で判定される設定値と、
OS側でのswap開放されるタイミングについて、また確認してみます。
この辺は中々、明確な答え、断言が難しいところですね。
夜、遅い時間に返答をいただきまして感謝しております。
No.4
- 回答日時:
> swapが減らないのはおかしいという認識でよろしいでしょうか。
おかしそうには思いますが、どのプロセスで使っているメモリが増え続けているのかは確認した方が確実です。
※今思っているのと違うソフトで問題が起こっている可能性も皆無ではないでしょうし。
> ソフトに原因がある場合、ソフトを修正するにしても、swap領域を手動で解放するというのは
> swapoffコマンドの使用を指していますでしょうか。
手動で解放はプロセスの再起動やJavaVMでの強制GCなど。多分、プロセスの再起動一択になりそうな気がします。
swapoffコマンドは、物理メモリ以上のメモリを使っている時にやればすぐには終了しないのでは。
> swapoffコマンドはswap容量がゼロになると思うのですが、
> 運用中に(swap領域を使用している状態で)swapoffコマンドを実行して影響は無いでしょうか。
多分、ソフトがクラッシュする気がします。
swapoffすれば、メモリの替わりにhddを使っている部分を可能な限り物理メモリに戻そうとするのと新規にswapoutするのを止めると思います。で、メモリ不足な状態だったら新規にスワップアウトするのを抑止されるとメモリ確保に失敗するようになるかと。ソフトがメモリ不足でも問題ない様に書かれていれば動き続ける(例えば、自分で作業ファイル作ってメモリの替わりに使うなど)でしょうが、そうでないソフトが大半でしょうからその場合メモリ不足で問題が発生するかと思います。
swapは一つとは限らない(物理ドライブを複数使っていれば分散した方が速い[大きな帯域が使える])ので、複数ある中の一つを開放してもゼロにならない場合もあります。
swapoffしたからって、各ソフトで使っているメモリが減ったりはしないので、十分なメモリが割り当てられなくなればその状況の動作になります。
私が書いた『swap領域を手動で解放』というのはメモリリークを起こしているソフトの再起動などですよ。プロセスの使っている(不具合のためなどで実際に使う以外に取得したままになっている)メモリを解放しようと思えば、動きながらできるような機能を加えたり再起動したりする必要があるかと。自主的に引き継ぎたいデータを引き継いで自身で制御して再起動すれば影響を少なくできるでしょうけど。
ご返答ありがとうございます。
そうですよね、運用中にswapoffコマンドは使えませんよね。
24時間運用中なので、プロセスの再起動がままならないので、
swapの開放タイミングって、随時行われているとしたら、増え続けているのが心配になっている
次第です。
ホントはOS再起動なりしたいのです。
No.3
- 回答日時:
もう一度書きますが、プロセス数がどんどん増えると言うこと無しに、swap使用量が単調に増え続けるのなら、メモリリークが起こっています。
根本対策としては、バグを無くすしかありません。
バグ対策が出来ないのであれば、暫定手段として、定期的にプロセスを再起動するしかないです。プログラムの問題なので、システム側ではどうしようもないです。
なお上で言う「swap使用量」というのは、freeコマンドで表示される Swap: の行の2番目のused欄の数字のことです。あなたがいう「swap容量」というのがそれと違う数字のことなら、上記は関係ないですが、その場合、どの数字を指してswap容量と言っているのか書いてください。
普通の言葉の使い方では「swap容量」とはSwap:行の一番目のtotal欄の数字、つまりSwapパーティション(あるいはswapファイル)のサイズのことです。これが何もしないで増えるとは考えられないので、使用量のことかと推測しています。
ご返答ありがとうございます。
わたしの言う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アプリを再起動するなども必要となるかも知れませんね。なぜメモリ使用量が増加一方なのか調べた方が良さそうに感じます。
ご返答、ありがとうございます。
やはり、24時間運用であってもswapが減らないのはおかしいという認識でよろしいでしょうか。
ソフトに原因がある場合、ソフトを修正するにしても、swap領域を手動で解放するというのは
swapoffコマンドの使用を指していますでしょうか。
swapoffコマンドはswap容量がゼロになると思うのですが、
運用中に(swap領域を使用している状態で)swapoffコマンドを実行して影響は無いでしょうか。
ご返答いただけましたら幸いです。
よろしくお願いいたします。
No.1
- 回答日時:
1. Swap量:必要がなくなればとしか言いようがないです。
「プロセスの要求する論理(仮想)メモリ量」の全プロセスについての総和+OSが割り当てるキャッシュ・バッファ=総仮想メモリ量
総仮想メモリ量 ー 実メモリ量 = swapサイズ
なので、プロセスが使う論理メモリが減ればswapも減ります。
「free容量の解放」??freeのサイズは「何にも使われずその時点で無駄になっているメモリ量」です。
まあ、予備なので必要な時にすぐ使えるサイズとも言えます。
2. swapが単調に増えているならメモリリークが考えられます。プロセス毎の仮想メモリ量を見て、単調に増えている物があれば、そのプログラムにバグがあると言うことです。バグ修正まで、暫定的には定期的にプロセスの再起動が必要。
freeが増え続けるというのはあり得ないです。
3. 「使おうとした時に空きがなければ」だと思いますが、バッファ・キャッシュの使用量は何らかの上限値があるはず。ただ、固定値じゃなくて動的に決まる値だと思います。
ご返答ありがとうございます。
freeは開放でく減っているという意味です。
このまま運用を続けていくと、いつswapは開放されてfreeは増えるのか心配です。
もちろんアプリのバグの可能性は常にありますが、swapの開放タイミングはfreeが足りなくなったら、
増えると思っていますが、24時間運用なのでOS、APLの再起動は非常時しかありません。
swap容量の開放タイミングは、OS設定のしきい値を判定して行われると認識していますが、
カーネル本の足りなくなったらswapを開放するという記述を信じていれば大丈夫なのか心配になっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ubuntu(linux)のシャットダウン...
-
Linux用のインストーラー(USB...
-
ubuntuで デイスク/deb/loopと...
-
2TBのUSBメモリを2000円ほどで...
-
Ubuntu20.04からUbuntu22.04に...
-
[Linux Mint] インストールした...
-
WineのRufusでデバイスを検知す...
-
bashでシングルクォート内の変...
-
raspberrypi に bluealsaを入れ...
-
AppImageがインストールできな...
-
linuxのIMEの件
-
Ububtuでファイル共有できない...
-
2TBのUSBメモリを入手したので...
-
LinuxMintが突然フリーズする
-
ubuntuのシャットダウンが進ま...
-
Ubuntu でinvalid filenameとな...
-
Linuxミントで困っています。 s...
-
Windowsのローカルディレクトリ...
-
Linuxへの移行 来年でWindows10...
-
ログにserver reached MaxReque...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
topコマンドで表示されるVIRT、...
-
FreeBSDでのCPU占有率とメモリ...
-
CPU 使用率について(ps,top,sar)
-
postaliasとpostmapコマンドに...
-
AIXでシステム内の全プロセスメ...
-
Linuxが突然フリーズしました
-
freeコマンドのfree,swapについて
-
Swap領域が使用されてない
-
freeとpsでメモリ使用量が違う?
-
cpuやメモリのスペックを調べる...
-
ps aux ps auxw psauxwwの違い
-
DNS(BIND)を起動できない
-
umountはなぜunmountではなくum...
-
【メモリ]】vmstat、free、top...
-
実行中のプロセス数をカウント...
-
デジカメ動画を取り込もうとす...
-
Ubuntuの削除(MBR)の修復ができ...
-
コマンドプロンプトからC:のデ...
-
centosサーバーが重い時のTOPコ...
-
telnetでrootでログイン後にサ...
おすすめ情報