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

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

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/tasksecho 20514 >> /sys/fs/cgroup/perf_event/bpftools/tasksperf 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 会更方便一些。

javamac系统通过pid获取进程名称_线上环境 Linux 系统调用追踪相关推荐

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

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

  2. mysql线上教程_线上环境mysql主从同步的搭建过程

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

  3. 线上 mysql连接超时_线上环境数据库连接超时原因

    查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...

  4. python获取当前进程pid_Python获取系统所有进程PID及进程名称的方法示例

    本文实例讲述了Python获取系统所有进程PID及进程名称的方法.分享给大家供大家参考,具体如下: psutil模块中提供了进程管理方法,引用其中的几个方法就能够获得进程的相关信息.简单写个小脚本测试 ...

  5. linux c 通过 pid 获取 进程相关信息 cmdline

    linux系统命令ps和top都是通过读取/proc/$PID 目录下的信息获取进程的相关信息, 它遍历/proc目录下的首字符为数字的目录,获取系统进程的信息. 我们经常会把pid写到/var/ru ...

  6. springboot怎么杀进程_线上服务平均响应时间太长,怎么排查?

    线上服务平均响应时间太长,怎么排查? https://xie.infoq.cn/article/914b5c56000a3880016abd8d6 前言: 最近线上环境某个接口服务响应时间偏长,导致用 ...

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

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

  8. jmeter查看平均响应时间_线上服务平均响应时间太长,怎么排查?

    最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近线上环境某个接口服务响应时间偏长,导致用户体验超差,那平时该怎么快速的排查这类问题呢? ①.为代码添加上详细的打印日志: 不建议 ,一是线 ...

  9. 如何恢复隐藏的窗口 已知进程名称_如何判断Linux系统是否被黑客入侵?可以用这种方法...

    恶意软件有时会使用Linux内核进程伪装来隐藏其运行时,让我们研究一下如何使用这种策略来揭露Linux恶意软件. Linux内核进程伪装了什么? 在Linux上,内核创建了许多线程来帮助完成系统任务, ...

最新文章

  1. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾
  2. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java
  3. 19.Mysql索引结构及常见索引的区别
  4. 【ARM】ARM其它指令
  5. seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!
  6. 笨办法学习@ConditionalOnProperty 烧脑配置记录
  7. python3 批量定义多个变量_Python 3.8 新功能大揭秘
  8. java中选择排序和冒泡排序_Java选择排序就是比冒泡排序牛「具体详情,请看此文」...
  9. $.ajax()方法
  10. STM32F429HAL库ADCDMA学习笔记
  11. 这样一群人 致踏上CCIE之路的兄弟们!
  12. mysql慢查询优化
  13. Vue项目设置局域网链接访问
  14. django的ORM常用字段和参数
  15. 20dbm是多少mw
  16. 理解网络交换机的原理
  17. 1228 序列求和 (伯努利数)
  18. java读取文本文件,并且去除重复字段
  19. 球重力异常matlab程序,球体重力异常正演程序介绍.docx
  20. 华为怎么显示返回按键_华为怎么把返回那三个键调出来

热门文章

  1. 10.2 梯度下降-机器学习笔记-斯坦福吴恩达教授
  2. SOPC第一课 建立QSYS系统
  3. Msg3最大传输次数(maxHARQ-Msg3Tx)
  4. 用3个IO口控制6个LED灯,怎么做到的?查理复用!
  5. 【arduino】不做不死系列,用arduino玩CyberPi童芯派之helloworld点灯
  6. CLion上用platformIO开发esp32,CLion开发esp32详细配置流程
  7. 【PC工具】推荐在线流程图绘制工具,免费云存储流程图绘制,可直接粘贴图片...
  8. 电源完整性仿真让电路板更完美
  9. kmalloc、vmalloc、malloc、calloc的区别
  10. 初学Java Web——Servlet(一)