鲲鹏社区首页
中文
注册
开发者
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

动态库模式采集数据

基于鲲鹏服务器和x86服务器提供链路时延检测工具压缩包,解压目录后在目录下提供动态库librecord.so,在运行应用时使用LD_PRELOAD加载该动态库,通过动态库采集运行时的POSIX函数及参数信息。

  • 动态库支持x86和鲲鹏平台上运行,能在Glibc 2.17及以上版本的环境上运行。
  • 使用动态库采集数据必须和用户应用程序一起启动。
  • 目前没有针对通用场景下的可变参数函数进行采集,对于兼容性列表中的可变参数函数(fcntl、fcntl64、ioctl ),采集兼容性分析所必须的前三个参数信息。
  • 暂不支持inline函数的耗时采集。

前提条件

已获取链路时延检测工具压缩包(tracelib-collector-aarch64.tar.gz、tracelib-collector-x86_64.tar.gz)并解压,在解压目录下确认存在动态库librecord.so。

命令功能

采集运行时POSIX函数和自定义函数的时间戳、参数、耗时信息。

命令格式

librecord.so运行依赖于包内一同分发的libglib-2.0.so和libgobject-2.0.so,因此运行时需要使能LD_LIBRARY_PATH包含这两个动态库的所在目录,避免使用时由于找不到依赖库出现undefined symbol错误。

LD_LIBRARY_PATH=/directory/of/:$LD_LIBRARY_PATH LD_PRELOAD=/path/to/librecord.so [环境变量1=参数1] ... [环境变量n=参数n] executable args

采集运行时的数据需指定动态库所在路径、配置环境变量以及待采集的二进制文件路径,可配置一个或多个环境变量,RECORD_CONF环境变量为必选参数,多个环境变量之间用空格隔开。

  • /directory/of/:librecord.so、libglib-2.0.so、libgobject-2.0.so所在目录。
  • /path/to/:librecord.so文件所在路径。
  • executable:必选,替换为实际待采集的二进制文件路径。
  • args:替换为二进制文件需要的参数。

参数说明

表1 环境变量参数说明

环境变量名

数据类型

说明

RECORD_CONF

str

必选参数,配置文件,指定需要记录的函数的配置文件路径。

配置文件中未指定pthread_create和fork函数,在采集时也会默认采集pthread_create和fork函数。

RECORD_OUT_DIR

str

可选参数,指定数据文件的输出目录。若不指定,则在当前目录下创建文件夹(record.data)。

根据RECORD_CONF指定的配置文件采集对应的函数信息,采集到的数据会存放到RECORD_OUT_DIR指定的输出目录下,不同TID的数据存放到不同的文件里。

RECORD_VERBOSE

int

可选参数,是否需要打印日志信息,默认为0。

  • 1:表示需要打印日志。
  • 0:表示不打印日志。

配置文件说明

RECORD_CONF指定的配置文件的格式如下:

pthread_create
fork
socket
bind
_Z4funcv
_Z7computei

配置文件中每行只有一列数据,为指定的函数名称,其中pthread_create、fork、socket、bind为POSIX函数,_Z4funcv、_Z7computei为自定义函数。

自定义函数名称规则:

  • 若为C++编译生成的二进制文件,函数名称需为Mangled Name机制改写过的函数名称,可通过“nm 二进制文件”或“readelf -s 二进制文件”命令查看改写后的函数名称。
  • 若为C编译生成的二进制文件,使用原函数名称即可。

Mangled Name:是编译器在编译过程中对函数、变量等名称进行重新命名的一种机制,主要用于解决名称冲突问题,确保编译后的符号名称全局唯一。

采集后存储的数据文件说明

不同线程的数据存放在不同的文件中,对应文件名为record.tid,采集结束后存储的数据文件的格式如下:

1 36149310 3081497 3081497 3081504 3081497 2740656
2 35935130 3081504 3081497
0 _Z4funcv 34587450 34714230 126780
0 bind 34739850 34746540 6690 0 3 4 P1{sin_family:2,sin_port:0,sin_addr:{s_addr:16777343}} 16
0 _Z7computei 36486452 36916330 429878
3 1798

数据文件中每一行表示一个数据包,数据包的第一位表示数据包的类型,类型描述如下:

  • 0:函数信息

    空格作为分隔符,该类型数据包中的参数主要用于后续的兼容性分析,时间戳和函数名用于时序图绘制。

    • POSIX函数:
      0 <函数名> <进入时间戳> <离开时间戳> <耗时> <返回值> <参数个数> <参数数据1> <参数数据2> ...
    • 自定义函数:
      0 <函数名> <进入时间戳> <离开时间戳> <耗时>

    参数数据可以是值或指针,指针类型的参数记录的格式如下:

    • 空指针:以P0表示指针为空。
    • 整型类型指针:以P1表示指针非空,后跟{}包裹的指针指向的整型值,如P1{16}。
    • 结构体类型指针:以P1表示指针非空,后跟指针指向的结构体数据,结构体字段由{}包裹,格式为:{成员名1:成员1的格式化数据,成员名2:成员2的格式化数据...}。如果结构体内成员本身也是结构体的,同样按照此格式进行格式化。
  • 1:进程信息
    空格作为分隔符,该类型数据包中的进程号等信息主要用于在绘制时序图时反映进程间的创建关系。
     1 <时间戳> <进程号pid> <进程组号pgid> <线程号tid> <线程组号tgid> <父进程号ppid>
  • 2:线程创建信息
    空格作为分隔符,该类型数据包中的线程号等信息主要用于在绘制时序图时反映线程间的创建关系。
    2 <时间戳> <当前线程tid> <父线程tid>
  • 3:进程的用户态耗时信息

    空格作为分隔符,该类型数据包在每个进程的主线程对应数据文件的尾行记录,主要用于为网络I/O特征分析提供统计数据,单位为纳秒(ns)。

    3 <进程的用户态耗时>