トップ回答者
メモリの動きについて

質問
-
お世話になってます。
表題の件でご存知の方がいらっしゃいましたら、情報をいただけないかと思い投稿させていただきます。
windows server 2003でバックアップが異常終了をしています。
これの対策として、以下を対応予定としております。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management
・PoolUsageMaximum (60に設定)
・PagedPoolSize (ffffffffに設定)
※kb/312362の件です。
PagedPoolSizeを最大で設定するのはなんとなく理解ができるのですが
PoolUsageMaximuを60と設定する意図がよくわかりません。(PagedPoolSizeの対応だけでいいのではないかと。。)
メモリマネージャーなるものが動作し始める値を示すようなのですが、この値によって処理として影響がでる(良い悪いに関わらず)部分は何だと思いますか?
なにか意見をお持ちの方は返信いただけると嬉しいです。
知識不足で申し訳ないですが、よろしくお願いします。
2015年3月12日 4:55
回答
-
PagedPool は、物理メモリ上から pagefile にページ アウトされることを前提としたメモリになります。
これに対して NonpagedPool は、ページ アウトされない、つまり解放されるまで物理メモリ上に確保し続けられるメモリになります。
物理メモリの使用量が高まると、メモリ マネージャは PagedPool として確保されているメモリに対して、使用頻度の低いものは pagefile へのページ アウト処理を行い、必要とされる物理メモリ空間を確保しようとします。
pagefile へのページ アウトおよび物理メモリ上へのページ イン、即ちページ フォールトの発生はディスク アクセスを伴うので、パフォーマンスに影響します。
PoolUsageMaximum エントリの値を下げると、ページ フォールトの発生頻度が高くなるので、システム パフォーマンスは低下します。
逆にこの値を上げると、ページ フォールトの発生頻度低くなりますが、PagedPool からのメモリの割り当てに失敗する可能性が高くなります。
PagedPool からのメモリの割り当てが失敗するということは、PagedPool の使用率が高くなっている可能性が高いので、PoolUsageMaximum エントリの値を下げれば(パフォーマンスは犠牲になるが)改善する。。。ということだと思います。
P.S.
この動作の詳細については、チャブーンさんが仰っているように、「インサイド Windows」にばっちり説明されています。
ただ私にとってこの本は非常に難解で、何度も読み直さないと理解できませんでした。
いまだにちゃんと理解できていないところがたくさんあります。。。- 回答としてマーク click click 2015年3月13日 8:56
- 編集済み お馬鹿 2015年3月13日 9:12 追記
2015年3月13日 6:55
すべての返信
-
バックアップの異常終了の原因はわかったうえでの対応ということでよいでしょうか。
下記の値を変更するというのは、基本的にはリソース不足でこの対応をされるという認識でよいでしょうか。
PoolUsageMaximum は、Pool の Size の 60 % まで達したら、最適化的なことをしてくれるようなイメージです。(適切な表現ではないかもしれませんが)
なので、おそらく 80 のままであれば 80% で処理が開始されるでしょう。Pool Size を大きくしたので、こちらの値を変更しなくてもよいと
いうより 60% のほうが閾値に達するまで余力があるのでそちらのほうが安全なのではないでしょうか。
ただ、こちらの方法はあくまで対処療法的な意味合いが強いと思います。
・PoolUsageMaximum (60に設定)
・PagedPoolSize (ffffffffに設定)
2015年3月12日 5:24 -
ご意見ありがとうございます。
>バックアップの異常終了の原因はわかったうえでの対応ということでよいでしょうか。
→確実に分かったかと言われると、可能性レベルとしか言えないです。
バックアップ失敗タイミングで、
「コマンド処理をするのに必要な記憶域をサーバに確保できません」
というエラーが出力されていたことと、
「フルバックアップ且つ上書き動作が必要」
なバックアップのみで失敗をしていたことからメモリ関連の問題だと考えております。
※補足ですが
差分バックアップ→成功、フルバックアップ→失敗
基本追記でのバックアップだが、追記可能ファイルがない時には古いファイルを上書するように設定されてます。
>PoolUsageMaximum は、Pool の Size の 60 % まで達したら、最適化的なことをしてくれるようなイメージです。>(適切な表現ではないかもしれませんが)
→私が調べた限りではあまり低くしすぎてもいけないとのことでした。
最適化的なこと(?)をしてくれるのであれば、低くても問題ないと思うので矛盾する気がします。そもそも私の認識がずれているのですかね?
また、最適化的なことっていうのは非ページプールとページプールの内訳をしてくれるってことですか?
(ただpagedpoolsizeはffffffffだから、そもそも内訳を行う必要がない気もします。)
まとまっていなくて分かりづらいかと思いますが、イメージでもいいので知恵をお貸し頂けたら幸いです。
よろしくお願いします。
2015年3月12日 6:38 -
具体的な処理については存じません。というよりは KB に書かれていることが公的な上布とはすべてという理解です。
ですので、KB の情報を見た限りでそう処理をしていると感じました。
Setting the value at 60 informs the Memory Manager to start the trimming process at 60 percent of PagedPoolMax rather than the default setting of 80 percent. If a threshold of 60 percent is not enough to handle spikes in activity, reduce this setting to 50 percent or 40 percent.
- 編集済み Hotaka 2015年3月12日 7:42
2015年3月12日 7:41 -
チャブーンです。
まず前提ですが、Windowsのメモリ管理についてある程度詳しく知りたい、ということでしたら、前提知識が必要です。一番ラクでよいのが書籍をきちんと読む(インサイドWindowsという書籍あたりがよいでしょう)ことかと思います。いますぐ情報がほしい、ということでしたらインサイドWindowsの作者がコメントしたPagedとNonPagedに関するブログを読むことができます。英語ですが。
http://blogs.technet.com/b/markrussinovich/archive/2009/03/26/3211216.aspx
直接のご質問ですが、PoolUsageMaximumを下げすぎるな(下限は30%です)、といっているのは、結局既存のプログラムのパフォーマンスが下がるから、ということのように見受けられます。
PoolUsageMaximumでしきい値に達した場合、Paged Poolの最適化が行われるということですが、おそらくは可能なメモリ上のデータをpageoutしているのでしょう。pageoutが発生した場合、そのデータを使っているプログラムがデータを再利用する場合page fault(物理メモリへの再マップ)が発生するので、「そのまま使い続けた場合」より、もちろんパフォーマンスが落ちます。このメモリ領域を利用するプログラムはOSの基盤やドライバ周りに近い、高パフォーマンスや確実な動作性が必要なものが多いですから、パフォーマンスの低下はそのまま動作品質に直結します。
しきい値が低いことで、頻繁に最適化が行われれば、「パフォーマンスが高くなければならない」アプリケーションのパフォーマンスが低下する可能性が増え、問題が発生するでしょう。合わせて当然ですがOS自体が最適化を行うためにリソースを消費しますから、さらにパフォーマンスが下がるかもしれません。
ページプールサイズの増大化と最適化しきい値を同時に変更するのは、「どのくらいプールを空けておけば問題がないか」が、それを必要としているアプリケーションに依存しているからです。空きがたくさんあれば、たくさんメモリを消費するアプリケーションにも対応できますが、空きが少なければこのようなアプリケーションを使ったとき(キャパシティ以上に使おうとするので)問題は解決しないでしょう。「たくさん」がどの程度の量なのかは事前にはわかりませんから、このような対応になることもいたしかたないと思います。
うえのような話しは、私自身が仕組みを理解したうえで「想像」したことも含まれています。こういったことを理解したい、ということでしたら、ご自身で「理解」と「想像」を働かせてみる、のはいい方法かと思います。
2015年3月12日 10:37 -
PagedPool は、物理メモリ上から pagefile にページ アウトされることを前提としたメモリになります。
これに対して NonpagedPool は、ページ アウトされない、つまり解放されるまで物理メモリ上に確保し続けられるメモリになります。
物理メモリの使用量が高まると、メモリ マネージャは PagedPool として確保されているメモリに対して、使用頻度の低いものは pagefile へのページ アウト処理を行い、必要とされる物理メモリ空間を確保しようとします。
pagefile へのページ アウトおよび物理メモリ上へのページ イン、即ちページ フォールトの発生はディスク アクセスを伴うので、パフォーマンスに影響します。
PoolUsageMaximum エントリの値を下げると、ページ フォールトの発生頻度が高くなるので、システム パフォーマンスは低下します。
逆にこの値を上げると、ページ フォールトの発生頻度低くなりますが、PagedPool からのメモリの割り当てに失敗する可能性が高くなります。
PagedPool からのメモリの割り当てが失敗するということは、PagedPool の使用率が高くなっている可能性が高いので、PoolUsageMaximum エントリの値を下げれば(パフォーマンスは犠牲になるが)改善する。。。ということだと思います。
P.S.
この動作の詳細については、チャブーンさんが仰っているように、「インサイド Windows」にばっちり説明されています。
ただ私にとってこの本は非常に難解で、何度も読み直さないと理解できませんでした。
いまだにちゃんと理解できていないところがたくさんあります。。。- 回答としてマーク click click 2015年3月13日 8:56
- 編集済み お馬鹿 2015年3月13日 9:12 追記
2015年3月13日 6:55 -
チャブーンです。
お馬鹿さん、適切な回答をありがとうございます。
本スレッドですが、ちょっと気になって追加の調べをしたところ、Mark Russinovichのブログの日本語訳版が、実はあることがわかりました。英語版はもっとたくさんあるはずですが、難解な言葉も多いので、日本語版は大変役に立ちそうです。
https://technet.microsoft.com/ja-jp/windows/mark.aspx
で、本スレッドでご紹介した記事も、日本語訳されていました。これは知らなかったので、こちらも勉強になった次第です。皆様にも含め、ご紹介しておきます。
2015年3月18日 1:59