这个采样方式是一个区域内选一个页面,称为样本页

首先是都得在root用户或者sudo下运行,否则会有难以下手的bug。damo start –help之类的方式可以获得所提供命令的介绍。

画图相关命令需要安装gnuplot命令如sudo apt install gnuplot-x11

用于记录访问监控结果并可视化这些结果

record

sudo damo record $(pidof pr)
得到damon.data文件,包括不同时间不同区域的访问频率。会统计访问事件和工作负载大小的情况。会在工作负载停止时自动停止。但是需要额外的代码去可视化。

但是还是太粗粒度了 😕 通过 damo record --help可以获得更多的选项设置,nice

damo record --help

positional arguments:
  <command, pid, special keywords, or kdamonds json spec>
                        the implicit monitoring requests

optional arguments:
  -h, --help            show this help message and exit
  -s <microseconds>, --sample <microseconds>
                        sampling interval (us 1,000,000)
                        采样间隔是有用且需要的。只会检查这个区域的一个样本页面。
  -a <microseconds>, --aggr <microseconds>
                        aggregate interval (us)这个是采样之后聚合用,多次采样间隔的值放在一个时间段去聚合显示,这样配合采样间隔使用图片就不会那么黑了。
  -u <microseconds>, --updr <microseconds>
                        regions update interval (us)采样时将监控目标区域划分为多个子区域,子区域由访问频率相似的相邻页面组成。每个子区域大小是不一样的,但是程序运行中,原先满足条件的子区域可能变了,此时需要更新子区域。
  -n <# regions>, --minr <# regions>
                        minimal number of regions
  -m <# regions>, --maxr <# regions>
                        maximum number of regions
  --monitoring_nr_regions_range <min> <max>
                        min/max number of monitoring regions
                        这个指每次采样会有多少个监控区域,增多监控区域,每个区域的大小自然就小了。而且这个工具如果你一个地方访问频率相似,就会把采样粒度扩大的。区域多当然开销就多。
  --damos_sz_region <min> <max>
                        min/max size of damos target regions (bytes)
                        指定采样区域的大小粒度,哇塞,4096就是4KB,8129就是两个页面和起来监控。
  -o <file path>, --out <file path>
                        output file path

   目前没啥用的功能,但是保留在这几介绍 
  --ops {vaddr,paddr,fvaddr}
                        monitoring operations set
  --target_pid <pid>    pid of monitoring target process
  -r "<start>-<end> ...", --regions "<start>-<end> ..."
                        monitoring target address regions
                        这是指地址区域,一般也不知道这个进程在哪个地址啊?
  --numa_node <node id>
                        if target is 'paddr', limit it to the numa node
  --damos_action <action>
                        damos action to apply to the target regions
  --monitoring_intervals <sample> <aggr> <update>
                        monitoring intervals (us)
                        组合的采样间隔用不到这么复杂的                    
  --damos_access_rate <min> <max>
                        min/max access rate of damos target regions (percent)
  --damos_age <min> <max>
                        min/max age of damos target regions (microseconds)
  --damos_apply_interval <microseconds>
                        the apply interval for the scheme应用隔离???
  --damos_quotas <time (ms)> <size (bytes)> <reset interval (ms)> <size priority weight (permil)> <access rate priority weight> (permil) <age priority weight> (permil)
                        damos quotas给damo的资源使用配额?
  --damos_wmarks <metric (none|free_mem_rate)> <interval (us)> <high mark (permil)> <mid mark (permil)> <low mark (permil)>
                        damos watermarks
  --damos_filter <filter argument> [<filter argument> ...]
                        damos filter (type, matching, and optional arguments
                        看来就是过滤某些地址咯,可以设置多个过滤器
  --kdamonds <json string or file>
                        json format kdamonds specification to run DAMON for
  --damon_interface {sysfs,debugfs,auto}
                        underlying DAMON interface to use (!! DEPRECATED)
                        !!!思考报错的原因,有点意思
  --debug_damon         Print debugging log
  --output_type {json_compressed,json,perf_script,perf_data}
                        output file's type
  --output_permission OUTPUT_PERMISSION
                        permission of the output file
  --perf_path PERF_PATH
                        path of perf tool
  --include_child_tasks
                        record accesses of child processes
                        将子进程也一起监控

执行指定的监控程序有3种方式,首先在命令后面使用command 比如”sleep 5”; 第二种方式获取pid(比较好奇MPI程序那么多进程会怎样); 第三种方式指定的物理地址(监视目标区域默认为 /proc/iomem 文件中指定的最大“System RAM”区域。)。

report

heats

sudo damo report heats --heatmap 图片名
好的这个直接将可视化的都展示了,完全OK了,It supports pdf, png, jpeg, and svg.如果需要指定区域,那么可以使用–resol组合来做。--time_range <time> <time>--address_range <address> <address>都可以指定更细节的范围。如果想要显示绝对地址和时间作为横纵坐标,那么可以使用--abs_time--abs_addr.设置图片主题颜色有3种可选gray、flame、emotion--stdout_heatmap_color. -i 选择指定文件名。

sudo damo report heats --resol 2 4
–resol是指分辨率,具体来说后面根的两个参数表示输出时间段只有2段,输出地址范围有4个,会按照总的时间和地址范围大概平均分的亚子。
输出依次表示以纳秒为单位的时间、以字节为单位的地址、观察到的访问频率
这个命令输出的数据可以支持画热图

sudo damo report heats --heatmap stdout
需要和damon.data在一个文件夹下就能直接运行(x-axis) what memory region (y-axis) is how frequently accessed (color)

wss(working set size)

sudo damo report wss --range 0 101 1
the distribution of the working set size.这个是终端打印出来的图像,不太行。而且这个统计图横纵坐标也不太清楚。

sudo damo report wss --range 0 101 1 --sortby time --plot 图片名
how the working set size has changed by time.这个是曲线图,统计的信息和样式上没我自己做的好,可能这个开销小一些。

raw

sudo damo report raw >> pr.txt
可以将。data这个二进制文件的内容读出来,空白行隔开每一次的采样。每次采样的内容包括采样开始、结束、持续时间、此次监控区域的数量、每个监控区域的起始地址、地址长度、访问频率、age.

用于快照和可视化 DAMON 的监控结果和运行状态

show

# damo start 我的workload
# damo show
0   addr [4.000 GiB   , 16.245 GiB ) (12.245 GiB ) access 0 %   age 7 m 32.100 s
1   addr [16.245 GiB  , 28.529 GiB ) (12.284 GiB ) access 0 %   age 12 m 40.500 s
2   addr [28.529 GiB  , 40.800 GiB ) (12.271 GiB ) access 0 %   age 15 m 10.100 s
3   addr [40.800 GiB  , 52.866 GiB ) (12.066 GiB ) access 0 %   age 15 m 58.600 s
4   addr [52.866 GiB  , 65.121 GiB ) (12.255 GiB ) access 0 %   age 16 m 15.900 s
5   addr [65.121 GiB  , 77.312 GiB ) (12.191 GiB ) access 0 %   age 16 m 22.400 s
6   addr [77.312 GiB  , 89.537 GiB ) (12.225 GiB ) access 0 %   age 16 m 24.200 s
7   addr [89.537 GiB  , 101.824 GiB) (12.287 GiB ) access 0 %   age 16 m 25 s
8   addr [101.824 GiB , 126.938 GiB) (25.114 GiB ) access 0 %   age 16 m 25.300 s
total size: 122.938 GiB

每个Region信息包含该Region的监控结果,包括内存Region的起始地址、结束地址、nr_accesses、age等,每个快照的Region数量取决于DAMON参数min_nr_regions和max_nr_regions,实际情况监控目标地址空间的数据访问模式。

status

运行控制指令

start

这就是怎么跑都会被报错的!!!

#比如这里希望隔5s就有快照
sudo damo start --target_pid $(pidof masim)
while :; do sudo damo show; sleep 5; done

相关报错但不限于:

could not turn DAMON on (cannot apply kdmonds from args (DAMON debugfs doesn't support online staging))

vaddr region install failed (staging updates failed (DAMON debugfs doesn't support online staging))

试了试sudo mount -t debugfs none /sys/kernel/debug也没用

物理地址和虚拟地址的查询

damo使用的是将16进制地址变成10进制后的地址,无论是作图还是输入地址范围。

sudo cat /proc/iomem可以得到物理地址的范围,对于物理采样damo只接受整个System RAM区域的地址,就是说你不能把一个System RAM的地址拆开给他。这个地址的DRAM一般出现在比较靠后的位置,可以根据free -h或者numactl -H算一算大小对不对。

00000000-00000fff : Reserved
00001000-0008efff : System RAM
0008f000-0008ffff : Reserved
00090000-0009ffff : System RAM
000a0000-000fffff : Reserved
  000a0000-000bffff : PCI Bus 0000:00
  000c8000-000cffff : PCI Bus 0000:00
  000f0000-000fffff : System ROM
00100000-46cc501f : System RAM
46cc5020-46cf6a5f : System RAM
46cf6a60-46cf701f : System RAM
46cf7020-46d29c5f : System RAM
46d29c60-46d2a01f : System RAM
46d2a020-46d5cc5f : System RAM
46d5cc60-46d5d01f : System RAM
46d5d020-46d6505f : System RAM
46d65060-49e76fff : System RAM
49e77000-4ae76fff : ACPI Non-volatile Storage
4ae77000-4b2cefff : System RAM
4b2cf000-4b54dfff : ACPI Tables
4b54e000-4bd93fff : System RAM
4bd94000-4be99fff : Reserved
4be9a000-4cdfffff : System RAM
4ce00000-4cffffff : Reserved
4d000000-5eefdfff : System RAM
5eefe000-6e3fefff : Reserved
  69569020-6956906f : APEI ERST
  69569078-6956907f : APEI ERST
  69569080-6956b01f : APEI ERST
6e3ff000-6f3fefff : ACPI Non-volatile Storage
6f3ff000-6f7fefff : ACPI Tables
6f7ff000-6f7fffff : System RAM
6f800000-8fffffff : Reserved
  80000000-8fffffff : PCI MMCONFIG 0000 [bus 00-ff]
90000000-9b7fffff : PCI Bus 0000:00
  90000000-900fffff : PCI Bus 0000:04
    90000000-9003ffff : 0000:04:00.0
    90040000-9007ffff : 0000:04:00.1
  91000000-91ffffff : PCI Bus 0000:02
    91000000-91ffffff : PCI Bus 0000:03
      91000000-91ffffff : 0000:03:00.0
        91000000-912fffff : efifb
  92000000-928fffff : PCI Bus 0000:02
    92000000-928fffff : PCI Bus 0000:03
      92000000-927fffff : 0000:03:00.0
      92808000-9280bfff : 0000:03:00.0
  92900000-929fffff : PCI Bus 0000:04
    92900000-9290ffff : 0000:04:00.1
      92900000-9290ffff : tg3
    92910000-9291ffff : 0000:04:00.1
      92910000-9291ffff : tg3
    92920000-9292ffff : 0000:04:00.1
      92920000-9292ffff : tg3
    92930000-9293ffff : 0000:04:00.0
      92930000-9293ffff : tg3
    92940000-9294ffff : 0000:04:00.0
      92940000-9294ffff : tg3
    92950000-9295ffff : 0000:04:00.0
      92950000-9295ffff : tg3
  92a00000-92afffff : 0000:00:02.4
  92b00000-92b7ffff : 0000:00:17.0
    92b00000-92b7ffff : ahci
  92b80000-92bfffff : 0000:00:11.5
    92b80000-92bfffff : ahci
  92c80000-92cfffff : 0000:00:02.1
  92d00000-92d7ffff : 0000:00:02.1
  92dc0000-92ddffff : 0000:00:02.4
  92de0000-92deffff : 0000:00:14.0
    92de0000-92deffff : xhci-hcd
  92df0000-92df3fff : 0000:00:02.4
  92df4000-92df7fff : 0000:00:1f.2
  92df8000-92df9fff : 0000:00:17.0
    92df8000-92df9fff : ahci
  92dfa000-92dfbfff : 0000:00:11.5
    92dfa000-92dfbfff : ahci
  92dfc000-92dfdfff : 0000:00:02.0
  92dfe000-92dfe0ff : 0000:00:1f.4
  92dff000-92dfffff : 0000:00:16.4
  92e00000-92e00fff : 0000:00:16.1
  92e01000-92e01fff : 0000:00:16.0
  92e02000-92e02fff : 0000:00:14.2
    92e02000-92e02fff : Intel PCH thermal driver
  92e04000-92e040ff : 0000:00:17.0
    92e04000-92e040ff : ahci
  92e05000-92e050ff : 0000:00:11.5
    92e05000-92e050ff : ahci
  9b7fc000-9b7fcfff : dmar9
9b800000-a63fffff : PCI Bus 0000:16
  9b800000-9b9fffff : PCI Bus 0000:17
    9b800000-9b8fffff : 0000:17:00.0
      9b800000-9b8fffff : megasas: LSI
    9b900000-9b9fffff : 0000:17:00.0
  9ba00000-9bafffff : PCI Bus 0000:17
    9ba00000-9bafffff : 0000:17:00.0
  a63fc000-a63fcfff : dmar5
a6400000-b0ffffff : PCI Bus 0000:30
  b0ffc000-b0ffcfff : dmar6
b1000000-bbbfffff : PCI Bus 0000:4a
  bbbfc000-bbbfcfff : dmar7
bbc00000-c5ffffff : PCI Bus 0000:64
  c5ffc000-c5ffcfff : dmar8
c6800000-d0ffffff : PCI Bus 0000:80
  c6800000-c68fffff : 0000:80:02.4
  c6980000-c69fffff : 0000:80:02.1
  c6a00000-c6a7ffff : 0000:80:02.1
  c6a80000-c6a9ffff : 0000:80:02.4
  c6aa0000-c6aa3fff : 0000:80:02.4
  c6aa4000-c6aa5fff : 0000:80:02.0
  d0ffc000-d0ffcfff : dmar0
d1000000-dbbfffff : PCI Bus 0000:97
  dbbfc000-dbbfcfff : dmar1
dbc00000-e67fffff : PCI Bus 0000:b0
  e67fc000-e67fcfff : dmar2
e6800000-f13fffff : PCI Bus 0000:c9
  f13fc000-f13fcfff : dmar3
f1400000-fb7fffff : PCI Bus 0000:e2
  fb7fc000-fb7fcfff : dmar4
fd000000-fdabffff : pnp 00:04
fdad0000-fdadffff : pnp 00:04
fdb00000-fdffffff : pnp 00:04
fe000000-fe010fff : Reserved
  fe000000-fe00ffff : pnp 00:04
  fe010000-fe010fff : PCI Bus 0000:00
    fe010000-fe010fff : 0000:00:1f.5
fe011000-fe01ffff : pnp 00:04
fe036000-fe03bfff : pnp 00:04
fe03d000-fe3fffff : pnp 00:04
fe410000-fe7fffff : pnp 00:04
fec00000-fecfffff : PNP0003:00
  fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
  fed00000-fed003ff : PNP0103:00
ff000000-ffffffff : pnp 00:01
100,000,000-207fffffff : System RAM-------------------------------------------
  b6be00000-b6cc025c6 : Kernel code
  b6ce00000-b6d321fff : Kernel rodata
  b6d400000-b6d761d3f : Kernel data
  b6da4e000-b6dffffff : Kernel bss
2080000000-11c7fffffff : Persistent Memory
  2080000000-22781fffff : namespace0.0
  2280000000-9e7fffffff : dax0.0
    2,280,000,000-9,e7f,fff,fff : System RAM (kmem) -------------------------------
  9e80000000-9e801fffff : namespace1.0
  9e80200000-11c7fffffff : dax1.0
1ffc00000000-1fffffffffff : Reserved
  1ffffff84000-1ffffff84fff : ndbus0
  1ffffff85000-1ffffff85fff : ndbus0
  1ffffff86000-1ffffff86fff : ndbus0
  1ffffff87000-1ffffff87fff : ndbus0
  1ffffff94000-1ffffff94fff : ndbus0
  1ffffff95000-1ffffff95fff : ndbus0
  1ffffff96000-1ffffff96fff : ndbus0
  1ffffff97000-1ffffff97fff : ndbus0
200000000000-20ffffffffff : PCI Bus 0000:00
210000000000-21ffffffffff : PCI Bus 0000:16
  21fffff00000-21fffff1ffff : 0000:16:02.0
220000000000-22ffffffffff : PCI Bus 0000:30
230000000000-23ffffffffff : PCI Bus 0000:4a
240000000000-24ffffffffff : PCI Bus 0000:64
250000000000-25ffffffffff : PCI Bus 0000:80
260000000000-26ffffffffff : PCI Bus 0000:97
270000000000-27ffffffffff : PCI Bus 0000:b0
280000000000-28ffffffffff : PCI Bus 0000:c9
290000000000-29ffffffffff : PCI Bus 0000:e2

另外有时也会用到虚拟地址,通过查找文件Documentation/x86/x86_64/mm.rst


文章作者: 易百分
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 易百分 !
  目录