sar の pgpgout/s と pswpout/s の関係

  1. スワップ・アウトはページ・アウトのサブクラスである。
  2. ページ・アウトはディスクにページを書き出すことすべてを指している。
  3. スワップ・アウトはページを書き出す行為がスワップのために行われる、つまり書き出し先のディスクがスワップ領域である場合のページ・アウトである。
  4. ページ・アウトはスワップ・アウトを含むため、すべての瞬間でページ・アウト回数>=スワップ・アウト回数である。
  5. pswpout/sは『スワップ・アウトした"ページ数"』を表し、pgpgout/sは『ページ・アウトした"キロバイト数"』を表す。そのため、1秒間に100ページをスワップ・アウトした場合、pswpout/sは100となり、pgpgout/sは400となる。これは1ページが通常4KBであるため。
  6. スワップが多発しているかどうかを判断する指標はpswpout/s(およびpswpin/s)であり、pgpgout/s(およびpgpgin/s)ではない。

概念図


スワップ動作確認用コード(C++)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<time.h>

#define MALLOC_UNIT_MB 100
#define MALLOC_UNIT (MALLOC_UNIT_MB*1024*1024)

int memGet = 0;
int memSet = 0;
unsigned char* segments[1024];


void getVirtualMemory() {
    unsigned char* ptr = NULL;

    printf("  malloc...\n");
    ptr = (unsigned char*)malloc(MALLOC_UNIT);
    if ( ptr == NULL )
        printf("  malloc failed (%s)\n", strerror(errno));
    else
        segments[memGet++] = ptr;
}

void setPhysicalMemory() {
    time_t pre, post;

    for ( ; memSet < memGet; memSet++ ) {
        printf("  memset %dth segment... ", memSet); fflush(stdout);
        pre = time(NULL);
        memset(segments[memSet], 'A', MALLOC_UNIT);
        post = time(NULL);
        printf("(%0.0f sec)\n", difftime(post, pre));
    }
}

int main( int argc, char* argv[] ) {
    char ch;

    while ( true ) {
        printf("type g to malloc, s to memset, r to re-memset(%d get, %d set): ", memGet, memSet);
        scanf("%1s", &ch);
        switch ( ch ) {
            case 's': setPhysicalMemory(); break;
            case 'g': getVirtualMemory();  break;
            case 'r': memSet = 0; setPhysicalMemory(); break; // re-memset
        }
    }

    return 0;
}