Linux vmstat

LPIC Level 3coreをとってみようと思う。
そこでキャパシティプランニングに出る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 
#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;
}
コンパイル方法は、ソースファイルが「memaloc.cpp」として、
[root@localhost ~]# g++ -o memaloc memaloc.cpp

コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

slackでgeneralの投稿を全削除する

Google location history(JSON形式)をCSVファイルにする