off cpu linux,宋宝华: 用off-cpu火焰图进行Linux性能分析
原标题:宋宝华: 用off-cpu火焰图进行Linux性能分析
在《 宋宝华:火焰图:全局视野的Linux性能剖析 》一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析。但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU),并不能解决性能问题,因为有时候性能差的原因瓶颈不一定在CPU上面,而是在off-cpu的时间,比如:
进程进入系统调用执行io动作,io动作的延迟
进程等待mutex锁的时间
内存被交换,swap的时间
内存不够的时候,执行直接内存回收的时间
进程被抢占调度走、或者时间片用完被调度走的时间(runqueue太大)
等等等。
基本上,off-cpu的状态图如下(图片来自:
http://www.brendangregg.com/offcpuanalysis.html)
比如一个http服务器,登录的用户多了后,如果普遍觉得上网慢,瓶颈可能出现在网络慢、硬盘读取慢、mutex竞争等。这种情况下,on-cpu可能不是问题,主要的问题可能是在off-cpu的部分了。off-cpu分析,对性能问题的调优也至关重要。
下面我们写一个最简单的程序
gcc编译它,可以获得a.out。假设我们追求的性能目标是: 每秒钟打印地hello world越多越好,证明这个进程越能服务更多的打印请求。当然现实生活中的程序比这个要复杂1万倍,但是这个例子不妨碍我们说明原理。
实验环境:
Ubuntu-18.10,内核版本4.18,apt install安装bpfcc-tools - tools for BPF Compiler Collection (BCC)工具包,以及git clone了
https://github.com/brendangregg/FlameGraph
下面我们采集一个它的off-cpu时间:
barry@barryUbuntu:~$ sudo offcputime-bpfcc -K -p `pgrep -nx a.out`
Tracing off-CPU time (us) of PID 5593 by kernel stack... Hit Ctrl-C to end.
按下ctrl-c停下来后,我们看到2个主要的off-cpu的栈回溯是:
一个发生在usleep调用的hrtimer_nanosleep -> do_nanosleep系统调用;一个发生在printf的时候,进入sys_write系统调用后,tty_write的n_tty_write等待一个mutex的代码上面。
这个时候,我们可以进一步查看Linux内核的代码
https://lxr.missinglinkelectronics.com/linux+v4.18/drivers/tty/n_tty.c#L2285
我们认为延迟应该是出现在这个地方:
....
所以,如果我们想实现每秒打印hello world尽可能多的目标,显然应该删除那个usleep,以及分析为什么这个mutex_lock要这么久,看看内核里面有无优化的空间。
如果我们想绘制系统在运行上述a.out进程的时候的off-cpu火焰图,我们可以先采集调度数据30秒,得到out.stacks:
sudo offcputime-bpfcc -df -p `pgrep -nx a.out` 30 > out.stacks
接下来,我们进入clone下来的FlameGraph项目目录,用flamegraph.pl绘制火焰图:
./flamegraph.pl --color=io --title="Off-CPU Time Flame Graph" --countname=us ~/out.stacks > output.svg
用看图片的工具打开output.svg:
从图上也可以看到,off-cpu的2个主要原因一个是nanosleep,一个是write系统调用进入后n_tty_write里面要拿mutex。
点击write的路径,可以局部放大这部分栈回溯:
与我们前面的文本分析的结果是一致的。如果我们想优化性能,一个是可以消除usleep,第二个是分析为什么mutex_lock要等这么久,有什么空间可以提高。
本文是一篇关于off-cpu火焰图的入门引导性文章,如果您对此感兴趣,可以进一步参考:
http://www.brendangregg.com/offcpuanalysis.html
(完)
Linux阅码场原创精华文章汇总
如果您觉得文章不错,请点一点右下角“在看”为阅码场疯狂打Call吧~返回搜狐,查看更多
责任编辑:
off cpu linux,宋宝华: 用off-cpu火焰图进行Linux性能分析相关推荐
- 宋宝华: 用off-cpu火焰图进行Linux性能分析
在<宋宝华:火焰图:全局视野的Linux性能剖析>一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析.但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU) ...
- 宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)上集
共享单车.共享充电宝.共享雨伞,世间的共享有千万种,而我独爱共享内存. 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进 ...
- 宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)
创作目的 互联网.Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent.dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦 ...
- 宋宝华:论一切都是文件之匿名inode
01 唯有文件得人心 当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你.当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你. ...
- 宋宝华:评Linux 5.13内核
目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...
- 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)
LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...
- linux pdf 宋宝华,51CTO博客-专业IT技术博客创作平台-技术成就梦想
原创 宋宝华 Linux阅码场 2018-04-10 前言 网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂! 我曾经跨过山和大海 也穿过人山 ...
- linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...
- 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载
12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37 宋宝华_2010年12月11日_& ...
- 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清
原创 宋宝华 Linux阅码场 2018-01-22 作者简介 宋宝华,他有10几年的Linux开发经验.他长期在大型企业担任一线工程师和系统架构师,编写大量的Linux代码,并负责在gerrit上r ...
最新文章
- Visual Studio常用快捷键
- 基于 Rancher 的企业 CI/CD 环境搭建
- VTK:非结构化网格之ClipUnstructuredGridWithPlane
- display函数怎么使用_损失函数—深度学习常见损失函数总结【图像分类|上】
- python——面向对象篇之异常和反射
- 【STM32】FreeRTOS任务挂起和恢复示例
- ac2100 反弹shell无法粘贴_记一次突破反弹shell
- python引入redis_实操演练解读非关系型数据库—Redis
- Rust : async、await 初探
- 创建uni-app 微信小程序项目
- DroppyCtf靶机
- Eclipse BIRT报表开发工具安装教程
- React中文文档之Hello world翻译
- Linux网络环境配置 虚拟机网络环境配置
- hanLP探索-语义距离计算的实现
- 信用卡融资的优势,这些你了解过吗?
- POCO::Net 简单的HTTPS程序
- linux 查看系统详细信息
- SMC气动制图及气动元件配置工具
- iOS---GPUImage研究:内置滤镜解析
热门文章
- 十岁陌陌更名“挚文集团”的战略新时代|财报解读
- 电商平台系统架构设计案例分析
- AD9如何创建原理图元件
- Java架构师技术进阶路线图详解
- 全球最大的同性交友网站,竟然还有这些骚操作
- Unity Editor 查找资源依赖、反向查找资源依赖Dependencies
- c语言词法分析器的实验报告,C语言词法分析器构造实验报告
- 苹果绕id工具_绕ID教程(iOS13.313.3.1)
- JDK安装与环境变量配置(Win10)
- 慢速DoS攻击工具slowhttptest(网站压力测试工具)