提到如何动态追踪进程中的系统调用,相信大家第一时间都能想到 strace,它的基本用法非常简单,非常适合用来解决 “为什么这个软件无法在这台机器上运行?” 这类问题。但如果需要分析线上服务 (特别是延迟敏感型)的某些系统调用的延迟时,strace 则不那么合适,因为它引入的开销会非常大,从性能分析大师 Brendan Gregg 的测试结果得知,被 strace 追踪的目标进程的运行速度会降低 100 倍以上,这对生产环境来说将是个灾难。

那么是否有比较好用的工具用在生产环境上呢?答案是肯定的,下面将介绍两款工具的常用命令,方便大家需要时查阅。

目录

Perf

调用 syscall 数量的 top 排行榜

显示超过一定延迟的系统调用信息

统计某个进程一段时间内系统调用的开销

我们也可以进一步分析高延迟的调用栈信息

对一组任务进行 trace

Traceloop

Benchmark

总结


Perf


众所周知,perf 是 Linux 系统下非常强大的性能工具,由 Linux 内核开发人员在不断演进和优化。除了可以分析 PMU (Performance Monitoring Unit) 硬件事件,内核事件等通用功能外,perf 还提供了其他“子模块”,比如 sched 分析调度器,timechart 根据负载特征可视化系统行为,c2c 分析可能存在的 false sharing (RedHat 在大量 Linux 的应用上,测试过这套 c2c 的开发原型,成功地发现了很多热点的伪共享缓存行问题。)等,而 trace 则可用于分析系统调用,其功能非常强大,并保证了可以接受的开销 —— 运行速度仅放慢 1.36 倍(dd 作为测试负载)。我们一起看下几个常用的场景:

调用 syscall 数量的 top 排行榜


perf top -F 49 -e raw_syscalls:sys_enter --sort comm,dso --show-nr-samples

从输出可以看到在采样期间,kube-apiserver 的调用 syscall 的次数最多。

显示超过一定延迟的系统调用信息


perf trace --duration 200

从输出中可以看到进程名称、pid ,超过 200 ms 的具体系统调用参数和返回值。

统计某个进程一段时间内系统调用的开销


perf trace -p $PID  -s

从输出中可以看到各系统调用的次数,返回错误次数,总延迟,平均延迟等信息。

我们也可以进一步分析高延迟的调用栈信息


perf trace record --call-graph dwarf -p $PID -- sleep 10

对一组任务进行 trace


比如后台有 2 个 bpf 工具在运行,我们想看下它们系统调用使用情况,就可以先将它们添加到 perf_event 这个 cgroup 下,再执行 perf trace:

mkdir /sys/fs/cgroup/perf_event/bpftools/
echo 22542 >> /sys/fs/cgroup/perf_event/bpftools/tasks
echo 20514 >> /sys/fs/cgroup/perf_event/bpftools/tasks
perf trace -G bpftools -a -- sleep 10

perf-trace 的使用就介绍到这里,更多的用法请参考 man 手册,从上面可以看到 perf-trace 的功能非常强大,根据 pid 或 tid 就可以进行过滤。但似乎没有对容器和 Kubernetes(K8s) 环境进行便捷的支持。不用着急,接下来介绍的这个工具就是针对容器和 K8s 环境的。

Traceloop


对于 Traceloop 大家可能有点陌生,但提到 BCC 想必大家就觉得熟悉了。BCC 的前端是 Python/C++,其所属 iovisor 下还有一个项目叫 gobpf 是 BCC 的 go binding。而 Traceloop 则是基于 gobpf 库进行开发的,此项目的主要目标应用场景是容器、K8s 环境。其原理比较简单,其架构如图所示:

核心步骤如下:

  • 1. 利用 bpf helper 获取 cgroup id,根据 cgroup id 而不是 pid、tid 进行过滤。
  • 2. 每个 cgroup id 对应一个 bpf tail call,通过这种方式实现对此 cgroup id 对应的 perf ring buffer 进行写入。
  • 3. 用户空间根据 cgroup id 读取对应的 perf ring buffer。

需要注意的是,当前 cgroup id 的获取方式是通过 bpf helper:bpf_get_current_cgroup_id 来获取的,这个 id 是 cgroup v2 才有的。因此只适用于开启了 cgroup v2 的环境。尚不确定此项目团队是否有意向通过读取 nsproxy 数据结构等方式来对 cgroup v1 进行支持,因此在这里只做简单介绍。随着 K8s 1.19 版本开始支持 cgroup v2,期待 cgroup v2 能尽快普及起来。以下使用 Centos 8 4.18 版本内核进行简单的演示:在 traceloop 退出时 dump 系统调用信息

sudo -E ./traceloop cgroups  --dump-on-exit /sys/fs/cgroup/system.slice/sshd.service

从输出中可以看到,其输出和 strace/perf trace 类似,只是针对 cgroup 进行过滤。需要注意的是 Centos 8 没有像 Ubuntu 将 cgroup v2 挂载到 /sys/fs/cgroup/unified,而是直接挂载到 /sys/fs/cgroup 下,在使用前建议执行 mount -t cgroup2 来确定挂载信息。

对于 K8s 平台,该团队将 traceloop 集成到 Inspektor Gadget 项目中,通过 kubectl 插件来运行,由于管网给出详细的 gif 示例,在这里就不做过多介绍了,对 cgroup v2 有需求的朋友可以试一试。

Benchmark


从 benchmark 结果看,strace 的引起的目标程序性能下降最大,perf trace 次之,traceloop 最小。

总结


strace 依然是解决 “为什么这个软件无法在这台机器上运行?” 相关问题的利器,但对于分析系统调用延迟等问题,perf trace 是合适的选择,其也是基于 BPF 的实现,对于使用 cgroup v2 的容器、K8s 环境,traceloop 会更方便一些。

线上环境 Linux 系统调用追踪相关推荐

  1. javamac系统通过pid获取进程名称_线上环境 Linux 系统调用追踪

    提到如何动态追踪进程中的系统调用,相信大家第一时间都能想到 strace,它的基本用法非常简单,非常适合用来解决 "为什么这个软件无法在这台机器上运行?" 这类问题.但如果需要分析 ...

  2. node开发环境(mac)和线上环境(linux)搭建

    以前一直在做php后台,对node没有认真研究,现在前端发展速度这么快,再加上node的飞速发展,javascript统一中原指日可待啊.em~~,废话不多说开始开发环境和线上环境搭建吧,写一下自己的 ...

  3. 【原创】线上环境 SYN flooding 问题排查

    问题描述:        线上环境中,公司自研即时通讯软件不定时掉线. 问题排查:        由运维和测试人员发现并报告,线上环境出现网络异常,具体表现为登录服务器虚拟 IP 地址无法 ping ...

  4. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;

    正常情况下,hmaster会定期清理oldWALs文件夹,一般该文件大小也就几百兆,但是我们线上 环境出现了该文件没有自动回收情况,如图: 该目录占用hdfs空间多达7.6T,浪费空间: 后来经过多番 ...

  5. [MySQL FAQ]系列 — 线上环境到底要不要开启query cache

    Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变 ...

  6. 使用maven的profile区分本地环境和线上环境

    使用maven的profile区分本地环境和线上环境 多环境开发,使用maven-profile,就可以在打包的时候通过参数的调整,最终打的包也不同. 以区分本地数据库和线上数据库为例 比如测试环境, ...

  7. doctor mysql数据导入_线上环境mysql主从同步的搭建过程

    之前搭建过一套主从同步的mysql集群,但是是基于新数据库,而这次线上环境要升级成主从同步的集群,记录一下升级过程和中间遇到的各种问题. 由于是直接对线上数据库进行修改,因此要保证对线上环境造成尽量小 ...

  8. Keepalived+Nginx实现高可用,反向代理---模拟实现线上环境

    [前言] 在对Keepalived+Nginx进行了研究后,将这项技术推广上线,并配合运维进行网站搭建起来.经过一段时间的运行线上环境 运行已经稳定,不过自己还需要进行更加深入的研究:那么如何模拟线上 ...

  9. 生产环境和开发环境_环境部署:开发、测试和线上环境的区别

    点击蓝字 关注我们 软件开发环境(Software Development Environment,SDE)是指在基本硬件和宿主软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件 ...

最新文章

  1. SpringBoot 自动解析参数:HandlerMethodArgumentResolver
  2. SCAU 1078 破密
  3. python有哪些作用-Python都有哪些强大的功能
  4. 看人装X,我就来气,开启极限装X模式
  5. 解决JavaWeb项目代码报错
  6. python 线程超时设置_python 条件变量Condition(36)
  7. 奥的斯自动人行道服务器密码,奥的斯服务器中文说明21页
  8. UVA 473-Raucous Rockers(DP)
  9. 数组(Java基础内容)
  10. 人工智能现在的技术“好玩”到了什么程度?
  11. 如何进行git ssh文件的配置
  12. 数据结构实验之队列一:排队买饭
  13. OpenCV笔记-对轮廓进行平滑处理
  14. pr 导入 歌词 字幕
  15. 远程桌面管理_IIS7远程桌面连接工具使用方法
  16. Myabtis-Plus(高级查询)
  17. Candence PCB 原理图绘制
  18. ASP.NET Core 使用SignalR后台实时推送数据给Echarts展示图表
  19. (三)JNI常用示例
  20. 粪菌移植——一种治疗人体疾病的新型疗法

热门文章

  1. MyBatis--工具类模板
  2. 2017-2018-1 20155327 《信息安全系统设计基础》第7周学习总结
  3. iOS绘图系列四:绘制文字和图像CGContextDrawImage,drawInRect:,drawAtPoint:, UIGraphicsBeginImageContext...
  4. SSH框架与配置文件的简单搭建
  5. 01_Java概述_public class和class的区别1
  6. 关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH
  7. C中指针和数组引发的探索二
  8. mysql 判断 字母大写_MySQL中查询时对字母大小写的区分
  9. vue改变标签属性_Vue用v-for给循环标签自身属性添加属性值的方法
  10. unity3d软阴影和硬阴影的原理_手术无影灯的原理