- - PR -
ワーカプロセスのメモリ使用量について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-05-30 20:14
ガーベージコレクションの効くクライアント端末と
メモリが増え続けるサーバとの違いで気になること があったので、以下の事をクライアント端末でテス トしました。 500(512)の物理メモリのあるクライアント端末で 重い処理を続けて流した場合にmachine.configの memoryLimitを以下のようにして流してみました。 memoryLimit=5の場合 初回の処理が30MB程度かかる為に aspnet_wp.exeが落ちる。エラー内容は メモリ使用が 25 MB (使用可能 RAM の 5 パーセント) を超えたため、 aspnet_wp.exe (PID: 736) が繰り返されました。 memoryLimit=20の場合(推定では100MB程度は使用できるはず?) この場合ですと65MBのところでGCが効いているような感じで それ以上のメモリは使用しない。(少しづつ減っている) memoryLimit=40の場合(推定では200MB程度は使用できるはず?) この場合ですと85MBのところでGCが効いているような感じで それ以上のメモリは使用しない。(少しづつ減っている) memoryLimit=60の場合(推定では300MB程度は使用できるはず?) この場合ですと100MBのところでGCが効いているような感じで それ以上のメモリは使用しない。(少しづつ減っている) 以上のようになります。 推定なのですが、サーバは物理メモリを5000MB搭載していて memoryLimit=80にしてあります。この場合は4000MBまで使用 可能の設定(2GBまでしか意味ないのでしょうがw) この場合はGCがまだ余裕ある為に効かないのかなと思います。 そしてメモリはどんどん増えつづけ、500MBくらいになると D, an alchemistさんの返信にもあるとおり >私の個人的な経験では、ASP.NET のワーカープロセスがまともに動くのは Workingset が 800MB くらいまでで、それをこえると OutOfMemoryException いろんな場面でエラーになるのかな?と思うのですがどんな もんでしょうか? なのでサーバのmemoryLimitを10にして500MBくらいまでにしたら 良いのかなと勝手に推測してるのですが、誤っているでしょうか? ただ運用サーバの為に誤ったことはできないので、詳しい方に ご教授して頂きたいと思います。 宜しくお願いします。 |
|
投稿日時: 2005-05-30 21:43
本番サーバのmachine.configのmemoryLimitの値を以下の設定を変えました。
物理メモリが3.7GBでしたので500MBを目安に14を設定しました。 すると重い処理を複数端末で処理をしても300MB程度でGCが効いてくれるように なりました。とりあえずこれで様子見をします。 ただ本当に500MB以上のメモリを必要になる場合はワーカプロセスが自動で 落ちる危険性もありますが。そうなった時にはプログラミングの見直し、運用 の見直しが必要となることは覚悟します。 また結果は随時報告します。 |
|
投稿日時: 2005-05-31 09:38
こんにちは。
ラベル発行ツールとASP.NETがどのような形でやり取りされているか、イマイチ分かりませんが、COMオブジェクトを直接ASP.NETのプログラム上から利用されているのであれば、COMを正しく解放できているかチェックしたほうが良いかもしれません。GCは、COMやアンマネージドのメモリー管理まではやってくれないので、そのあたりでメモリーリークしている可能性もあります。 |
|
投稿日時: 2005-05-31 11:22
>すると重い処理を複数端末で処理をしても300MB程度でGCが効いてくれるように
>なりました。とりあえずこれで様子見をします。 GCは作動してくれるようにはなりましたが、減っては増え減っては増えで 増える方が多くて現在405MBまで膨れてきました。 memoryLimit=14にて現在500MBでワーカプロセスが自動で終了するので落 ちるのも時間の問題かもしれません。 メモリ解放を個々のプログラムできちんと行ってないような気がします。 多分Sessionにデータなんかを入れ込んでいるものがあると推測してます。 そこでお聞きしたいのは、こんな時には個々のプログラムを全て調べて いくしかないのでしょうか?本数的には100本くらいのプログラムがあり かなりの調査工数がかかってしまいます。 できれば現在のメモリを使っている諸悪の根源をみつけてそこを集中的に 調査していきたいのですが、それをするにはどんな手法があるでしょうか? noderaさん 返信ありがとうございます。 >COMを正しく解放できているかチェックしたほうが良いかもしれません。GCは、COMやアンマネ>ージド?のメモリー管理まではやってくれないので、そのあたりでメモリーリークしている可能>性もあります。 COMの解放ができているかを確認する方法はあるのでしょうか? |
|
投稿日時: 2005-06-01 13:05
レス遅くなりました。
1) memoryLimit memoryLimit の設定に関してはアプリの運用的な設計になるかと思います。この設定値を超えて落とされれば、InProc であればもちろん Session 変数等々は消えてなくなりますから、エラーを取るか or データ消去を取るか、ではないかと。 オンメモリなデータが消えても構わないのであれば、requestLimit を適当に設定して数リクエストさばいたらどんどんリサイクルさせてしまうという手もあると思います。 消えるとマズいのであれば memoryLimit は高めにしてリクエスト流入量自体を絞りこんで使用メモリを抑えるか、既にご検討されているように、メモリを使用しないようにコードを書き直すか(不正にメモリを確保している犯人がいるならそいつを捕まえるか)、になるんじゃないかと思います。 2) GC パフォーマンスカウンタ .NET CLR Memory の %Time In GC を見ていると、定期的にスパイクすると思います。このタイミングで GC が動いているんだと思います。あまりに大きい領域を確保/開放しまくったり、コードで GC.Collect() しまくってジェネレーションを意図的に古くしない限り、GC が作動しなくなるという事はないんじゃないかなぁと思います。 3) メモリの使用状況 市販のプロファイラ等を使うのがいいのかなぁと思いますが、私はよくわかりません。 なお、パフォーマンスカウンタ .NET CLR Memory の #Total comitted Bytes や #Total reserved Bytes が右肩上がりに上がっていき、それが Workingset と比例しているならマネージドな何かが確保され続けているんだと思います(Web アプリなら、大抵は Session 変数に入れた DataSet なのではないでしょうか)。 それに対して、これらのカウンタはあまり増えていかないのに、パフォーマンスカウンタ Process の Private Bytes が Workingset に比例してどんどん増えているような場合はアンマネージドな何かが確保され続けているんだと思います(COM コンポーネントで使ってる何かがリークしている、とか、ですかね)。 hope it helps D, an alchemist. |
|
投稿日時: 2005-06-01 15:43
D, an alchemistさん長々お付き合いくださってありがとうございます。
>1) memoryLimit >消えるとマズいのであれば memoryLimit は高めにしてリクエスト流入量自体を絞りこんで使用メモリを抑えるか、既にご検討されているように、 memoryLimitはサーバの物理メモリの何パーを使うかを設定すると思っていたのですが。 例えば500MBのメモリならmemoryLimit=20にすれば500MB*20%=100MBをワーカプロセスの メモリが使用できると思っていたのですがどうなんでしょうか? >メモリを使用しないようにコードを書き直すか(不正にメモリを確保している犯人がいるならそいつを捕まえるか)、になるんじゃないかと思います。 その不正にメモリを確保している犯人探しがつらいです。 とりあえずIISのログを採取して各画面がGet,Postしている時間やバイト数を見ているの ですがいまいち決め手になるようなものがありません。 D, an alchemist.さんの言うとおりにDetasetのゴミがたくさん残って開放できないのかな と思います。 あと近頃ワーカプロセスが何のエラーも返さずに予期せぬエラーで落ちてしまいます。 メモリを多く使用しているのでもなく突然落ちるのです。 1.0のframeworkでそんなバグがあったと思うのですが1.1でありパッチも最新なので 関係ないし・・・ でも何らかのエラーが発生してワーカプロセスが落ちると使用している人が全員使えなく なってしまうのも困ってしまいます。 |