Linux vmstat
LPIC Level 3coreをとってみようと思う。
そこでキャパシティプランニングに出るvmstatを色々試してみた。
■其の1 memory swpd, freeを観察。
(sampleプログラム(memaloc)は末尾参照)
1.5Gを3秒間隔で確保/開放を2回実行。
3秒間隔でMbyte単位で表示
メモリ確保に時間がかかるためだんだんとメモリが枯渇していく様子が見える
また、swapと同時にディスクI/Oも増えていることが確認できる
swap si(swap in), so(swap out)に変化が無いのはなぜだろう。。。
■其の2 memory buff, cacheを観察する
①1Gのファイルを作成(ディスクに書き込み)。
3秒間隔でMbyte単位で表示
②でバッファ上のデータがディスクに書き込まれたためディスクI/O(bo)が増加
③ページキャッシュが開放されてfreeの増加とcacheが減少
④でファイル読み込み(bi増加)と同時にページキャッシュ(cache)増加とfree減少
やってみると良く分からないことが多い。
特にswpdが増えたり減ったりしてもsi,soが動かない。。。なぜ??
(参照)メモリ確保/開放 C++プログラム
そこでキャパシティプランニングに出るvmstatを色々試してみた。
■其の1 memory swpd, freeを観察。
(sampleプログラム(memaloc)は末尾参照)
1.5Gを3秒間隔で確保/開放を2回実行。
[root@localhost ~]# ./memaloc 1500 3 2
3秒間隔でMbyte単位で表示
[root@localhost ~]# vmstat 3 -S M procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 99 951 0 20 0 0 79 310 112 145 1 3 96 0 0 0 0 99 951 0 20 0 0 61 0 244 362 2 3 95 0 0 0 0 99 951 0 20 0 0 0 13 107 152 1 0 99 0 0 1 0 99 717 0 21 0 0 44 16 173 224 7 56 36 1 0 1 1 99 12 0 20 0 0 19 1 192 361 37 63 0 0 0 2 5 145 13 0 5 0 0 563 23904 280 280 2 81 0 17 0 ←swapし始める 1 1 276 14 0 5 0 0 152 37561 223 297 11 89 0 0 0 1 2 380 13 0 4 0 0 205 35680 218 267 6 92 0 2 0 1 0 483 14 0 3 0 0 3 35309 192 235 8 92 0 0 0 1 0 571 14 0 3 0 0 23 29993 189 229 5 95 0 0 0 0 1 653 14 0 3 0 0 295 28004 194 256 7 90 0 2 0 0 0 653 13 0 4 0 0 312 0 120 153 0 1 97 2 0 0 0 656 14 0 4 0 0 171 1285 118 141 0 3 94 4 0 1 0 100 573 0 6 0 0 1056 4 149 216 15 84 1 0 0 ←メモリ開放 3 3 100 11 0 4 0 0 765 127 151 172 25 72 0 2 0 4 3 184 13 0 9 0 0 2756 28919 347 368 5 87 0 8 0 ←再度swap 2 2 275 14 0 11 0 0 1319 31160 321 363 5 95 0 0 0 1 0 376 14 0 10 0 0 324 34601 221 292 7 93 0 0 0 1 1 479 15 0 7 0 0 27 35031 193 245 9 91 0 0 0 2 1 575 13 0 6 0 0 5 32848 191 233 9 91 0 0 0 1 0 655 14 0 5 0 0 3 27459 182 227 6 94 0 0 0
メモリ確保に時間がかかるためだんだんとメモリが枯渇していく様子が見える
また、swapと同時にディスクI/Oも増えていることが確認できる
swap si(swap in), so(swap out)に変化が無いのはなぜだろう。。。
■其の2 memory buff, cacheを観察する
①1Gのファイルを作成(ディスクに書き込み)。
[root@localhost ~]# dd if=/dev/zero of=1GFile bs=1M count=1000②メモリバッファをディスクと同期させる(同期していないデータは開放されないため一応)
[root@localhost ~]# sync③ページキャッシュを開放
[root@localhost ~]# echo 3 > /proc/sys/vm/drop_caches④作成ファイルを読み込む
[root@localhost ~]# dd if=1GFile of=/dev/null
3秒間隔でMbyte単位で表示
[root@localhost ~]# vmstat 3 -S M procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 98 951 2 13 0 0 80 428 113 145 1 3 96 1 0 0 0 98 951 2 13 0 0 1 0 274 433 1 10 89 0 0 6 2 98 748 2 212 0 0 17 57383 180 191 1 85 13 1 0 ←① 6 0 98 359 3 589 0 0 0 63971 177 182 0 100 0 0 0 10 0 98 159 3 791 0 0 0 144496 320 231 0 100 0 0 0 2 0 98 13 1 933 0 0 47 0 107 212 1 27 69 2 0 13 0 98 16 1 933 0 0 13 76201 246 197 1 61 37 1 0 ←② 4 0 98 17 1 933 0 0 8 95 117 221 0 6 83 11 0 2 0 98 954 0 10 0 0 307 11 113 162 0 12 84 3 0 ←③ 2 0 98 954 0 10 0 0 25 0 238 394 1 8 90 1 0 0 0 98 945 0 20 0 0 1 12 112 221 0 1 99 0 0 0 0 98 945 0 20 0 0 3 0 123 412 0 3 97 0 0 1 0 98 945 0 20 0 0 0 5 113 322 0 1 99 0 0 1 0 98 941 1 24 0 0 1340 0 131 290 1 8 87 4 0 ←④ 3 0 98 878 1 86 0 0 21213 21 371 483 2 95 0 3 0 3 1 98 732 1 232 0 0 49883 0 498 194 6 87 0 7 0 1 0 98 544 1 420 0 0 64276 4 612 206 10 83 0 7 0 2 0 98 353 1 611 0 0 65173 0 622 199 9 85 0 6 0 2 1 98 159 1 804 0 0 65856 5 644 247 10 85 0 5 0 1 0 98 13 1 950 0 0 62056 0 594 231 5 90 0 5 0 1 0 98 14 1 949 0 0 12041 7 202 163 2 23 73 3 0①でファイルを作成と同時にディスクI/O(bo)増加とページキャッシュ(cache)増加
②でバッファ上のデータがディスクに書き込まれたためディスクI/O(bo)が増加
③ページキャッシュが開放されてfreeの増加とcacheが減少
④でファイル読み込み(bi増加)と同時にページキャッシュ(cache)増加とfree減少
やってみると良く分からないことが多い。
特にswpdが増えたり減ったりしてもsi,soが動かない。。。なぜ??
(参照)メモリ確保/開放 C++プログラム
#includeコンパイル方法は、ソースファイルが「memaloc.cpp」として、#include #include #include int main(int argc, char **argv) { if( argc < 3 ) { std::cout << "how to use 'memaloc " << std::endl; return 1; } unsigned int memsize = atoi(argv[1]); unsigned int stoptime = atoi(argv[2]); unsigned int count = atoi(argv[3]); for( unsigned int i=0; i < count; ++i ) { std::cout << "alloc mem " << memsize << "Mbyte" << std::endl; std::vector array( memsize * 1024 * 1024 ); sleep( stoptime ); std::cout << "free mem" << std::endl; array.resize(0); sleep( stoptime ); } return 0; }
[root@localhost ~]# g++ -o memaloc memaloc.cpp
コメント
コメントを投稿