55410


dstatコマンドのusedとfreeコマンドのmemのusedに差異が見られます。（約5GB）

双方のコマンドで見るメモリの使用率になぜかのような違いが現れるのでしょうか。

OSはredhat7.3です。  
dstatのバージョンは現在確認できる状態ではなく不明です。  
情報が少なく申し訳ありませんがよろしくお願いいたします。


CC BY-SA 4.0
2019-05-30T12:58:15.520
55374
2019-10-09T02:18:40.380
34533
question
linux
dstatとfreeコマンドで見えるメモリの使用率の差異について


理由は、「計算式が異なるため」という事になります。

こちらの環境は以下の通りです。

[code]

    $ lsb_release -d
    Description:    Ubuntu 19.04
    $ uname -srm
    Linux 5.0.0-15-generic x86_64
    $ free --version
    free from procps-ng 3.3.15
    $ dstat --version
    Dstat 0.7.3
    
[/code]

**free**

[procps/proc/sysinfo.c:meminfo() function](https://gitlab.com/procps-
ng/procps/blob/master/proc/sysinfo.c#L789)

/proc/meminfo から読み込んだ値から used memory を算出しています(dstat も同様)。

[code]

    kb_main_cached = kb_page_cache + kb_slab_reclaimable;
    mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
    
[/code]

kb_* 変数に対応する /proc/meminfo のフィールドは以下です。

[code]

    kb_page_cache: Cached
    kb_slab_reclaimable: SReclaimable
    kb_main_total: MemTotal
    kb_main_free: MemFree
    kb_main_buffers: Buffers
    
[/code]

したがって、

[code]

    mem_used = MemTotal - MemFree - (Cached + SReclaimable) - Buffers
    
[/code]

となります。

**dstat**

[dstat_mem.extract()
method](https://github.com/dagwieers/dstat/blob/master/dstat#L1308)

[code]

    self.val['MemUsed'] = adv_val['MemTotal'] - self.val['MemFree'] - self.val['Buffers'] - self.val['Cached'] - adv_val['SReclaimable'] + adv_val['Shmem']
    
[/code]

dstat では、

[code]

    mem_used = MemTotal - MemFree  - Buffers - Cached - SReclaimable + Shmem
    
[/code]

となります。

結果として、Shmem(shared memory) の分だけ違いが出ることになります。

[code]

    $ free -m
                  total        used        free      shared  buff/cache   available
    Mem:          11829        2022        1384         114        8423        9731
    Swap:          2047          24        2023
    
    $ dstat --mem-adv
    -------------advanced-memory-usage-------------
    total  used  free  buff  cach dirty shmem  recl
    11.6G 2136M 1384M  494M 7406M    0   114M  523M
    
    ## 2136 - 114 = 2022 MB
    
[/code]


CC BY-SA 4.0
2019-05-31T13:02:30.320
55410
2019-05-31T13:02:30.320
55374
answer


Oracle等がある場合、shmemは結構使います(SGAとして)。tmpfsとしてみれば確かにキャッシュとなりますが、  
インスタンスがいる限り常に使用されている領域と考えれば、dtstatの方が実体を表していると思えますが、如何でしょうか？


CC BY-SA 4.0
2019-10-09T02:18:40.380
59586
2019-10-09T02:18:40.380
36132
55374
answer