Workload trace格式介绍
发表于 2025/06/10
0
xtrace-format是Workload技术团队设计的数据记录格式,用于记录真实业务的执行效果。在trace采集工具中,工具链以xtrace-format格式收集业务的指令流与寄存器状态,并存储在trace文件中,然后在组装工具或其他的trace分析工具中,对trace进行解析,对得到的指令和数据进行进一步处理
文件命名
trace文件分为xinsndata指令流数据文件和xsnapshot寄存器快照文件,其通用文件命名如下:
xtrace.{timestamp}.{tid/cpuid}.hint{9/13}.xinsndata.bin
xtrace.{timestamp}.{tid/cpuid}.hint{9/13}.xsnapshot.bin
xtrace:trace固定前缀
timestamp:标识trace的采集开始时间
tid/cpuid:trace采集工具可以选择按业务指定线程采集,此时文件会附带采集线程在虚拟机中的tid;也可以按照虚拟机中的核进行采集,此时附带核id
hint{9/13}:trace采集工具使用hint指令来触发采集的开始与结束,通常线程指令流中固定使用hint9,在核指令流trace中,主核采用hint9,其他核采用hint13
xinsndata.bin/xsnapshot.bin:trace固定后缀,标识文件类型
xtrace-format数据结构介绍
寄存器快照文件
寄存器快照文件由一个Header结构体和N个如下的快照结构体组成,trace采集过程中,每执行100万用户态指令,会记录一次全量的寄存器状态信息(也称作快照),而每个快照点可以作为切片组装的起始点
每个寄存器快照由如下部分组成:
1. 8-byte文件编号
2. 8-byte文件内下标
3. 8-byte当前快照之前的用户态执行指令数
4. 8-byte当前快照之前的总执行指令数
5. 32 x 8-byte的通用寄存器X0 .. X31
6. 32 x 矢量寄存器Z0 .. Z31,按照16-byte对齐
7. 16 x 矢量标识位寄存器P0 .. P16,按照16-byte对齐
8. 首次故障寄存器FFR,按照16-byte对齐
9. (sve_len * sve_len)-byte矩阵寄存器Za,按照16-byte对齐
10. 系统控制寄存器:fpcr,fpsr,nzcv,tpidr_el0,tpidrro_el0,ttbr0_el1,elr_el1,spsr_el1,esr_el1,tpidr_el1,daif
11. 8-byte当前系统最大vector length,矢量长度,以bit为单位,SVE256会记录为256
每个寄存器快照文件的最开头为一个Header结构体数据,用于存储trace关键信息
每个Header由如下部分组成:
1. 4-byte标识位,用于区分trace结构类型(部分老trace不带有Header)
2. 4-byte全局快照点,用于多线程组装时起始点同步
3. 8-byte版本信息,用于提示当前trace格式的版本
4. 1-byte快照划分类型,用于区分快照点以100万用户态指令/总指令划分
5. 1-byte指令流类型,用于区分线程指令流/核指令流
6. 1-byte访存序时间戳信息,用于区分trace是否记录了访存序
指令流数据文件
指令流数据文件存储了业务在虚拟机内执行过程中真实的汇编指令信息,包括指令码、地址、操作数据、相关寄存器等,指令流数据文件的格式通常以无数个类型标志位(token)+数据的二元组构成,类型标志位定义如下:
如上所述,每个指令流数据项包含两个部分,第一个部分是1-byte 标志位(token),后面跟着token对应的数据。一个1-byte token包含8位,低三位表示token的大类,高五位表示token的小类与token的参数。目前设计有5大类TOKEN
1. INST类token,低3位为0x1
2. MEM类token,低3位为0x2
3. VAL类token,低3位为0x3
4. MISC类token,低3位为0x4
5. TIME类token,低3位为0x7
INST类token用于存储指令信息,其具有两类子token
1)token高五位的低三位为0x0,代表子token为INST,token高五位的最高二位为异常级别,通常为El0、El1。EL0表示用户态,EL1是内核态。之后跟随4-byte的aarch64指令码。
2)token高五位的低三位为0x1, 代表子token为PCINST,token高五位的最高二位同样为异常级别。之后跟随12-byte的数据,前8-byte为当前指令的PC,后4-byte为aarch64指令码。
采集工具仅会在基本块(basic block)的首条指令记录PCINST类型token,其他情况记录INST类型,以削减trace大小,对于INST类型,其指令PC默认为上一条指令PC+4
MEM类token用于存储访存信息,同样具有两类子token
1)token第四低位为0x0,代表子token为LOAD,用于存储load指令涉及的信息,token最高四位k用于计算2^k bytes。之后跟随8+2^k bytes的数据,前8-byte为64-bit地址,后2^k bytes为该地址上存储的值
2)token第四低位为0x1,代表子token为STORE,用于存储STORE指令涉及的信息,其余与LOAD相似,不再赘述
VAL类token用于存储关键寄存器数据信息,目前具有六类子token
1)token高位为0x0,代表子token为STXR。之后跟随8-byte的数据,用于指示STXR(exclusive write)指令是否执行成功
2)token高位为0x1,代表子token为MRS。之后跟随8-byte的数据,为MRS/MSR(move general-purpose register to system register/ move system register to general-purpose register)指令涉及的寄存器值
3)token高位为0x2,代表子token为SVCARG。之后跟随8-byte的数据,为该系统调用SVC指令的参数。aarch64中一条系统调用的通常跟有7个参数,第一个是系统调用号(x8),后六个是与系统调用类型相关的各项参数(x0-x5)
4)token高位为0x3,代表子token为SVCRET。之后跟随8-byte的数据,在系统调用执行结束后,从内核态切换回用户态时,记录系统调用的返回值信息
5)token高位为0x4, 代表子token为DC。之后跟随8-byte的数据,为DC指令使用的寄存器值,当指令为DC ZVA/DC GZVA时,记录寄存器值(地址)
6)token高位为0x5,代表子token为TARGET_B。之后跟随8-byte的数据,为非条件跳转指令中,BR、BLR、RET、ERET指令的寄存器值(跳转地址)
MISC类token用于记录杂项数据,目前有五类子token
1)token高位为0x1,代表子token为ALLGPR。之后跟随256-byte的数据,用于异常级别切换时,记录全量的通用寄存器(X0-X31)数据
2)token高位为0x3,代表子token为MISC_FLAGS。之后跟随8-byte的数据,用于在MRS RNDR指令或条件选择指令执行后记录NZCV寄存器的值
3)token高位为0x4,代表子token为SYSCALL_VEC。之后跟随8-byte的iovec结构体数量N,再跟随N个iovec类型结构体数据,用于存储特殊系统调用的参数信息
TIME类token用于记录访存序,目前有一类子token
1)token低三位为0x7,高五位为0x0,用于存储访存指令在同时发起采集的多个trace文件中的绝对顺序,主要用作多线程切片同步