118 瀏覽數

LMbench – lat_pagefault & lat_mem_rd & lat_mmap

LMbench 是用來測試系統效能的工具.關於安裝與測試種類請參考 http://benjr.tw/98076

測試環境為 Ubuntu 16.04 x86_64 (VMware 虛擬機) .

安裝完成的 LMbench 程式目錄位於 /usr/lib/lmbench/bin/x86_64-linux-gnu/

root@ubuntu:~# cd /usr/lib/lmbench/bin/x86_64-linux-gnu/

lat_pagefault

主要在測試 檔案 與 memory 之間的分頁錯誤 (page fault).

Usage: ./lat_pagefault file [ file.... ] 

參數使用:

  • file : 指定待測文件(自訂任意文件).
    Linux 作業系統透過分頁表來管理記憶體,透過虛擬記憶體(Virtual Memory)對應的方式,將記憶體分割成大小固定的頁框(Frame),這些頁框(Frame)會對應到分頁(Page),但分頁表的總量通常會大於實際記憶體的大小,沒對應到的就會暫存於輔助記憶體,如硬碟(Linux 下的 swap 磁區).

    這樣的好處是載入文件時不需要連續的記憶體區塊,系統也可以載入比記憶體還要多的資料.

    那所謂的分頁錯誤(Page fault),就是當作業系統要存取某個分頁時,他並不實際儲存在記憶體中,需要去輔助記憶體 Linux 下的 swap 磁區做置換(載入到記憶體)的動作,這樣就是分頁錯誤(Page fault).

root@ubuntu:/usr/lib/lmbench/bin/x86_64-linux-gnu# ./lat_pagefault /root/10M
Pagefaults on /root/10M: 0.2171 microseconds

測試輸出為:平均發生一次 page fault 的時間,單位為 micro seconds (10負6次).

lat_mem_rd

主要在測試 CPU 與 memory 之間的讀取延遲 (latency).

Usage: ./at_mem_rd  [ -P <parallelism> ] [ -W <warmups> ] [ -N <repetitions> ] size_in_megabytes stride [ stride stride...  ]

參數使用:

  • -P : # (0~#) #+1個 lat_mem_rd 同時跑,可以透過 # ps -aux | grep -i lat_mem_rd 來觀察.
  • -W : 等待時間,單位??
  • -N : 測試重覆 8 次.
  • stride : 預設值為 64 ,改變記憶體大小和 stride (不懂) 來進行 memory 讀取延遲測試.
    The benchmark runs as two nested loops. The outer loop is the stride size. The inner loop is the array size.

    p = (char **)*p;
    

    在測試前先透過 #lscpu 看一下 CPU 的 Cache 大小.

    root@ubuntu:~# lscpu |grep -i cache
    L1d cache:             32K
    L1i cache:             32K
    L2 cache:              256K
    L3 cache:              3072K
    
    root@ubuntu:/usr/lib/lmbench/bin/x86_64-linux-gnu# ./lat_mem_rd 8 64
    "stride=64
    0.00049 1.201
    0.00098 1.201
    0.00195 1.201
    0.00293 1.201
    0.00391 1.201
    0.00586 1.201
    0.00781 1.201
    0.01172 1.201
    0.01562 1.201
    0.02344 1.201
    0.03125 1.201
    0.04688 3.609
    0.06250 3.609
    0.09375 3.616
    0.12500 3.616
    0.18750 3.616
    0.25000 3.616
    0.37500 3.616
    0.50000 3.616
    0.75000 3.616
    1.00000 3.615
    1.50000 3.613
    2.00000 3.617
    3.00000 5.059
    4.00000 7.533
    6.00000 7.801
    8.00000 7.843
    

    測試輸出格式為: array size (M) & latency (nanoseconds)

    L1 cache 32k 瓶頸一:
    可以看到 0.03125M (31.25K) 之後的 延遲 (latency) 突然升高到 1.201 -> 3.609 ,因為到達我系統的 L1 cache 32k 大小上限了.
    L2 cache 3M 瓶頸二:
    接下來的另一個瓶頸是 2M 的 3.617 到了 3M 時延遲突然變大成為 5.059,因為到達我系統的 L2 cache 3M 大小上限了.

    lat_mmap

    這邊主要在測試 memory 到 檔案 (硬碟) 之間的延遲 (latency)..

    Usage: ./lat_mmap [-r] [-C] [-P <parallelism>] [-W <warmup>] [-N <repetitions>] size file
    
    • -P : # (0~#) #+1個 lat_mmap 同時跑,可以透過 # ps -aux | grep -i lat_mmap 來觀察.
    • -W : 等待時間,單位??
    • -N : 測試重覆 8 次.

    在測試之前需要建立一個大小相等的檔案,可以透過 dd 來建立.

    root@ubuntu:/usr/lib/lmbench/bin/x86_64-linux-gnu# dd if=/dev/zero of=/root/1M bs=1M count=1
    
    root@ubuntu:/usr/lib/lmbench/bin/x86_64-linux-gnu# ./lat_mmap 1M /root/1M
    1.000000 11
    

    測試輸出格式為 “%0.2f %d\n”, megabytes, usecs.
    結果為 1.000000 megabytes, 延遲 (latency) 11 usecs (u : micro 10的-6次方 ).

    NUMA

    如果你的系統架構是 NUMA (Non-uniform memory access),還可以使用 #numacl 來限制要使用哪一顆處理器或是記憶體執行測試程式.關於 NUMA 請參考 http://benjr.tw/96788

    進行測試時,限制 MEM (–membind=0), CPU (–cpunodebind=0) ,我的系統是虛擬機,所以看不出差別.

    root@ubuntu:~# numactl --membind=0 --cpunodebind=0 ./lat_mem_rd 8 64
    "stride=64
    0.00049 1.201
    0.00098 1.201
    0.00195 1.201
    0.00293 1.201
    0.00391 1.201
    0.00586 1.201
    0.00781 1.201
    0.01172 1.201
    0.01562 1.201
    0.02344 1.201
    0.03125 1.201
    0.04688 3.609
    0.06250 3.609
    0.09375 3.616
    0.12500 3.616
    0.18750 3.616
    0.25000 3.616
    0.37500 3.616
    0.50000 3.616
    0.75000 3.616
    1.00000 3.615
    1.50000 3.613
    2.00000 3.617
    3.00000 5.059
    4.00000 7.533
    6.00000 7.801
    8.00000 7.843
    
    root@ubuntu:~# numactl --membind=0 --cpunodebind=0 ./lat_mmap 1M /root/1M
    1.000000 11
    

發表迴響