快捷搜索:  

Apache 性能最优化分析(11)

所有静态文件使用mmap:

    mmap(0, 6144, PROT_READ, MAP_PRIVATE, 4, 0) = 0x400ee000
    ...
    munmap(0x400ee000, 6144) = 0


  在一些系统上mmap小文件的效率不如直接读取该文件。宏MMAP_THRESHOLD用来设置应用mmap时的最小文件尺寸。缺省值是0(但在SunOS4上的缺省值是8129。实验证明这个值在该系统上比较理想)类似lmbench的工具可以帮助您在您的系统上进行优化设置。

  您也许乐意在MMAP_SEGMENT_SIZE上做个实验(缺省值32768)。它决定了被mmap的文件将以一次多少个字节写出。Apache只在每次write之间重置客户的超时时间,因此把这个值设得过大容易把带宽较窄的用户拒之门外--除非同时增加Timeout。

  您的系统有可能根本不用mmap。如果是这样的话,定义USE_MMAP_FILES和HAVE_MMAP也许会奏效(如果它真的有效请告诉我们)。

  Apache尽全力避免在内存中拷贝数据。对任何请求的首次写出都将借助writev合并头标及第一块数据:

    writev(3, [{"HTTP/1.1 200 OK\r\nDate: Thu, 11"..., 245},{"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 6144}], 2) = 6389

  当进行HTTP/1.1块状编码时,Apache将生成最多为4个元素的writev。它的目标是将字节拷贝至内核,这是典型情况下必须做的事情(为了组装网络数据包)。2.0.31之前的Linux并不进行合并,而是为每个元素生成一个数据包。因此升级系统是一个好主意。定义NO_WRITEV将阻止这种合并,但将使得块状编码的性能很差。

  日志文件的写入工作

    write(17, "127.0.0.1 - - [10/Sep/1997:23:39"..., 71] = 71

  能够被宏定义BUFFERED_LOGS推迟。这种情况下,在真正写入文件之前,最多PIPE_BUF个字节(POSIX标准定义的常量)的日志信息将被缓存。由于写入条目不是atomic的(就是说来自不同子进程的信息将混合在一起),因此跨越PIPE_BUF边界的条目不会被分割。当子进程终止时,Apache用出色的方式将缓存排空。
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论