Linux下做性能分析4:怎么开始

news2024/11/18 7:25:48

==战地分析==

性能分析常常是一种战地分析,所以,在我们可以端起咖啡慢慢想怎么进行分析之前,我们要先说说我们在战地上的套路。

战地分析是说在实用环境中发现问题,我们真正需要进行性能分析的场合,通常都没有机会让你反复运行程序,重试等等的。几千万用户,几百万在线,几百万个Socket连接,上T的数据库记录,这些场景通常你回家以后就再也没有机会建出来了。而且客户现场的运维工程师可能很Nice,但通常他们的领导都不Nice。领导说,再弄一个小时,他们再搞不定就让他们回家,我们上备份系统……你就得抱着你的便携,手忙脚乱地滚出人家的实验室。

所以现场的机会很宝贵, 针对不同的现场,你最好手上有一套脚本,上去不管三八二十四,先把什么dmesg啦,dpkg -l啦, /proc/cpu, /proc/ingterrupts, /proc/mem啦,ifconfig啦,ps -ef -L啦,/var/log啦,统统先给他扯一套出来,这样你后面怎么都好分析,现场数据对于后面的分析非常重要。你连那个系统有多少内存都不知道,你分析条毛的性能啊?

第二步就是性能了,我们通常先看top,不要用什么交互模式了,直接用top -b -n 3取一个结果出来再说,至少你可以备份。但这个方法有个缺点,它不会显示每个CPU的分布,我的方法是先用交互模式进去(直接运行top),然后按1,展开CPU,然后W,把当前配置写进去,然后再运行top -b -n 3即可。

对top有谱了,我们大概就能知道问题主要出现在哪里了,如果整个系统都闲得很,通量还是上不去,那就是在什么地方丢包或者入口通道带宽不足了了,开始找丢包点把。

如果只是时延太大,就要回去画整个包的调度流程图,看看包括那些步骤,然后用ftrace跟踪这些步骤吧。

(补充一句,在现场的话,如果要定位的是启动速度问题,读者可以考虑一下使用strace或者ltrace attach来跟踪启动效率的问题)

如果有CPU占用率很高,这时就要靠perf来画像了,先查基于时间的perf分布。看看问题,顺便最好把perf-archive打包带回去。

这样,现场的工作就差不多了,出去和开始请客户的运维人员吃饭喝酒套近乎吧。

==离线分析==

离线分析的第一件事是——点杯咖啡?

好吧,那个不重要,对我来说,最重要最重要的事情是:他妈的给老子写份文档出来!这个实在太重要的,我不知道遇到多少次,有人在现场搞不定了,找我出马,然后屁颠屁颠跑过来,说“Kenneth我给你讲讲我们的进展”……讲你老母!!!

交分析报告!

交分析报告!!

交分析报告!!!

他么老子不是你秘书好不好。整个性能分析的工作,就是建立模型,猜测瓶颈,和数据对照,再采样,再分析瓶颈,修正设计,再采样……这样的一个个循环。不写文档不断整合我们看到的现象,整个分析就像建在沙子上一样。你来给我讲讲?讲完我给你写报告是吧?

所以,我们的整个分析过程,应该是一个不断记录我们对模型的修正的过程,文档是整个工作中最重要的一环。

同时,写文档也是提醒我们保存数据。很多人很不在乎数据的记录,在工作环境上这个运行一下,那个运行一下,然后就完事了。 浪费了不知道多少东西,我每次接触工作环境,第一件事是创建一个目录,放一个BRIEF文件,写上当前时间,测试人,环境,原因,然后才开始数据收集,过程中不覆盖任何“稍有点用的”原始数据。这是基本的工作技巧,很多工程师不肯学这种基本素养,不能守弱,工作起来乱七八糟的,这样写出来的报告一钱不值。

怎么写文档这个不是我这里要教的东西,这是你中学语文应该学好的东西,但我还是提一句很多工程师经常犯的错误:判断这种分析报告写得好不好的一个基本原则是,你是否始终围绕着“瓶颈的证据是什么”来表述观点。这个原则非常简单,但很多报告写出来就会忘掉这个。他们写着写着就喜欢收集各种很好看的分布图,趋势图,然后彻底忘掉到底现在系统到底到达瓶颈没有,以及到达瓶颈的理由是什么。很多人给我夸夸奇谈半天,我问一句,“你根据什么判断现在压力不能上去了?”,然后他就傻了。这个说到底是个守弱的问题,我们还是少点想建功立业,先做点基本的东西比较好。

==示例==

我们还是用我的cs程序为例(我晚点注册个新的github帐号共享出来),这个例子很简单,它模拟了一组线程产生数据,写入队列,然后另一组线程把数据取出来,完成整个计算的过程,计算用heavy_cal函数来模拟。我们的目标是尽量提高计算的通量。所以,我们首先看4线程的一般运行的结果:

这个每秒处理175K的任务。但CPU还有空闲。可能是因为我们在每个线程计算的时候有IO,导致效率上不去,我们用更多的线程(40个)来填掉这些IO的等待,结果提升非常有限:

简单解决不了这个问题了,我们看看ftrace的数据:

看见没有,cs的线程执行不到5个微秒就休眠了,搞什么飞机?

这个函数这样写的:

void * pro_routin(void * arg) {
	struct task * tsk = arg;
	int ret;

	srand((intptr_t)tsk->arg);

	while(1) {
		ret = heavy_cal(rand(), n_p_cal);
		en_q(ret);
		marker("yield here");
		yield_method_f();
	}
}

heavy_cal是纯计算,不会引起无意义的休眠,marker在内核中是用spin_lock保护的,不会引起休眠,唯一有可能休眠的是yield和en_q()(写入队列),我们清掉yield试试,发现没有效果。那就只有怀疑en_q()了,我们预期provider en_q可以写上几十个,然后才切换给consumer再处理几十个。

但实际上根据Linux的调度算法,consumer会因此被逐步提权为interactive线程(Linux调度算法总是把总用不完时间片的进程的调度优先级提高,让他们成为interactive线程,这样那些用来处理鼠标,键盘的任务可以优先得到调度,从而提高响应速度。

这样修改以后,单核CPU占用率提升到92%以上,处理效率就提升到311K了。这时我们再看ftrace数据,它是这样的:

这个跟踪我们还跟踪了futex的调用,我们可以看到大量的pthread_mutex_unlock的调用,但都没有引起调度,整体性能就提上去了。

我们还有办法可以把剩下的那些时间用起来,不过这只是个例子,就到此为止吧。


 

==总结==

本文介绍了最基本的性能分析流程,后面我们会具体讨论一些常见的分析模型,加深对这些模型的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode: 18. 四数之和 | 双指针专题

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Java中的几种关键字this、super、static和final介绍

Java中的几种关键字this、super、static和final介绍 在Java编程语言中,关键字是具有特殊含义的预定义标识符。关键字是Java编程语言中具有特殊用途的保留单词,用于表示语法结构和程序行为。关键字在语法上具有特定的用途,不能用作变量名、方…

HTTP1.1、HTTPS、HTTP2.0 、HTTP3.0

HTTP1.1 优点: 整体方面:简单、灵活和易于扩展、应用广泛和跨平台 性能方面:长连接、管道网络传输解决请求队头阻塞(没有使用) 缺点: 安全方面:无状态、明文窃听、伪装、篡改 性能方面&am…

进程间通信之匿名管道

进程间通信—管道 一、进程间通信介绍二、管道1.匿名管道1.1父进程和一个子进程之间的通信1.2父进程和多个子进程之间的通信 一、进程间通信介绍 1.进程间为什么要进行通信? 进程间通信的是为了协调不同的进程,使之能在一个操作系统里同时运行&#xff…

代码随想录day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07.链表相交 142.环形链表II

文章目录 一、两两交换链表中的节点二、删除链表的倒数第N个节点三、链表相交四、环形链表 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 一、两两交换链表中的节点 两两交换链表中的节点 注意是两两交换,采用虚拟…

Global symbol “%data“ requires explicit package name

Global symbol “%data” requires explicit package name 如图编写demo的时候出现了如图的问题,在网上查找到的原因是: 一,使用use strict; ,修改其他代码,如下: 1,首先,检查你是不…

静态库和动态库的区别与优缺点

文章目录 静态库与动态库的区别动态库与静态库的优缺点 静态库与动态库的区别 静态库直接打包链接到可执行程序 动态库将不会链接到可执行文件 ,执行文件运行时需要动态加载 动态库 ,所以需要提前知道动态库路径,需要将路径保存到环境变量或…

亲测:2核4G云服务器性能测试能安装多少个网站?

2核4G服务器能安装多少个网站?2核4g配置能承载多少个网站?一台2核4G服务器可以安装多少个网站?阿腾云2核4G5M带宽服务器目前安装了14个网站,从技术角度是没有限制的,只要云服务器性能够用,想安装几个网站就…

【前端知识】React 基础巩固(二十六)——Portals 的使用

React 基础巩固(二十六)——Portals 的使用 Portals 通常&#xff0c;组件会渲染到 root 节点下。可使用 Portals 将组件渲染至其他节点。 添加 id 为 more、modal 的 div 元素 <div id"root"></div> <div id"more"></div> &l…

apache 工作模式 NPM Multi-processing module

Apache 三种工作模式 prefork work event 监控线程相当于 项目组长&#xff0c;面对客户&#xff0c;根据任务自行调度 团队成员。 Prefork模式为Apache默认使用的工作模式&#xff0c;在该模式下&#xff0c;采用的机制是预派生子进程的方式&#xff0c;使用单独的进程来…

设计模式之单例

文章目录 前言一、单例模式的基本定义二、懒汉式单例三、饿汉式单例四、懒汉式单例存在的线程安全问题总结 前言 单例模式是比较经典的设计模式&#xff0c;本篇我们将结合实际案例说明单例模式的实现原理&#xff0c;以及存在的问题。 一、单例模式的基本定义 单例模式&…

【前端知识】React 基础巩固(二十八)——StrictMode

React 基础巩固(二十八)——StrictMode StrictMode StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样&#xff0c;StrictMode 不会渲染任何可见的 UI为后代出发额外的检测和警告严格模式检查仅在开发模式下运行&#xff0c;不影响生产构建 严格模式检…

Google DeepMind掌舵人Demis Hassabis专访:合并后「超级单元」内幕,以及如何开展下一代模型研究...

导读 自2023年以来&#xff0c;Google旗下两大顶级人工智能研究团队 DeepMind 与 Google Brain 被不断推上风口浪尖&#xff0c;如何应对OpenAI与微软强强联合&#xff1f;如何组织不被看好的 DeepMind 与 Google Brain 团队合并&#xff1f;Google和OpenAI都没有护城河吗&…

单片机第一季:零基础8——蜂鸣器

蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 想要压电式蜂鸣器发声&…

使用Gataway设置全局过滤器

说明&#xff1a;Gateway网关是所有微服务统一的入口&#xff0c;通过网关技术&#xff0c;可以实现请求转发、权限控制和限流。全局过滤器是Gateway请求转发、权限控制的一个体现。比如对所有请求进行过滤&#xff0c;判断请求是否携带有效的token&#xff0c;对请求放行或者拦…

Java 装箱拆箱原理 包装类型缓存池

JAVA中的基本数据类型 byteshortintlongfloatdoublebooleanchar 为了让上述基本数据类型可以转为对象&#xff0c;Java在1.5推出了一系列包装类&#xff0c;基本类和包装类互相转换的过程&#xff0c;称为装箱和拆箱 缓存池 缓存池也叫常量池。它是事先存储一些常量数据用以…

reverse

b,a,0x7d65都能轻易的转成字符串&#xff0c;就是这个负数需要看汇编&#xff0c;在汇编层面是加了两个数实现的减法效果。 a[galf,saE{,er_y,3r0v,}e] for each in a:print(each[::-1],end) # flag{Easy_rev0r3e}

华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路特别鸣谢&#xff1a;感谢fly晨发现这个问题&#xff0c;并提供更优质的算法。解题思路如下&#xff1a; 五、Java算法源码六、效果展示1、输入2、输出3、思路 专栏导读 本专栏收录于《华为OD机试&#xff08;J…

【USRP X310】如何查找USRP X310的 LabVIEW 案例 Demo

环境 Windows 10LabVIEWUSRP 支持的硬件 USRP-2900USRP-2901USRP-2920USRP-2921USRP-2922USRP-2930USRP-2932USRP-2940 40 MHzUSRP-2940 120 MHzUSRP-2942 40 MHzUSRP-2942 120 MHzUSRP-2943 40 MHzUSRP-2943 120 MHzUSRP-2944USRP-2945USRP-2950 40 MHzUSRP-2950 120 MHzUS…