メモリー管理に関する質問
Environment
- Red Hat Enterprise Linux (すべてのバージョン)
Issue
- サイジング目的で利用可能なメモリー容量を確認するにはどうすればよいですか?
- キャッシュされているメモリーの容量や、どのプロセスによってキャッシュされているかを確認する方法を教えてください。 キャッシュを "所有" または報告しているプロセスを確認するにはどうすればよいですか?
- サーバーに追加できるデータベースインスタンスの数や、他のプロセスまたはインスタンスに使用できるデータベースインスタンスの数を決定するときに、どの数値を使用する必要がありますか?
- 合計メモリーが以下のように報告されます。
# sar -r (kbmemfree + kbmemused) = 49322992
# vmstat 3 3 (free + buff + cache) = 46767488
# free (total)= 49322992
# ps -aux RSS = 31090168 (used)
- vmstat で報告される合計メモリーが、free や sar で報告されるものと異なるのはなぜですか?
- 48 GB の RAM を搭載したシステムで、RSS の形でプロセスによって使用されているメモリーが約 31 GB あり、FS(?) キャッシュが約 38 GB あるのはなぜでしょうか?
- 現在 3 つの Oracle インスタンスを実行しているサーバーがあり、さらに 2 つのインスタンスを追加したいと考えています。
- この場合、十分なリソース (特に RAM) が利用可能であることを確認するにはどうすればよいですか?
- free を実行すると、サーバーの現在の状態で 44 GB が "解放可能" であると表示されます。 この数値は考慮すべきでしょうか?
# free -g
total used free shared buffers cached
Mem: 47 41 6 0 0 37
-/+ buffers/cache: 2 44
Swap: 31 0 31
# free
total used free shared buffers cached
Mem: 49322992 43075896 6247096 0 712936 39799284
-/+ buffers/cache: 2563676 46759316
Swap: 33554424 673416 32881008
# vmstat 3 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 674544 6263992 701620 39795264 0 0 58 249 2 2 3 1 94 2 0
0 0 674540 6263076 701660 39795248 0 0 0 1605 1140 3846 7 3 88 2 0
0 0 674540 6263688 701660 39795268 0 0 0 89 1038 3824 0 0 99 1 0
# sar -r
07:20:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
07:30:01 AM 6416104 42906888 86.99 664508 39730540 32876180 678244 2.02 98260
07:40:01 AM 6412164 42910828 87.00 668628 39731476 32876316 678108 2.02 98244
07:50:01 AM 6408016 42914976 87.01 672636 39733016 32876508 677916 2.02 98204
08:00:01 AM 6397940 42925052 87.03 676484 39734048 32876524 677900 2.02 98188
08:10:01 AM 6392680 42930312 87.04 680520 39736572 32876900 677524 2.02 98396
08:20:01 AM 6347280 42975712 87.13 684280 39738236 32877084 677340 2.02 98448
08:30:01 AM 6340504 42982488 87.14 688400 39738932 32877084 677340 2.02 98448
08:40:01 AM 6334748 42988244 87.16 692524 39739840 32877128 677296 2.02 98412
08:50:01 AM 6324936 42998056 87.18 696772 39744052 32879644 674780 2.01 99164
09:00:01 AM 6313072 43009920 87.20 700884 39744648 32879644 674780 2.01 99164
Average: 6553141 42769851 86.71 605553 39652062 32850845 703579 2.10 108613
Resolution
-
サイジング目的で利用可能なメモリー容量を確認するにはどうすればよいですか?
これは、"free" コマンドの出力により確認できます。
# free total used free shared buffers cached Mem: 49322992 43075896 6247096 0 712936 39799284 -/+ buffers/cache: 2563676 46759316 Swap: 33554424 673416 32881008
合計物理メモリー (RAM) は、49322992 KB です。
空き物理メモリー (RAM) は、スワップ + バッファー + キャッシュ = 46759316 KB です。
利用可能な空きメモリーの合計は、'スワップ + メモリー' です。より明確に言うと、'空きスワップ + 空きメモリー (空きメモリー + バッファー + キャッシュ)' です。 -
キャッシュされているメモリーの容量や、どのプロセスによってキャッシュされているかを確認する方法を教えてください。 キャッシュを "所有" または報告しているプロセスを確認するにはどうすればよいですか?
"キャッシュ" として使用されているメモリー容量は、# grep -iE "cache" /proc/meminfo で確認できます。
キャッシュは、メモリを効率的に利用してワークロードのパフォーマンス低下を防ぎ、システム全体のパフォーマンスを向上させるために使用されるカーネル構造です。
キャッシュはカーネルによって管理されていますが、キャッシュはシステム全体のワークロードの結果であるため、通常、キャッシュを "所有" しているプロセスは 1 つもありません。ただし、Oracle を使用しているお客様の場合、プロセスがキャッシュを所有している場合があります。 キャッシュは 'システムメモリー' と見なされ、システムのワークロードの要求に応じて簡単に縮小または回収できるため、'解放可能' と報告されます。 -
サーバーに追加できるデータベースインスタンスの数や、他のプロセスまたはインスタンスに使用できるデータベースインスタンスの数を決定するときに、どの数値を使用する必要がありますか?
一般的なシナリオでは、'free' の値を使用できます。利用可能なメモリーの量は 'free + buffer + cache' です。 メモリーが唯一の制約である場合は、データベースバッファー/キャッシュのスワップアウトをできる限り回避することを検討する必要があります。 経験則として、システムメモリーの 70% を超える SGA サイズを使用しないことをお勧めします。 Oracle を使用している場合、Oracle に意見を求めることをお勧めします。
**合計メモリーは以下の値を使用します。**#sar -r (kbmemfree + kbmemused) = 49322992 #vmstat 3 3 (free + buff + cache) = 46767488 #free (total)= 49322992 #ps -aux RSS = 31090168 (used)
-
vmstat で報告される合計メモリーが、free や sar で報告されるものと異なるのはなぜですか?
'vmstat' の場合、free + buff + cache を足すと、システムで利用可能な空きメモリーの量が算出されます。これは、'free' とほぼ同じです。
free、buffer、cache のそれぞれの値を次のように加算します。from free = 6247096 +712936+39799284 =46759316 from vmstat = 6263992 +701620+39795264 =43760876
これはほぼ同じです。 また、"free" と "sar -r" は物理メモリーのスナップショットを、"vmstat" はプロセス、メモリー、ページング、ブロック IO、トラップ、CPU のアクティビティーに関する情報を報告し、遅延時間のサンプリング周期に関する情報を瞬時に生成することも特筆すべき点です。 そのため、タイムリーにそれらを比較すると、報告された値の間にわずかな差が見られるのが普通です。
-
48 GB の RAM を搭載したシステムで、RSS の形でプロセスによって使用されているメモリーが約 31 GB あり、FS(?) キャッシュが約 38 GB あるのはなぜでしょうか?
RSS には、共有メモリーセグメント (メモリーマッピング、libs) が含まれるため、プロセスの正確なメモリーフットプリントがレンダリングされません。
-
現在 3 つの Oracle インスタンスを実行しているサーバーがあり、さらに 2 つのインスタンスを追加したいと考えています。
この場合、十分なリソース (特に RAM) が利用可能であることを確認するにはどうすればよいですか?
free を実行すると、サーバーの現在の状態で 44 GB が "解放可能" であると表示されます。 この数値を使用すべきでしょうか?いいえ、この数値は 潜在的 に利用可能なメモリーの量を示しています。 利用可能な空きメモリーは 'free + buff + cache' です。
ただし、これには注意が必要です。 Oracle データベースの場合、free + buffer + cache だけを考慮するのでは不十分です。 Oracle は SGA を使用します。 Oracle SGA はすべての共有メモリーを RAM に保持しますが、これは他のアプリケーションでは使用されません。 SGA は、free の出力の "cached" 下に表示されます。 cache の下の SGA に割り当てられたメモリーは、利用可能と見なすことはできません。
-
予想される合計 SGA が 8 GB である新しい DB インスタンスのシステムと要件があります。 メモリーが唯一の制約であると仮定します。 十分な RAM が利用可能かどうかを判断するにはどうすればよいですか?
一般的に、SGA はオペレーティングシステムで利用可能な物理メモリーの合計の 70% 以下であるべきとされています。
通常の場合、利用可能な空きメモリーの量は 'free + cached + buffer' ですが、この場合、このシステム上に Oracle が 3 インスタンスあり、メモリーのほとんどがキャッシュに利用されていることがわかります。空きメモリーの量は、SGA のサイズに依存するため、計算することができません。 これについては、Oracle から提案を受けることをお勧めします。 -
SGA はキャッシュに存在しますか? すべての SGA がキャッシュに存在するのか、それとも一部だけが存在するのですか? 一部だけの場合は、どの部分ですか?
はい、すべての SGA はキャッシュにのみ存在します。
-
SGA の例を次に示します。どのコンポーネントがキャッシュで表現されますか?
SGA Component Current Allocation (MB) Shared Pool 444 Buffer Cache 280 Large Pool 4 Java Pool 4 Other 16
これらのコンポーネントはすべてキャッシュメモリーの一部です。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments