返回

自定义 Trace 日志格式

Android

之前在添加 IO 的 Trace 日志时,由于每一次 open、close、read、write 都去打日志,同时会通过 fd 参数去获取真正的文件名(使用 readlink 去读取 /proc/self/fd/<fd>),导致异常卡顿。优化点之一就是只去记录主线程的 IO 行为,也就是只记录由主线程创建的文件句柄的行为。

trace 日志功能的一个核心是通过 trace 日志去理解主线程的 IO 行为,发现 IO 异常,以及慢查询的根因。trace 日志最理想的方式是,在主线程里通过 fd 拿到文件名,以及记录 IO 操作的属性,这与内核 trace 机制契合度最高。

IO 的内核 trace 也是在 IO 创建的时候,将文件名和 IO 操作属性一起记录下来,而不是记录 fd。记录 fd 只是为了将 fd 和真实文件名联系在一起。因此,我们在 trace 日志中只记录 fd,文件名和 IO 属性则直接由内核 trace 机制获取。这样就不用通过 readlink 去读取真实文件名了,从而避免了在内核态下的字符串复制开销。

Trace 日志输出格式

在 trace 日志里,每个 IO 操作的格式如下:

[FD]xxxx: yyyy:  zz:  {operation}[OBJNAME]

其中:

  • FD:文件符,4 位长度
  • xxxx:IO 操作所属进程ID,4 位长度
  • yyyy:IO 操作所属线程ID,4 位长度
  • zz:IO 类型,1 位长度
  • operation:IO 操作,至少 1 位长度
  • OBJNAME:IO 操作的对象,长度不定

比如:

[ 10]:  10:  0: r /tmp/t.txt

表示进程 10 的线程 10 执行了一个 read 操作,操作的对象是 /tmp/t.txt 文件。

Trace 日志输出类型

IO 类型

IO 类型有以下几种:

  • 0:read 操作
  • 1:write 操作
  • 2:lseek 操作
  • 3:fsync 操作
  • 4:truncate 操作
  • 5:open 操作
  • 6:close 操作
  • 7:dup 操作
  • 8:ftruncate 操作

操作对象

操作对象有多种:

  • 文件,以/开头
  • 管道,以|开头
  • 套接字,以@开头
  • 终端,以&gt;开头
  • 共享内存,以$开头

文件状态

文件状态有以下几种:

  • r:可读
  • w:可写
  • x:可执行
  • rw:可读写
  • rx:可读执行
  • wx:可写执行
  • rwx:可读写执行

Trace 日志输出示例

以下是一些 Trace 日志输出示例:

[ 10]:  10:  0: r /tmp/t.txt
[ 10]:  10:  1: w /tmp/t.txt
[ 10]:  10:  2: l /tmp/t.txt
[ 10]:  10:  3: f /tmp/t.txt
[ 10]:  10:  4: t /tmp/t.txt
[ 10]:  10:  5: o /tmp/t.txt
[ 10]:  10:  6: c /tmp/t.txt
[ 10]:  10:  7: d /tmp/t.txt
[ 10]:  10:  8: f /tmp/t.txt

根据这些输出,我们可以看到进程 10 的线程 10 执行了以下操作:

  • 读文件 /tmp/t.txt
  • 写文件 /tmp/t.txt
  • 寻址文件 /tmp/t.txt
  • 同步文件 /tmp/t.txt
  • 截断文件 /tmp/t.txt
  • 创建文件 /tmp/t.txt
  • 关闭文件 /tmp/t.txt
  • 复制文件 /tmp/t.txt
  • 截断文件 /tmp/t.txt

Trace 日志输出优化

为了提高 Trace 日志的性能,我们可以对 Trace 日志输出进行优化。优化方法如下:

  • 减少输出量。Trace 日志输出量很大,我们可以通过减少输出量来提高性能。
  • 优化输出格式。Trace 日志输出格式比较复杂,我们可以通过优化输出格式来提高性能。

Trace 日志优化示例

以下是一些 Trace 日志优化示例:

  • 使用更简洁的输出格式。
  • 减少输出量。
  • 输出更少的信息。

通过这些优化,我们可以提高 Trace 日志的性能。

Trace 日志的应用场景

Trace 日志可以应用在以下场景:

  • 性能分析。Trace 日志可以帮助我们分析系统的性能问题。
  • 调试。Trace 日志可以帮助我们跟踪系统的执行过程。
  • 安全分析。Trace 日志可以帮助我们分析系统的安全问题。

Trace 日志的最佳实践

以下是使用 Trace 日志的最佳实践:

  • 在生产环境中使用 Trace 日志。
  • 使用 Trace 日志来分析性能问题。
  • 使用 Trace 日志来跟踪系统的执行过程。
  • 使用 Trace 日志来分析系统的安全问题。

Trace 日志的限制

Trace 日志也有以下限制:

  • Trace 日志输出量很大。
  • Trace 日志输出格式比较复杂。
  • Trace 日志输出速度较慢。

这些限制可能会影响 Trace 日志的性能。

结论

Trace 日志是一种非常有用的工具,可以帮助我们理解系统的行为。通过优化 Trace 日志,我们可以提高其性能。在使用 Trace 日志时,应注意其限制,并使用最佳实践。