Linux性能优化--性能追踪2:延迟敏感的应用程序

news2025/7/19 11:22:15

11.0 概述

本章包含了一个例子:如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。
阅读本章后,你将能够:

  1. 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。
  2. 对“热点”函数的每个调用,用gdb生成栈跟踪。
  3. 用性能工具确定使用了多个不同共享库的应用程序是如何消耗时间的。
  4. 以本章为模板,找出延迟敏感应用程序中高延迟的原因。

11.1延迟敏感的应用程序

本章我们将调查一个应用程序,该程序对长延迟敏感。延迟可以被认为是一个应用程序响应不同的外部或内部事件所花费的时间。具有延迟性能问题的应用程序一般不是长时间占用CPU,相反,它只用少量的CPU时间来响应不同的事件。但是,这种响应对特定事件来说是不够的。在修复延迟性能问题时,我们需要降低对各种时间的响应延迟,并找出是应用程序的哪些部分延缓了响应。正如你将看到的,与追踪受CPU限制的问题相比,追踪延迟问题需要的策略略有不同。

11.2 确定问题

对前一章的性能问题,我们必须定义调查内容,并尝试去克服它。本章中,我们把这个过程优化一下,使用GNOME桌面的nautilus文件管理器打开一个弹出菜单。在nautilus 文件管理器窗口的任何位置点击右键即可打开弹出菜单。在这种特定情况下,我们将调查鼠标右键点击一个打开窗口的背景时弹出菜单显示的性能,而不是鼠标右键点击一个特定文件或文件夹时弹出菜单的显示性能。
为什么要对这进行优化?即使打开一个弹出菜单的时间比一秒钟还要少,但它仍然慢到足以让用户感觉到自己点击鼠标右键与菜单显示之间的时间差。这种缓慢的弹出带给GNOME用户的印象是计算机运行的速度慢。人们注意到轻微的延迟,它会让与nautilus的交互变得烦人,或是给人留下桌面迟缓的印象。
这个特殊的性能问题与前一章中的GIMP问题不同。第一,桌面(本例中为GNOME)的核心组件通常比一个典型的桌面应用程序更为复杂与交错。这些组件为了完成工作一般要依赖于各种各样的子系统和共享库。而GIMP是一个相对独立的应用程序,这使得它更容易分析,并在必要的时候重新编译。GNOME桌面则不同,它是由多个不同的交错组件构成的。这些组件可能需要多个进程和共享库,其中每个库都代表桌面执行不同的任务。尤其是nautilus,它链接了72个不同的共享库。追踪到底是哪一段代码消耗了时间,消耗了多少,为什么消耗,可以说是一个艰巨的任务。
本章性能调查与GIMP调查第二个明显不同的地方是:我们想要减少的时间是以毫秒计,而不是以秒或分钟计。当时间小到这个程度,就很难确保捕获到的性能分析数据确实就是你设法测量的事件结果,而不只是尝试停止和启动分析工具时周围的噪声。不过,这个短暂的时间周期还是能在你感兴趣的时间内实际跟踪应用程序工作的方方面面。

11.3找到基线/设置目标

在前一个性能追踪案例中,第一步是确定问题的当前状态。为了让我们的工作更容易一点,并且回避一些上一节提到的分析问题,我们要耍点小花招,让弹出菜单问题看起来更像之前我们测量过的长时间运行的CPU密集型任务。单个弹出菜单显示的时间是毫秒级的,这使得用我们的性能工具很难进行精确的测量。如前所述,很难在合适的时间启动和停止工具,并确保我们只测量到了感兴趣的(即,打开确切菜单所花的CPU时间)。我们将在这里玩点小技巧。我们将快速连续地打开菜单100次,而不仅仅只打开一次。这样,菜单打开的总时间将会达到100倍。这使得我们能用剖析工具捕获菜单正如何执行的信息。
由于右键点击100次很乏味,且人类(除非非常训练有素)不可能可靠地重复打开一个弹出菜单100次,所以我们必须将这个过程自动化。要可靠地打开弹出菜单100次,我们依赖于xautomation包,该包可以从http://hoopajoo.net/projects/xautomation.html获得。它可以模拟一个用户,向X服务器发送任意的X Window事件。下载xautomation压缩包,解压并编译后,就可以使用它来自动执行点击鼠标右键。
与对待GIMP不同,我们不能简单地通过测量nautilus使用的CPU时间来计算创建100个弹出菜单所需的时间。这主要是因为nautilus不能在菜单被打开前立即启动,也不能打开后立即结束。我们将使用墙钟时间来查看完成这个任务需要耗时多久。这要求在进行测试时,系统没有运行任何其他的事情。
清单11.1给出了xautomation命令的shell脚本,用于在nautilus文件浏览器中打开100 个弹出菜单。运行测试时,我们必须确保面对的是nautilus窗口,这样就不会有点击实际上是打开了文件夹的弹出菜单,而是所有的弹出窗口都出现在背景上。这是非常重要的,因为不同弹出菜单的代码路径可能是完全不同的。
在这里插入图片描述
清单11.1中的命令把光标放置在X屏幕的(100,100)处,点击鼠标右键(按钮3)。这个操作打开一个菜单。然后它们再次右击鼠标,这次是关闭该菜单。之后移动到X位置(200,100),重复该过程。
接下来,我们用time查看完成这个100次迭代脚本花费了多少时间。这就是我们的基线时间。在我们进行优化时,我们将把优化结果与这个时间作比较看看是否有所改进。我的笔记本为普通版Fedora2的nautilus,该条件下的基准时间为26.5秒。
最后,我们要为优化选择一个目标。实现这个目的的一个简单方法是找到一个已经具备快速弹出菜单的应用程序,查看它打开100次弹出菜单消耗的时间。xterm是这方面一个很好的例子,它有非常敏捷的菜单。虽然这些菜单不像nautilus的一样复杂,但是它们至少应该被看作是菜单速度的上限。
xterm的弹出菜单操作略有不同,因此我们需要稍微修改一下创建100个弹出菜单的脚本。当xterm创建一个弹出菜单时,需要按下左控制键,因此我们必须对自动化脚本进行轻微的改动。该脚本如清单11.2所示。

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

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

相关文章

spring java 动态获取consul K/V

spring java 动态获取consul K/V 1.springConsul配置kv路径 spring:cloud:consul:enabled: ${CONSUL_ENABLED:true}host: ${CONSUL_HOST:localhost}port: ${CONSUL_PORT:8500}config:prefix: ${CONSUL_CONFIG_PREFIX:config} #consul kv前缀fail-fast: ${CONFIG_FAIL_FAST:fa…

优秀案例 | 以虚拟人IP“科普熊猫”,为2023成都市全国科普日注入新活力

成都科普IP | 全国首个科普数字虚拟形象大使 虚拟人IP“科普熊猫” 2023成都市全国科普日启动仪式上,成都市科学技术协会现场发布了成都市科普熊猫数字虚拟形象大使——虚拟人“科科”。在2023成都世界科幻大会即将召开之际,结合了3D动作捕捉技术以及AR技…

【Java 进阶篇】JavaScript DOM Element 对象详解

JavaScript是一门广泛用于网页开发的脚本语言,而DOM(文档对象模型)是JavaScript在网页中操作HTML和XML文档的核心。DOM以树状结构表示文档,允许开发者以编程方式访问、操作和修改文档的内容和结构。在DOM中,Element对象…

MySQL查询优化看一篇就够了

关联查询优化 数据准备 #分类 CREATE TABLE IF NOT EXISTS type( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY ( id ) );#图书 CREATE TABLE IF NOT EXISTS book(bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,cardINT(10…

从自动化到测开,测试人员逆袭之路从此起步

在当今竞争激烈的软件测试行业中,近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位,许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是,连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

Springboot 启动报错@spring.active@解析错误

Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character that cannot start any token. (Do not use for indentation)in reader, line 10, column 13:active: spring.active^查看是否勾选

uni-app--》基于小程序开发的电商平台项目实战(六)

🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败&#xf…

Tang Capital宣布收购纳斯达克上市公司Rain Oncology100%股权

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,纳斯达克上市公司Rain Oncology(Rain)宣布近期已收到Tang Capital Partners旗下的子公司Concentra Biosciences以每股1.25美元的现金收购要约。 这家临床阶段微型市值癌症治疗药物开发商的股价在消…

【打印机故障】打印时一直显示任务“排队中”无法打印或取消

解决办法 一、关闭打印服务 如果打印任务无法取消或者删除,可以先暂停打印机的“服务,关闭”后台处理程序。具体方法如下: 1.在开始菜单搜索框中输入 services.msc或者中文输入“服务”,然后按下 enter 键。 2.从服务列表中选择打…

【Qt控件之QDialogButtonBox】概述及使用

概述 QDialogButtonBox类是一个小部件,它以适合当前小部件样式的布局呈现按钮。 对话框和消息框通常以符合该台界面指南的布局呈现按钮。不同的平台会有不同的对话框布局。QDialogButtonBox允许发人员向其添加按钮,并将自使用用户的桌面环境所适合的布局…

发现了一个牛逼的网站 可以免费使用chatGPT(看到最后)

最近,打工人们集体陷入了一场焦虑。“一觉醒来,我感觉自己快要失业了……”“身为文字工作者,我该如何自保饭碗?”“人工智能到底会不会完全取代人类的工作?” ChatGPT最近都听说了吧?据说,改论文、敲代码、写文案……只有你想不到的,没有人家办不成的! 它是什么? …

一篇文章带你搞定所有二叉树题型的递归思维(思路超详细)

文章目录 🎀前言:🏅先在开头总结一下,二叉树解题的思维模式分两类:🎇先解释一下“前序位置”,“后序位置”的意思🏨举一个简单的例子: 🪀下面通过两道例题&am…

HTTP 协议的基本格式(部分)

要想了解HTTP,得先知道什么是HTTP,那么HTTP是什么呢?HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。那什么是超文本呢?那就是除了文本,还有图片,声音,视频等。 …

Linux系统编程_进程:C程序空间分配、fork、wait、exec、system、popen

1. 进程相关概念(414.1) 问1. 什么是程序,什么是进程,有什么区别? 程序是静态的概念,gcc xxx.c –o pro,磁盘中生成pro文件,叫做程序进程是程序的一次运行活动,通俗点即…

LoongArch单机Ceph Bcache加速4K随机写性能测试

LoongArch单机Ceph Bcache加速4K随机写性能测试 两块HDD做OSD [rootceph01 ~]# fio -direct1 -iodepth128 -thread -rwrandwrite -ioenginelibaio -bs4k -size100G -numjobs1 -runtime600 -group_reporting -namemytest -filename/dev/rbd0 mytest: (g0): rwrandwrite, bs(R)…

System.exit()方法参数

说明文档:System (Java Platform SE 8 ) 终止当前正在运行的Java虚拟机。该参数用作状态代码;按照惯例,非零状态码表示异常终止。 此方法调用类Runtime中的exit方法。此方法从不正常返回。 调用System.exit(n)实际上等…

这应该是关于回归模型最全的总结了(附原理+代码)

本文将继续修炼回归模型算法,并总结了一些常用的除线性回归模型之外的模型,其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归、人工神经网络、随…

个人博客系统的总结

个人博客系统 1、项目背景: 个人博客系统的兴起和发展是与信息技术和互联网的迅猛发展密切相关的。随着互联网的普及和数字化时代的到来,越来越多的人开始使用互联网平台来表达自己的观点、分享知识和展示个人创作。个人博客系统作为一种在线的个人信息…

C# CodeFormer Inpainting 人脸填充

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace CodeFormer_D…

Qt系列-QSplitter使用笔记

Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,如果有需要对界面进行切割,可以使用QSplitter进行简易的控件拼接。 注意:QSplitter 继承自QFrame,而QFrame又继承自QWidget,这点很重要…