お世話になります。

CentOS6.4を使ってPHPアプリを動かしています。

結構メモリを消費するアプリなので、
使っているうちにOutOfMemoryになることがあります。
※正常終了する場合もあります。

正常に終了しようがOutOfMemoryになろうが、
大量にメモリを確保した後は、そのまま解放されていないように見えます。

例えば、freeコマンドで見たときにに usedが減りません。


【例】
アプリケーション実行前
# apachectl restart

# free
total used free shared buffers cached
Mem: 16334660 472788 15861872 0 105700 120124
-/+ buffers/cache: 246964 16087696
Swap: 2047992 0 2047992

ここでアプリケーション実行し正常に終了。

# free
total used free shared buffers cached
Mem: 16334660 1754276 14580384 0 106836 120484
-/+ buffers/cache: 1526956 14807704
Swap: 2047992 0 2047992


apacheを再起動すればusedは減るのですが、
他にusedになっているメモリを開放する方法はあるのでしょうか?

また、どのようなメカニズムで解放されないのか教えていただけるとありがたいです。


よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>apacheを再起動すればusedは減るのですが、


>他にusedになっているメモリを開放する方法はあるのでしょうか?

ないです。

>また、どのようなメカニズムで解放されないのか教えていただけるとありがたいです。

多くの場合、プログラムがOSから借り受けたメモリはプログラムが終了するまでOSには返さず、
再度必要になったときのために備えておきます。

この回答への補足

そうですね。

OutOfMemoryで異常終了したときにメモリが解放されないという点についてはご説明のとおりで納得なのですが、正常終了しているケースでも解放されないとい点で、疑問を感じたものですから質問を投稿しました。

補足日時:2014/07/04 09:10
    • good
    • 1
この回答へのお礼

ありがとうございまいした。

お礼日時:2014/07/04 09:10

>OutOfMemoryで異常終了したときにメモリが解放されないという点についてはご説明のとおりで納得なのですが、正常終了しているケースでも解放されないとい点で、疑問を感じたものですから質問を投稿しました。



私が#2で書いた「プログラムの終了」というのは、今回の件でいえばphpモジュールを組み込んでいるapacheの事です。
あなたのいう「phpアプリ」の事ではないです。
phpアプリを動かしているプログラムといえばわかります?

この回答への補足

理解しました。

ついでに言えば、前回のご回答がヒントになりました。

apacheのMPM関係のパラメータをデフォルトにしていたのですが、apacheのプロセスが残る場合があるようですね。

現在は以下のとおり極端に小さい値で試行していますが、、
とりあえずメモリは解放されるようになりました。


<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
ServerLimit 1
MaxClients 1
MaxRequestsPerChild 1
</ifModule>

補足日時:2014/07/07 11:48
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/07 11:48

Linuxでは空きメモリをページキャッシュに使用します。



ページキャッシュとは、ファイルI/O を高速に行うため、最近参照
したファイルの内容のメモリ上へのキャッシュです。ページキャッ
シュはメモリ領域を専有しますが、他でメモリ必要になった場合は
開放される領域なので、空き領域として計上することができます。

ですから、厳密ではありませんが、freeを使ってメモリ使用量を算
出したい場合は、usedではなく、total - free - buffers - cached
で算出する必要があります。

ところで下記で強制的にページキャッシュを開放できますが、通常
はこれをやるメリットはありません。

# echo 1 > /proc/sys/vm/drop_caches

この回答への補足

なるほどです。

たしかに
-/+ buffers/cache: 1527988 14806672
となっていますね。

また、教えていただいた方法でページキャッシュを開放してみましたが、
元のキャッシュ容量が大きくないので、
格段に空きが増えるわけではないですね。

補足日時:2014/07/04 08:55
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/04 08:55

PHPはapacheのモジュールでうごいているのでしょうか?



またtopで観察していても変化はないでしょうか?

この回答への補足

PHPはモジュール版です。

LoadModule php5_module modules/libphp5.so


topで見ていても変化はありません。

質問の投稿から1時間経過しても以下のとおりです。

top - 14:09:42 up 22:25, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 126 total, 1 running, 125 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16334660k total, 1756508k used, 14578152k free, 108768k buffers
Swap: 2047992k total, 0k used, 2047992k free, 120696k cached

補足日時:2014/07/03 14:16
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。

お礼日時:2014/07/03 14:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qtopコマンドで表示されるVIRT、RESおよびSWAPの意味について

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。

topコマンドの出力結果は下の通りです。
この検証用サーバでは暫定的にパーティション設定でスワップ領域を作成していません。
しかしtopコマンドではVIRTとRESの数値は差異があり、SWAP項目も大きな値を示しているプロセスがあります。

スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、SWAPはゼロとなると予想していたのですがどうしてならないのですか?

top - 03:35:44 up 36 min, 3 users, load average: 0.13, 0.17, 0.20
Tasks: 90 total,  1 running, 89 sleeping,  0 stopped,  0 zombie
Cpu(s): 0.0%us, 1.3%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.7%si, 0.0%st
Mem:  515340k total,  452152k used,  63188k free,  18132k buffers
Swap:    0k total,    0k used,    0k free,  347404k cached

 PID USER    PR NI VIRT RES SHR S %CPU %MEM  TIME+ SWAP COMMAND
 4602 tomcat  25  0 645m 28m 6996 S 0.0 5.8  0:04.12 616m java
 2227 root   34  19 25656 10m 2108 S 0.0 2.0  0:00.12 14m yum-updatesd
 1680 root   17  0 11580 9964 240 S 0.0 1.9  0:00.02 1616 restorecond
 1936 haldaemo 18  0 5472 3676 1688 S 0.0 0.7  0:01.20 1796 hald
 2499 root   18  0 10540 2916 1504 S 0.0 0.6  0:00.03 7624 httpd
 3672 root   15  0 10064 2888 2308 S 0.7 0.6  0:02.50 7176 sshd
 3927 root   20  0 9916 2880 2308 S 0.0 0.6  0:00.34 7036 sshd
 2054 root   18  0 10116 2328 1696 S 0.0 0.5  0:00.04 7788 cupsd
 2500 apache  25  0 10540 2088 640 S 0.0 0.4  0:00.00 8452 httpd

どうしてもズレるので画像を添付してます。

topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。
CentOS5.4上で動作しているアプリケーションの使用メモリについて調査しています。
サーバのメモリ容量は512MBで、この上でスワップアウトしないようにアプリケーションの起動数(常駐)を調整しようとしています。

topコマンドでプロセスが使用している物理メモリ容量はRES項目を見れば良いことがわかっていますが、VIRT(仮想メモリの総量)とSWAP(スワップされたサイズ)が具体的に何を示しているのかがわからず、困っています。
...続きを読む

Aベストアンサー

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます。

・プロセスが確保したメモリのうち、まだ一回もアクセスして
 いない部分。
  ⇒アクセスしたときに初めて物理メモリが割り当てられ、
   RESにも計上されていきます。
  (javaのRESに比べてかなり大きいVIRTは、これによるものと
   思われます。大きなヒープサイズを指定していませんか?)

・プロセスが ファイルを仮想メモリ空間にmmap(2) したが、
 まだ一回もアクセスしていない部分。
  ⇒Linux(UNIX) には、あたかもメモリをアクセスするかのように
   ファイルを読み書きできる mmap(2) という機能があり、
   かなり多用されています。mmap直後のファイルは、
   VIRTには計上されますが、物理メモリには読み込まれずRESには計上
   されません。ファイルをmmapした仮想メモリ空間にアクセスした
   部分が、物理メモリに読み込まれRESに計上されます。

> スワップ領域が無いのではtopコマンドはVIRTとRESが同じになり、
> SWAPはゼロとなると予想していたのですがどうしてならないのですか?

実は、SWAPとして表示される数値は、単に VIRT と RES の差です。

VERT(仮想メモリ総量)の中には、物理メモリ(RES)やスワップ領域の
使用量だけなく上記で挙げたような仮想空間の部分の合計が含まれ
ますから、スワップ領域がゼロでも、上記で挙げたような空間が
SWAP として表れているのです。

個人的にはこの数値をSWAPと呼ぶのは、かなり不適切だと思いますが、
多くのLinuxディストリビューションのtopコマンドで表示される
SWAP欄は、そういう計算をしているということです。

参考URL:http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6

答えにたどり着く前に、若干長めの説明が必要です。

> topコマンドで表示されるVIRT、RESおよびSWAPの意味について教えてください。

 RESは、ご認識の通り、そのプロセスの物理メモリ使用量です。

 VIRTとして表示されている仮想メモリ総量とは、そのプロセスの
仮想アドレス空間の中で、有効となっているページの総量です。
これに計上されるのは、参考リンクの「仮想記憶の概念図」でカラフルに
描かれている「物理メモリ」や「スワップ」に対応するページのほか、
以下のようなものも含まれます...続きを読む

Qfreeコマンドのfree,swapについて

Linuxカーネル本では、回収アルゴリズムはメモリが少なくなったら動作すると記載がありますが、
24時間運転のJavaアプリが動作している環境で、freeコマンドfree容量、swap容量は
毎日増え続けています。

1.freeコマンドのfree容量、swap容量の開放タイミングはいつかを教えてください。

2.24時間運転のような、再起動のタイミングが無い場合、freeコマンドのfree,swapはどういう場合、 
 回収動作が実行されるか、free,swapの値は増え続けて問題は無いでしょうか。

3.メモリはどんどん使っていって、少なくなったら回収する時の閾値設定は何になるのでしょうか?

 例:/proc/~ の・・・の値を超えた場合、swapの回収を行う。

よろしくお願いいたします。

Aベストアンサー

実メモリの話と仮想メモリ量の話を混同されていますね。

書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。
(文中括弧内はfreeの表示項目名)

実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はありません。

swapの使用量が増え続けるというのは、プログラムで使っている仮想メモリ量が増え続けていると言うことで、これは、プログラムが仮想メモリを解放したり、そのプログラムが終了したりしない限り、減りません。

厳密に言うと、メモリリークじゃなくて、仕様かもしれません。例えば、メモリ上で扱うデータがどんどん増える一方だとか。その場合は、無限大サイズのswapエリアが要ります。まあ、その前にOSで扱える最大量を超えた時点で終わりますが。無限の仮想メモリを必要なプログラムというのは、仕様のバグですね。メモリリークとは呼びませんが。

実メモリの話と仮想メモリ量の話を混同されていますね。

書籍から引用された部分は、実メモリの空きページ(free)が足りなくなった場合に、プログラムにより使われている(usedからbuffersとcachedを引いたもの)が最近参照されていない実メモリをswapに一時的に待避させたり、OSが割り当てるバッファ(buffers)やキャッシュ(cached)を減らしたりして、実メモリの空きページを作る話です。
(文中括弧内はfreeの表示項目名)

実メモリのfreeが減っていくのはお書きのようにいずれ何とかなりますので、心配の必要はあ...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qメモリキャッシュクリアについて

運用しているとメモリ使用量がどんどん増えてくるかと思います。

ほっておくとFreeSpaceが0に近くなっていくるので下記コマンドにてクリアを定期的にしています。

sysctl -w vm.drop_caches=3

上記運用で問題となる点はございますでしょうか?

また、どのような運用をするのが最適でしょうか?

ご存知の方、宜しくお願いします。

Aベストアンサー

>上記運用で問題となる点はございますでしょうか?

間違っています。
メモリのFreeSpaceというのは、何にも使われずに無駄になっているメモリと言うことです。普通の使い方のシステムの場合は、ゼロであるのが理想的です。
普通は、そういう余っているメモリは、キャッシュやバッファに使用して、動作中のプロセスの高速化を図ります。
せっかく使われているキャッシュを捨てて、無駄エリアにしてしまうことは、システム全体の速度低下につながります。まあ、ごくわずかだとは思いますが。

>また、どのような運用をするのが最適でしょうか?

OSにメモリ管理を任せます。

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Qキャッシュとバッファの違いは?

はじめまして
キャッシュとバッファの違いがよくわからないので
教えてください。

初歩的な質問だと思いますがこちらの方の方がわかる方が多いと思いますのでよろしくお願いします。

Aベストアンサー

両方、物理的にいえばメモリです
意味合いとしても両方、記憶領域になります。

キャッシュは、使用頻度の高いデーターを蓄えておき、即時実行できるようにするメモリ

バッファは、処理速度や転送速度の差を補うためにデータを一時的に保存しておくメモリ

QNTPで同期が始まらない

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntpq -pの結果は下記となります。

remote refid st t when poll reach delay offset jitter
==============================================================================
133.100.9.2 .INIT. 16 u - 64 0 0.000 0.000 4000.00
130.69.251.23 .GPS. 1 u 27 64 377 8.015 -99970. 17262.6

同期ができれば「remote」列に「*」が表示されると思っています。
何か設定が足りないでしょうか?。
尚、「/vat/log/message」をtailしてますが特にエラーは無さそうです。

よろしくお願いします。

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntp...続きを読む

Aベストアンサー

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハードウエアclockを合わせます。
http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html

○ntpdの動作
ntpによる時刻調整は、調整幅が通常128mSと小さいので、1時間は様子をましょう。
2時間程度経過しても、時刻修正の兆候が見られない場合ハードウェアの不良も考えられます。

時刻調整の兆候としては、
・logファイルに 一時間毎に調整したメッセージが書かれる。
Jan 7 21:57:40 ntpd[91145]: offset 0.000994 sec freq -190.802 ppm error 0.000076 poll 8
・ntpq -p の出力の最初の桁に"*,+"が付く。また、reach が377になる。
% ntpq -np
remote refid st t when poll reach delay offset jitter
+192.168.0.102 GPS_NMEA(0) 2 u 3 32 377 0.926 -0.330 0.023
*192.168.0.192 GPS_NMEA(1) 2 u 10 32 377 0.747 -0.336 0.023
192.168.0.9 PPS(1) 2 u 3 32 377 0.757 6.559 0.161


○その他
・PC起動時には、システムクロックを計測してその後の動作の基準にしていますが、
CMOSバッテリ不足やハードウェアに何らかの異常があるととんでもない時刻を示すことがあります。(要修理です)
・BIOSの時計も起動時の初期時刻として使われてしまうので、ある程度合わせておいた方がいいです。

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング