使用应用程序跟踪对性能改变进行量化分析
2006-08-26 08:12:12 来源:WEB开发网truss 报告了该进程所耗费的时间远远小于客户端感觉到的时间(0.015 秒与 15 秒)。这是因为大多数套接字操作都是异步地 进行的,其中套接字进行轮询以检查数据是否出现,而不是使得应用程序处于阻塞(等待)状态以等待响应。如此一来,应用程序在等待结果的时候不会消耗 CPU 时间。这就解释了 truss 报告的时间和客户端感觉到的时间之间出现差异的原因。
truss 并没有忘记所做的更改,0.015 秒比本文中研究的第一个简单示例要高一个数量级。从系统调用计数中可以看出,有一些以前没有出现过的调用,包括 read、write、close 和 stat。以及还有 send、connect、so_socket 和 pollsys,这些系统调用用于进行名称请求。因为名称解析可以来自于不同的来源,包括本地文件系统和名称缓存守护进程,所以必须对这几个位置进行检查。在随后的调用中,请求时间小于 1 秒,这是因为对 DNS 信息进行了缓存。
最后,大部分的延迟来自于远程名称服务器和正向解析。这个事实进一步强调了,如果您希望依赖于名称查找,那么就需要使用 DNS 缓存和快速 DNS 服务器。然而,最佳的解决方案是使用一种可选的方法来处理这个问题。一种比较简单的解决方案是指定 IP 地址块(如 Allow from 10.0.0.0/8),这种方法比 DNS 查找要快得多。因为反向和正向查找必须匹配,所以对名称进行的操作,很可能可以用于网段。另外,Apache 可以集成各种身份验证系统,所以基于用户的身份验证是另一种可选方法。
系统调用与库调用
如果熟悉套接字编程,那么您可能会寻找 gethostbyname 和其他类似的调用,这些调用都可以用来执行主机查找功能。有一些库调用,由 /usr/lib 中的系统库 libc 和 libsocket 提供。库调用封装了一个或多个系统调用,以及额外的逻辑。您可以将它们作为程序员友好的接口来进行系统调用。例如,gethostbyname 库调用将执行许多步骤,以便根据服务器的配置查找相应的名称,如检查 /etc/hosts 或搜索网络信息系统 (NIS) 或 DNS。这些步骤包含了内核所提供的更小的构件,即系统调用。在大多数这样的这种情况下,两者之间的差别通常很小。truss 还可以跟踪库调用,但是无法提供像系统调用那样详细的信息。
结束语
监视和统计系统调用的功能不仅有助于进行故障排除,还有助于理解应用程序配置如何对性能产生影响。与系统的其他部分之间的每个交互操作都会调用一个或多个系统调用,并且每次调用都会增加系统开销。这并不是说系统调用非常糟糕,如果程序员不与其他的部分进行交互,那将是很乏味的。相反,在改变应用程序时,您可以监视系统调用的使用,以便更好地了解这些改变对总体性能的影响。
更多精彩
赞助商链接