鲲鹏社区首页
中文
注册
Workload trace采集工具使用方法分享

Workload trace采集工具使用方法分享

安装部署

发表于 2025/06/05

0

xtrace-qemu是鲲鹏workload团队基于Qemu开源软件开发的指令流、数据流采集工具,由于Qemu是一个仿真器,因此我们可以将业务按照基线配置部署在Qemu虚拟机中。xtrace-qemu利用了Qemu的tcg翻译机制,在翻译期添加指令流和寄存器数据记录的逻辑,因此,原业务在虚拟机中压测执行时即可同步采集指令流、数据流信息。

工具获取请联系SA,以静态编译二进制文件提供,无需进行本地部署

内核镜像

qemu的本质是一个虚拟机,需要通过镜像来进行创建,切片交付常用的是arm架构的OpenEuler镜像,可以通过官方网站获取

$ wget https://repo.openeuler.org/openEuler-20.03-LTS-SP1/virtual_machine_img/aarch64/openEuler-20.03-LTS-SP1.aarch64.qcow2.xz
$ xz -d openEuler-20.03-LTS-SP1-aarch64.qcow2.xz

启动qemu的通用命令

$ qemu-system-aarch64 -m 16384 -cpu max,sve=on,sve512=on,sme=on,sme512=on -M virt -bios edk2-aarch64-code.fd -hda openEuler-20.03-LTS-SP1.aarch64.qcow2 -nographic -net nic,model=virtio -net user,hostfwd=tcp::2205-:22 -smp 4

命令中设置了网络端口为2205,用来通过scp进行文件传输

重要通用参数含义:

        -m: 设置虚拟机的内存大小,默认单位MB

        -cpu:指定cpu类型和特性,sve、sme等表示是否启用armv9的向量扩展、安全内存扩展特性
        -hda:指定虚拟机使用的镜像文件
        通过端口映射启动时,使用 -net nic,model=virtio -net user,hostfwd=tcp::2205-:22  (tcp::2205-:22中,2205指主机本地端口号,22指虚拟机映射端口号)
        通过虚拟网卡启动时,使用 -net nic,model=virtio,macaddr=52:54:00:AA:31:65 -net tap,ifname=tap7,script=no,downscript=no (macaddr可随意指定,不要和其他虚拟机重复,-net tap表示使用虚拟网卡,需要搭网桥)
        通过设备直通启动时,使用-device vfio-pci,host=7d:00.2,multifunction=on (host中填入的是设备号)
        -smp:指定虚拟机使用的核数,虚拟机中的核是通过线程模拟,不代表对应物理机的核

重要新特性参数含义:

       -xtrace-mt:标识访存指令是否携带时间戳,开启访存指令加解锁机制

       -xtrace-core:启用核指令流采集

       -xtrace-slowdown:设置虚拟机采集时放慢倍数,例-xtrace-slowdown 8000000,用于降低时钟中断触发频率,降低上下文被动切换频率

关闭qemu

ctrl+A  然后按x

文件传输

通过scp的方式进行传输,例如在qemu中获取服务器中文件

$ scp your_user_name@server_ip:/path/to/file .

从服务器向qemu中传输文件,如果使用了端口启动,需要通过-P指定端口

$ scp -P 2205 sth root@server_ip:/path/to/file

插桩采集简单案例

xtrace-qemu中添加了对特殊汇编指令的识别,我们用汇编指令中的hint 9来开启采集,用hint 11结束采集

对于一个简单的C语言程序:

#include <stdio.h>

int main()
{
    for (int i = 0; i < 100; i++) {
        //do something
    }
    return 0;
}

如果我们想采集第20次循环和第80次循环之间的内容,可以按照如下方法:

#include <stdio.h>

int main()
{
    for (int i = 0; i < 100; i++) {
        if (i == 20) {
            __asm__ volatile("hint 9");
        }
        //do something
        if (i == 79) {
           __asm__ volatile("hint 11");
        }
    }
    return 0;
}

插桩结束后编译程序为二进制可执行文件,拷贝到xtrace-qemu启动的虚拟机中,执行,即可得到trace文件

本页内容