热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

应用程序跟踪对性能改变进行量化分析

文章标题:应用程序跟踪对性能改变进行量化分析。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

    使用 Apache Web 服务器作为示例,以了解如何分析公共配置的性能含义。使用应用程序跟踪来观察应用程序运行过程中进行的系统调用。通过统计调用的次数和发生的时间,您可以轻松地了解性能改变的影响。

    您可以对应用程序进行跟踪,以找出它们暂停或不运行的原因。并且可以使用同样的方法,了解更多关于应用程序的信息并理解某些配置的性能含义。因为 Apache 非常流行并且大多数读者对它都比较熟悉,所以本文使用 Apache 作为示例。Apache 所进行的每次系统调用都会对 Web 页面的提供带来延迟,通过跟踪不同配置下的 Web 服务器,您可以确定具体配置的影响。

应用程序跟踪概述

    在应用程序的执行过程中,当需要打开文件、发送数据包或者使用系统资源时,它会对基础操作系统进行相应的系统调用。跟踪应用程序意味着可以在调用发生时观察到这些系统调用,这将使得您能够深入地了解该应用程序的行为。在 Solaris 和 IBM AIX® 操作系统 (AIX) 中,使用 truss 命令完成这项任务,而在 Linux® 中则使用 strace。清单 1 显示了对 pwd 命令进行跟踪的示例。


清单 1. 跟踪 pwd 命令

-bash-3.00$ truss pwd
...
getcwd("/export/home/sean", 1025)               = 0
/export/home/sean
write(1, " / e x p o r t / h o m e".., 18)      = 18
_exit(0)
      

在删除开始处与加载该应用程序相关的输出内容后,您可以看到所进行的三次系统调用:

  1. getcwd 返回当前工作目录。输出内容中显示了字符串“/export/home/sean”返回到缓冲区。
  2. write 可以显示给定的字符串。因为在其执行之后才显示这个系统调用,所以先输出了它的执行结果。还可以注意到,write 系统调用的结果是写入字符的个数数目,在这个示例中为 17 加上一个回车。
  3. _exit 使用错误代码 0 退出该程序,这个错误代码通常表示成功结束。

    尽管这是一个很简单的示例,但它演示了通过应用程序跟踪可以观察程序内部机制的程度。有关跟踪方面更深入的信息,请参见参考资料部分。

Apache 配置的简要介绍

   可以通过一个名为 httpd.conf 的文件对 Apache Web 服务器进行配置。清单 2 显示了一个简单配置中的部分内容。


清单 2. 示例 httpd.conf

DocumentRoot "/var/apache/htdocs"

    Options FollowSymLinks
    AllowOverride None


    Options Indexes FollowSymLinks MultiViews

      

    第一行定义了在何处可以找到 HTML 文件。将所有的请求都映射到这个目录。如果请求 /project/charter.html,将使用 /var/apache/htdocs/project/charter.html 提供该页面。httpd.conf 中剩余的部分由两个 Directory 节组成。 之间的任何内容都将应用于指定目录及其所有的子目录。在本例中,第一节将两项设置应用于根目录,而第二节则指向 /var/apache/htdocs。

    如果多个节应用于单个请求,那么将会对这些命令进行组合,并且最适合的目录具有高优先级。例如,将使用 /var/apache/htdocs/project/charter.html 提供 /project/charter.html 请求的页面。/var/apache/htdocs 是 / 的子目录,所以 Options Indexes FollowSymLinks MultiViews 来自第二节,AllowOverride None 来自第一节。

    可以对许多内容进行配置,并且每项内容都具有其性能含义。本文余下的内容重点关注于如何对这些改变的影响进行量化分析。

建立基准

    在您进行任何调整之前,务必要了解系统当前的运行方式。使用 -X 参数启动 Apache,这个参数将强制 Apache 进入单进程调试模式。这样做可以确保将请求发送到正在进行跟踪的进程,并且消除常规进程间通信所带来的开销。

     在守护进程启动之后,通过运行 ps -ef 找到相应的进程 ID,并查找 httpd 守护进程。在找到该进程之后,使用 truss -c -p PID 附加到该进程。-c 选项表示对系统调用进行计数,而不是逐个显示它们,而 -p 则表示将跟踪器附加于一个正在运行的进程。

    使用 Web 浏览器请求文档。在页面加载之后,回到 truss 应用程序,然后按 Ctrl-C 以结束计数。对于静态 HTML 页面,您应该看到如清单 3 所示的内容(为使这些数字变得更有趣,本示例进行了 100 次相同的请求)。


清单 3. 系统调用基准

sunbox# truss -c -p 15026
(make the Web request 100 times)
^C
syscall               seconds   calls  errors
read                     .009     200
write                    .020     200
close                    .020     200
time                     .004     300
alarm                    .018    1100
fcntl                    .009     300
sigaction                .007     400
munmap                   .007     100
llseek                   .001     100
pollsys                  .005     100
mmap64                   .008     100
stat64                   .007     100
open64                   .006     100
accept                   .019     100
getsockname              .002     100
setsockopt               .002     100
                     --------  ------   ----
sys totals:              .149    3600      0
usr time:                .120
elapsed:                8.960
      

    truss 返回系统调用的列表、执行调用耗费的总时间、调用的次数和任何发现的问题。在这个报表的结尾处,返回了这些系统调用耗费的总时间,以及执行应用程序所耗费的时间。对于这些目的来说,所耗时间是没有意义的,因为它指的是从启动 truss 开始到其结束的时间,而与 Web 请求没有任何关系。

    清单 3 显示了最简单的情况。在来自 Web 浏览器的连接请求到达后,accept 系统调用完成该连接。Web 服务器使用 read 调用获得请求的内容,将请求的内容映射到磁盘上的文件。Web 服务器首先使用 stat64 验证该文件是否存在,使用 open64 打开该文件以便进行读取,然后使用 mmap64 将该文件的内容映射到内存中。然后使用 write 将这个文件发送回客户端,使用另一个 write 生成日志文件,并且服务器执行来自浏览器的最后一个 read。该列表中其余的调用都是系统开销,并且当配置发生改变时,不会有显著的变化。

解释这些数值

    100 次请求总共耗费 0.269 秒 (0.149 + 0.120),这样的性能相当不错,并且该服务器每秒钟应该可以提供大约 370 个页面 (100/0.269)。但是不能完全相信这些数值,因为它们仅表示进程耗费在 CPU 上的时间,而不是其真正的执行时间(也称为时钟时间)。还有更多的因素需要考虑,如磁盘和网络的速度、计算机上正运行的其他内容、该守护进程运行于调试模式的事实。您还需要考虑系统调用跟踪本身的开销。

    本文中使用的方法重点关注这些操作的相对计时和使用应用程序跟踪消除浪费掉的操作。如果您需要了解 Web 服务器每秒可以提供的页面数目,参考资料部分中有相应的软件链接,它可以帮助您确定该数值。

 

[1] [2] 下一页


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
author-avatar
幽兰伴竹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有