Apache利用一种叫做记分板(scoreboard)的技术在父、子进程间通讯。它的理想实现是在共享内存中。有的操作系统允许我们直接访问共享内存,或者提供它们的确切端口。在这些系统中的典型实现就是共享内存记分板。其他的系统则将磁盘上的文件作为缺省实现。磁盘文件不仅低效而且不稳定(又没有什么优势)。请为您的操作系统仔细阅读src/main/conf.h文件,并在其中寻找USE_MMAP_SCOREBOARD或者USE_SHMGET_SCOREBOARD。定义它们之一(以及相应的HAVE_MMAP和HAVE_SHMGET)将允许Apache使用共享内存。
读取静态网页
我们发现在在静态网页的读取过程中,Apache采用了mmap方式来映射文件信息,我们知道在对于小文件的读取这种方式并没有多少好处,Apache通过一个叫做MMAP_THRESHOLD的宏定义来确定是否采用mmap的文件映射方式,对于大于MMAP_THRESHOLD的文件Apache才采用mmap方式,在http_core.c中这个我们可以找到这个宏定义,它的默认值是8096,资料显示这一数值是对于SunOS4,我们可以针对不同的操作系统修改这一数值来提高性能,这依赖于大量的测试
有关性能的配置文件httpd.conf
在过程中出现了多次的时间函数函数gettimeofday,times的调用,这些调用是由于在编译Apache的过程中包含了mod_status并且将ExtendedStatus设置为On造成的,这些调用都是为了在报告中含有时间戳,我们可以将ExtendedStatus设置为OFF来去掉这些调用。
除此之外,HostnameLookups设定也是导致性能下降的罪魁祸首。DNS解析消耗了大量的时间,除此之外,如果使用了任何allow from domain或deny from domain命令,所付出的代价将是两次DNS查询带来的延时(在一次逆向查询后跟着一次正向查询,以保证前者得到的结果是真实的)。因此为了得到最理想的性能应避免使用HostnameLookups
其它有关性能编译选项
如果我们不打算支持动态加载模块的话,编译服务器时请设定参数-DDYNAMIC_MODULE_LIMIT=0。这将节省出为动态加载模块而分配的内存。
性能监控模块
mod_status和mod_info to模块
在Apache服务器中的 mod_status 和 mod_info to 来告诉我们目前服务器的工作情况
mod_status:
使用 mod_status,允许我们使用URL:http://servername/server-status来通过mod_status生成并报告服务器状态信息。我们可以知道谁在你的服务器上看些什么东西,以及有多少人连在Web 服务器上,每个子进程的运行状态等等信息
mod_info 和 mod_status
这两个模块可以提供十分有用的信息,而且十分方便。
mod_status 能准确地告诉你,你的服务器正在“想”什么。你可以知道有哪些人在浏览您的网站,有多少子进 程在运行,以及这些进程在干吗。系统自从上次启动以来已经运行了多少时间。
当然我们还可以得到更多的信息,修改http.conf
ExtendedStatus on
我们还可以得到一张每一 个子进程及其所作工作的列表。 对于每一个子进程而言,信息包括它的PID ,以及它占用的CPU 时间和已经运行的时间。对于服务器而言,信息包括得到服务器启动以后的合计点击数,CPU的利用率以及每分钟点击数,还有传输给客户端的总计字节数。
启用方式,修改httpd.conf文件,增加以下信息
SetHandler server-status Order deny,allow Deny from all Allow from .your_domain.com mod_info
启用mod_info,允许使用URL:http://servername/server-info来远程报告服务器配置信息,mpd-info 是一个分类的扩展模块,需要需要mod_info.c支持。
确认安装之后,修改httpd.conf,增加以下信息
SetHandler server-info Order deny,allow Deny from all Allow from .your-domain.com
URL:http://servername/server-info显示的启示就是你编译到Apache 里面的东西的列表以及其他针对服务器的各种特性。如果你输入:http://your.server/server-info/ 就可以看到服务器内置的模块列表或者通过DSO 加载的模块列表。
这对于安装和配置特定的服务器来说是十分有用的。特别是用来对错误的配置文件查找问题时。
结论以及目标
1:Apache运行过程时间的记录
通过修改http:.conf配置文件,
LogFormat "%h %l %u %t \"%r\" %>;s %b" common(默认)
增加%D(毫秒级,仅对于Apache2适用),%T(秒级)参数,增加对每个请求的时间过程记录
LogFormat "%h %l %u %t \"%r\" %>;s %b %D" common(默认)
2:加载mod_status和mod_info to模块
虽然加载mod_status和mod_info to模块会带来一定的性能损失,但是一个完善的监控机制还是有必要的,方便我们对Apache的参数调整后的检测,这要比查看单条的请求记录来得更直观和有效
3:进一步的希望
我们觉得以上的信息仍然不够,需要更加量化的信息,比如我们需要每个请求的数据接收,处理,日志的时间记录,我们可能需要去修改Apache的源代码,以达到以上的目标