メモリの性能分析事例紹介
表1.ポイントと項目
No | ポイント | コマンドとオプション | 内容 |
@ | カーネルチューニングの効果(その1) | /etc/system | 空きメモリの不足によって、どのようにファイル入出力に影響が現れるのかを紹介します。パラメタは、setコマンドによるカーネルパッチです。本事例は、実際にあったORACLE SGAのサイジングミスを元にしています。 |
A | カーネルチューニングの効果(その2) | /etc/system | 空きメモリの不足によって、どのようにページング処理そのものに影響が現れるのかを紹介します。パラメタは、setコマンドによるカーネルパッチです。 |
B | カーネルチューニングの効果(その3) | /etc/system | ページングそのものに与える影響を確認します。パラメタは、setコマンドによるカーネルパッチです。 |
本事例では、メモリが絶対的に不足している状態と、空きメモリがふんだんにある状態で、カーネルチューニングパラメタを設定することにより、ファイル入出力処理がどのように影響を受けるのかを紹介します。テストシナリオ番号は、19から25番です。
表1.1 メモリ関連のカーネルチューニングパラメタ
チューニング 条件の番号 |
パラメタ | 省略時値 【備考】 |
設定値 【備考】 |
内容 |
(1) | lotsfree | 1,955 | 7,820 | ページング開始のためのしきい値です。通常、物理メモリの1/64です。単位はページです。 |
(2) | desfree | 977 | 3,910 | ページング走査レートが高くなるしきい値です。通常、物理メモリの1/128です。単位はページです。 |
(3) | minfree | 488 | 1,955 | 強制スワップアウトのためのしきい値です。通常、物理メモリの1/256です。単位はページです。 |
(4) | tune_t_flushr | 5 | 10 | fsflush(ファイルシステムフラッシャー)を呼び出す間隔です。秒単位です。 |
(5) | autoup | 30 | 60 | ファイルシステム同期の処理を行う単位です。空きリスト(フリーリスト)にこの時間を越えて更新済みページがあると、ファイルシステムに書き出されます。また、省略時値を用いた場合、検査するメモリ量はautoup/tune_t_flushrで、6の値が出ます。すなわち、メモリ量の1/6を検査することを示します。 |
(6) | maxpgio | 40 | 160 | 1回のページ入出力の要求で処理するページ数を決めるパラメタです。実際のページ数はこの値を4で割った値になります。 |
【備考】実装されているメモリサイズで変化するものがあります。本事例ではメモリ1ギガバイトのシステムです。
ddコマンドを、ブロックサイズを変え、メモリ不足時、およびメモリが空いている時に実行しています。出力されるファイルはいづれも1ギガバイトです。表1.2から1.5に、各処理におけるエラプス時間と、CPU時間を示します。SIDはテストシナリオ番号で、7番は省略時値、すなわちカーネルチューニングを行っていない時のデータです。メモリ不足時は、テストシナリオ番号、20と24番に効果が現れています。メモリが空いている状態では、カーネルチューニングの効果はありません(むしろ逆効果かも知れません)。
表1.2 メモリ不足時512バイトブロックの処理
SID | ブロックサイズ | エラプス時間 | CPU時間(秒) | CPU率 | lotsfree | desfree | minfree | tune_t_flushr | autoup | maxpgio | ||
分:秒 | 秒 | sys | user | rate% | ||||||||
7 | 512 | 2:17 | 136.72 | 43.12 | 10.71 | 39.37 | ||||||
19 | 512 | 2:08 | 127.84 | 39.97 | 10.65 | 39.60 | ○ | ○ | ○ | |||
20 | 512 | 1:49 | 109.44 | 34.22 | 10.16 | 40.55 | ○ | ○ | ○ | ○ | ○ | |
21 | 512 | 2:17 | 137.28 | 43.83 | 10.69 | 39.71 | ○ | ○ | ||||
22 | 512 | 2:11 | 130.64 | 41.41 | 10.61 | 39.82 | ○ | ○ | ○ | ○ | ○ | ○ |
23 | 512 | 2:17 | 136.88 | 40.63 | 10.61 | 37.43 | ○ | |||||
24 | 512 | 1:55 | 114.72 | 34.76 | 10.11 | 39.11 | ○ | ○ | ○ | ○ | ||
25 | 512 | 2:24 | 143.92 | 45.60 | 10.51 | 38.99 | ○ | ○ | ○ |
表1.3 メモリ不足時16キロバイトブロックの処理
SID | ブロックサイズ | エラプス時間 | CPU時間(秒) | CPU率 | lotsfree | desfree | minfree | tune_t_flushr | autoup | maxpgio | ||
分:秒 | 秒 | sys | user | rate% | ||||||||
7 | 16,384 | 1:48 | 107.60 | 18.97 | 0.19 | 17.81 | ||||||
19 | 16,384 | 1:39 | 99.20 | 18.68 | 0.15 | 18.98 | ○ | ○ | ○ | |||
20 | 16,384 | 1:22 | 81.73 | 12.81 | 0.29 | 16.03 | ○ | ○ | ○ | ○ | ○ | |
21 | 16,384 | 1:50 | 109.92 | 21.13 | 0.26 | 19.46 | ○ | ○ | ||||
22 | 16,384 | 1:39 | 99.28 | 18.46 | 0.29 | 18.89 | ○ | ○ | ○ | ○ | ○ | ○ |
23 | 16,384 | 1:48 | 108.32 | 18.70 | 0.20 | 17.45 | ○ | |||||
24 | 16,384 | 1:28 | 87.68 | 13.15 | 0.24 | 15.27 | ○ | ○ | ○ | ○ | ||
25 | 16,384 | 1:52 | 111.84 | 21.18 | 0.23 | 19.14 | ○ | ○ | ○ |
表1.4 メモリ空き時512バイトブロックの処理
SID | ブロックサイズ | エラプス時間 | CPU時間(秒) | CPU率 | lotsfree | desfree | minfree | tune_t_flushr | autoup | maxpgio | ||
分:秒 | 秒 | sys | user | rate% | ||||||||
7 | 512 | 1:17 | 77.48 | 32.03 | 10.48 | 54.87 | ||||||
19 | 512 | 1:28 | 87.60 | 31.82 | 10.77 | 48.62 | ○ | ○ | ○ | |||
20 | 512 | 1:26 | 85.76 | 31.93 | 10.43 | 49.39 | ○ | ○ | ○ | ○ | ○ | |
21 | 512 | 1:24 | 84.24 | 32.27 | 10.01 | 50.19 | ○ | ○ | ||||
22 | 512 | 1:26 | 85.68 | 31.96 | 10.49 | 49.54 | ○ | ○ | ○ | ○ | ○ | ○ |
23 | 512 | 1:26 | 85.84 | 32.19 | 10.51 | 49.74 | ○ | |||||
24 | 512 | 1:23 | 82.88 | 32.03 | 10.12 | 50.86 | ○ | ○ | ○ | ○ | ||
25 | 512 | 1:23 | 83.12 | 31.82 | 10.60 | 51.03 | ○ | ○ | ○ |
表1.5 メモリ空き時16キロバイトブロックの処理
SID | ブロックサイズ | エラプス時間 | CPU時間(秒) | CPU率 | lotsfree | desfree | minfree | tune_t_flushr | autoup | maxpgio | ||
分:秒 | 秒 | sys | user | rate% | ||||||||
7 | 16,384 | 1:04 | 64.31 | 10.58 | 0.28 | 16.89 | ||||||
19 | 16,384 | 1:07 | 66.73 | 10.51 | 0.28 | 16.17 | ○ | ○ | ○ | |||
20 | 16,384 | 1:07 | 67.47 | 10.36 | 0.26 | 15.74 | ○ | ○ | ○ | ○ | ○ | |
21 | 16,384 | 1:07 | 66.49 | 10.54 | 0.17 | 16.11 | ○ | ○ | ||||
22 | 16,384 | 1:07 | 66.94 | 10.55 | 0.23 | 16.10 | ○ | ○ | ○ | ○ | ○ | ○ |
23 | 16,384 | 1:07 | 67.01 | 10.50 | 0.25 | 16.04 | ○ | |||||
24 | 16,384 | 1:07 | 67.47 | 10.29 | 0.29 | 15.68 | ○ | ○ | ○ | ○ | ||
25 | 16,384 | 1:07 | 67.24 | 10.20 | 0.19 | 15.45 | ○ | ○ | ○ |
図1.1は、20番と23番の主なメモリ関連の性能指標をグラフにしたものです。
解説 | テストシナリオ番号:20 os | テストシナリオ番号:23 os |
ORACLEの立ち上げによってメモリ不足に陥ります。メモリ不足時にddコマンドを2回実行し、その後ORACLEを停止すると、メモリが空きます。メモリが空くと、余分なディスク入出力が無くなりスムーズに動作します。 | ||
トータルのメモリ量は変化しませんので、空きメモリの振る舞いは同じです。 | ||
20番は、ページング開始のしきい値が高いためページ走査が盛んです。23番は通常のページングしきい値です。 | ||
20番では、メモリ不足のためファイル出力がなかなか下がりません。23番では、ページング開始のしきい値が低いため、バッファキャッシュ効果で除々にファイル出力が下がってきます。 | ||
メモリ不足時に、anon(無名)ページ、すなわちデータやスタックセグメントがページアウトし、空きメモリが出来るとメモリに呼び戻されています。 | ||
空きメモリが出来てもページインされていません。すなわち、メモリ不足時にフリーにされたテキストセグメントはほぼ使用されないページ=ワーキングセットと解釈されます。 |
本事例では、空きメモリがある状態から不足状態になり、再び空きメモリが回復する動作において、カーネルチューニングパラメタを設定することにより、ページング処理そのものがどのように動作するのかを紹介します。テストシナリオ番号は、26から33番です。チューニングパラメタを表2.1に示します(表1.1と同じです)。
表2.1 メモリ関連のカーネルチューニングパラメタ
チューニング 条件の番号 |
パラメタ | 省略時値 【備考】 |
設定値 【備考】 |
内容 |
(1) | lotsfree | 1,955 | 7,820 | ページング開始のためのしきい値です。通常、物理メモリの1/64です。単位はページです。 |
(2) | desfree | 977 | 3,910 | ページング走査レートが高くなるしきい値です。通常、物理メモリの1/128です。単位はページです。 |
(3) | minfree | 488 | 1,955 | 強制スワップアウトのためのしきい値です。通常、物理メモリの1/256です。単位はページです。 |
(4) | tune_t_flushr | 5 | 10 | fsflush(ファイルシステムフラッシャー)を呼び出す間隔です。秒単位です。 |
(5) | autoup | 30 | 60 | ファイルシステム同期の処理を行う単位です。空きリスト(フリーリスト)にこの時間を越えて更新済みページがあると、ファイルシステムに書き出されます。また、省略時値を用いた場合、検査するメモリ量はautoup/tune_t_flushrで、6の値が出ます。すなわち、メモリ量の1/6を検査することを示します。 |
(6) | maxpgio | 40 | 160 | 1回のページ入出力の要求で処理するページ数を決めるパラメタです。実際のページ数はこの値を4で割った値になります。 |
【備考】実装されているメモリサイズで変化するものがあります。本事例ではメモリ1ギガバイトのシステムです。
sweepコマンド(メモリを掃除する作成プログラム)でどのようにページング処理が動作するのかを確認しました。sweepコマンドの処理状況を表2.2に示します。SIDはテストシナリオ番号で、26から33番です。26番は省略時値、すなわちカーネルチューニングを行っていない時のデータです。
表2.2 sweepコマンドの処理状況
SID | エラプス(秒) | sysCPU(秒) | userCPU(秒) | CPU率 | lotsfree | desfree | minfree | tune_t_flushr | autoup | maxpgio |
26 | 66.64 | 16.78 | 7.46 | 36.37 | ||||||
27 | 69.11 | 14.62 | 7.75 | 32.37 | ○ | ○ | ○ | |||
28 | 56.27 | 16.12 | 7.94 | 42.76 | ○ | ○ | ||||
29 | 74.90 | 16.44 | 7.92 | 32.52 | ○ | |||||
30 | 79.31 | 14.60 | 7.74 | 28.17 | ○ | ○ | ○ | ○ | ○ | |
31 | 71.97 | 15.44 | 7.74 | 32.21 | ○ | ○ | ○ | ○ | ||
32 | 87.20 | 16.74 | 7.56 | 27.87 | ○ | ○ | ○ | |||
33 | 69.12 | 14.29 | 7.77 | 31.92 | ○ | ○ | ○ | ○ | ○ | ○ |
特に28番にエラプス時間の短縮が見られます。これはメモリを確保する時、ディスクバッファキャッシュの書き込みタイミングが遅くなるため、ディスク入出力が軽減されるためと考えました。しかしながら、30、32、および33番にエラプス時間の短縮は見られず、むしろ処理が長引いているように見えます。図2.1はページング関連の主要な指標をグラフにしたものです。大きな変化はありませんが、26番と28番は近似しています。
グラフ |
テストシナリオ番号:26〜33 os |
テストシナリオ番号:26〜33 os |
テストシナリオ番号:26〜33 os |
テストシナリオ番号:26〜33 os |
図2.1 ページング関連の主な性能指標
振る舞いに不自然な点が見られます。このため、他の性能指標をあたってみます。すると、スワップアウトの値に大きな違いがあることが分かりました。表2.3にプロセスアカウント情報、表2.4にsarコマンド-wで表示される秒あたりにスワップアウトしたブロック数bswpot/s、および表2.5にvmstatコマンド-sオプションで表示される統計情報"pages swapped out値"を示します。
表2.3 sweepコマンドのプロセスアカウント情報
SID | 開始時刻 | 終了時刻 | エラプス(秒) | sysCPU(秒) | userCPU(秒) | キロバイトメモリ |
26 | 15:35:08 | 15:36:14 | 66.64 | 16.78 | 7.46 | 329,734.76 |
27 | 16:16:27 | 16:17:36 | 69.11 | 14.62 | 7.75 | 228,043.01 |
28 | 16:31:17 | 16:32:13 | 56.27 | 16.12 | 7.94 | 432,221.63 |
29 | 16:46:25 | 16:47:39 | 74.90 | 16.44 | 7.92 | 257,086.21 |
30 | 17:05:48 | 17:07:07 | 79.31 | 14.60 | 7.74 | 203,237.87 |
31 | 17:20:50 | 17:22:01 | 71.97 | 15.44 | 7.74 | 322,873.65 |
32 | 17:35:24 | 17:36:51 | 87.20 | 16.74 | 7.56 | 234,311.43 |
33 | 18:24:35 | 18:25:44 | 69.12 | 14.29 | 7.77 | 286,742.28 |
表2.4 bswot/sの最小、最大、および平均値
SID | 最小 | 最大 | 平均 | 合計値 | ||
値 | 時刻 | 値 | 時刻 | |||
26 | 0 | 15:34:05 | 50,849 | 15:35:51 | 1,768 | 51,269 |
27 | 0 | 16:15:29 | 101,844 | 16:16:55 | 5,309 | 164,577 |
28 | 0 | 16:30:15 | 698 | 16:32:15 | 24 | 698 |
29 | 0 | 16:45:28 | 132,224 | 16:46:57 | 5,955 | 178,649 |
30 | 0 | 17:04:52 | 127,427 | 17:06:29 | 9,949 | 298,479 |
31 | 0 | 17:19:53 | 132,347 | 17:21:52 | 5,881 | 176,424 |
32 | 0 | 17:34:29 | 194,022 | 17:36:44 | 13,303 | 425,704 |
33 | 0 | 18:23:38 | 131,363 | 18:25:32 | 5,998 | 185,937 |
表2.5 vmstatコマンド-sオプションの"pages swapped out"
SID | pages swapped out |
26 | 68,109 |
27 | 131,845 |
28 | 1,503 |
29 | 134,022 |
30 | 193,741 |
31 | 133,336 |
32 | 200,282 |
33 | 132,786 |
以上のことから、28番のテスト結果は、スワップアウトしないで(またはスワップアウトする必要がない状態で)sweepコマンドが実行されたことがわかりました。一方、32番のスワップアウトされたページ数は通常の約2倍、30番は通常の1.5倍、26番は通常の約1/2となります(3分間の性能情報採取のため誤差が大き過ぎるようです。ここで言う「通常」とは、表2.5の27、29、31、および33番の値を言います)。図2.2に26〜33番のCPU使用状況を示します。図から分かるように、%wioが高く現れています。ページングのタイミングが前後することはあっても、結果的にディスク入出力待ちがネックとなり、値を改善できないことがわかりました。これらのことから、現段階では、メモリ不足のシステムに対するページング関連のカーネルチューニングパラメタ設定は、ページングタイミングを前後させる他、大きなメリットはないと言えます。対策としては、メモリサイジングを行い、正しい見積りを導き出すことが重要です。
テストシナリオ番号:26 os |
テストシナリオ番号:27 os |
テストシナリオ番号:28 os |
テストシナリオ番号:29 os |
テストシナリオ番号:30 os |
テストシナリオ番号:31 os |
テストシナリオ番号:32 os |
テストシナリオ番号:33 os |
図2.1 ページング時のCPU使用状況
本事例のチューニングは、データに変化が見られないため、紹介を省略させていただきます。
表3.1 メモリ関連のカーネルチューニングパラメタ(その2)
チューニング 条件の番号 |
パラメタ | 省略時値 【備考】 |
設定値 【備考】 |
内容 |
(1) | handspreadpages | 8,192 | 32,768 | クロックアルゴリズムにおいて、最初のメモリ走査時につけた使用確認マークを、次のメモリ走査時に確認し、その間に使用されなかったメモリを再利用します。この最初と次のメモリ走査で検査するメモリ量です。単位はバイトです。 |
(2) | fastscan | 8,192 | 32,768 | メモリが最も不足している時に、1秒間にページ走査する最大数です。単位はバイトです。 |
(3) | min_percent_cpu | 4 | 16 | pageoutデーモンで使用できる最小のCPU使用率です。単位はパーセントです。 |
(4) | maxpgio | 40 | 320 | 1回のページ入出力の要求で処理するページ数を決めるパラメタです。実際のページ数はこの値を4で割った値になります。 |
【備考】実装されているメモリサイズで変化するものがあります。本事例ではメモリ1ギガバイトのシステムです。
Copyright (C) 2004 by The Art of Computer Technologies, Corp. All rights reserved.