freeのshared
freeとかしてみるとsharedが0になっている。
$ free total used free shared buffers cached Mem: 3884436 3371444 512992 0 3492 1434784 -/+ buffers/cache: 1933168 1951268 Swap: 5000188 0 5000188
free(1)を見ても"The shared memory column should be ignored; it is obsolete."と書いてあるし、0固定なんでしょう。でも、なんで0なんでしょう。
freeはprocpsというパッケージのコマンドで proc/sysinfo.cの部分が値を取得するコードになっている。これは /proc/meminfo から情報を読んでいる。 sharedに対応する部分は "MemShared" というところだったのだけれど、これはすでに削除されている。
- procps http://gitorious.org/procps/procps
- MemSharedが削除されたpatch LKML: Marc-Christian Petersen: [PATCH 2.4.21-pre4|BK] remove /proc/meminfo:MemShared
これよりも前のカーネルでも長い間 "MemShared"は表示されていても、0に固定されていた。
なぜかというと、sharedを計算するのはコストが高いから、だそーだ。
linux-2.3.12以前だとこんな感じでsharedramを計算している。
void si_meminfo(struct sysinfo *val) { int i; i = max_mapnr; val->totalram = 0; val->sharedram = 0; val->freeram = nr_free_pages << PAGE_SHIFT; val->bufferram = atomic_read(&buffermem); while (i-- > 0) { if (PageReserved(mem_map+i)) continue; val->totalram++; if (!page_count(mem_map+i)) continue; val->sharedram += page_count(mem_map+i) - 1; } val->totalram <<= PAGE_SHIFT; val->sharedram <<= PAGE_SHIFT; return; }
ようするに、全てのメモリをいちいちなめてsharedを計算している これがlinux-2.3.13だと
void si_meminfo(struct sysinfo *val) { val->totalram = totalram; val->sharedram = 0; val->freeram = nr_free_pages << PAGE_SHIFT; val->bufferram = atomic_read(&buffermem); return; }
このように0固定されている。
3GBのメモリつんでたら、971109回ループがまわることになるし、より大きなシステムだともっと大変なことになってしまうだろう。
ちなみに、当時 これ聞かれまくったのかFAQにものってる http://www.tux.org/lkml/#s14-3