ページ更新: 2009-05-19 (火) (2835日前)

(2003-12-14 新規作成)

Linuxでメモリ確保したときのVSZ,RSSとfreeの値の変化。

RedHat 7.2 (kernel 2.4.7-10) + apt(freshmeat.net)使用。

目次

[編集]

課題 #

VSZとRSSの合計を表示すると、

$ ps -eo vsz,rss | awk '{v+=$1;r+=$2}END{print v,r}'
53212 25264

freeより少ないのだが、なにがメモリ(50MB以上)を使っているのか?

プロセスがスワップされるとps uxのSTAT欄がSWになるはず。 このとき、VSZ,RSSの値は0になった‥‥と思うが、本当にそうか? (Linux-users-MLで話題になったと思う)

LibraryとSystemCallの確認 (timestampつき)

$ ltrace -r -o ltrace.log ./vsz
$ ltrace -S -r -o ltrace.log ./vsz
$ strace -r -o strace.log ./vsz
  • ltrace : Library call tracer
    • -r : relative timestamp
    • -S : with System call
    • -o : output file
  • strace : system call and signal tracer
    • -r : relative timestamp
    • -o : output file
[編集]

テストプログラム #

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

/* (1) */
int
main(int argc, char *argv[]) {

  const int size = 10*1024*1024;
  void *a;

  /* (2) */
  puts("pause ... (next .. malloc)");
  getchar();
 
  a = (void*)malloc(size);      /* ここでVSZが増加するはず */
  if (!a) {
    puts("can't alloc");
    return 1;
  }
  
  /* (3) */
  puts("pause ... (next .. memset)");
  getchar();

  memset(a, 1, size);           /* ここでRSSとusedが増加するはず */

  /* (4) */
  puts("pause ... (next .. free)");
  getchar();

  free(a);

  return 0;
}
/* (5) */
[編集]

テスト #

[編集]

1. プロセス起動前 #

$ free
             total       used       free     shared    buffers     cached
Mem:        191084     174552      16532          0      60416      31948
-/+ buffers/cache:      82188     108896
Swap:       192772          0     192772
[編集]

2. プロセス起動 #

  • VSZ、RSZとも1MB未満。
  • used = 82,172K
$ ps ux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
admin    10532  0.0  0.1  1384  308 pts/0    S    07:58   0:00 ./vsz

$ free
             total       used       free     shared    buffers     cached
Mem:        191084     174560      16524          0      60440      31948
-/+ buffers/cache:      82172     108912
Swap:       192772          0     192772
[編集]

3. プロセス起動、メモリ確保(10MB) #

  • メモリ確保は VSZ (仮想メモリサイズ)に反映される。
  • 確保した領域にアクセスしていないので、RSSは増加しない。
  • used = 82,168K (なぜかちょっと減ってる)
$ ps ux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
admin    10532  0.0  0.1 11628  340 pts/0    S    07:58   0:00 ./vsz

$ free
             total       used       free     shared    buffers     cached
Mem:        191084     174560      16524          0      60444      31948
-/+ buffers/cache:      82168     108916
Swap:       192772          0     192772
[編集]

4. memset(確保したメモリに1を書き込む) #

  • メモリが割り振られるので、RSS が増加する。
  • freeのused(buffers/cache)も増加する。
  • used = 92,268K。 10,100K増加
$ ps ux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
admin    10532  0.5  5.5 11628 10580 pts/0   S    07:58   0:00 ./vsz

$ free
             total       used       free     shared    buffers     cached
Mem:        191084     184668       6416          0      60452      31948
-/+ buffers/cache:      92268      98816
Swap:       192772          0     192772
[編集]

5. free, プロセス終了 #

  • freeのused(buffers/cache)にも反映される。(減少する)
  • used = 83,036K。9,232K減少
$ free
             total       used       free     shared    buffers     cached
Mem:        191084     175448      15636          0      60460      31952
-/+ buffers/cache:      83036     108048
Swap:       192772          0     192772
[編集]

補足: 参考文献 #

注意: 後から書き足したものなので、本文には反映していない。

  • 2008-02-29 malloc(3)のメモリ管理構造 VA Linux Systems Japan
    • mallocライブラリの動きの概要 / メモリ管理部の構造 / mallocライブラリで扱うメモリ単位 / mallocライブラリのメモリ確保の流れ / freeライブラリのメモリ解放の流れ / mmapped chunkの確保、解放 / main_arena以外のarenaのメモリ確保、解放の流れ / mallocライブラリとデバッグ
  • 2004-11-16 メモリー管理の内側
    • mallocの仕組みと実装, 参照カウント、メモリープール (GNU libc-obstracks)、ガーベッジコレクション、参考文献
  • Donald Knuth, The Art of Computer Programming Volume 1: Fundamental Algorithms, section 2.5, Dynamic Storage Allocation