• LoaRunner性能测试系统学习教程:编译时的配置(5)


    上期我们讲到LoaRunner性能测试Apache调优,这期我们讲LoaRunner性能测试编译时的配置。

    编译时的配置

    编译时的配置主要涉及到的设置有:

    MPM配置、模块、原子操作、mod_status

    多socket性况下串行accept

    单socket性况下串行accept

    延迟关闭

    Scoreboard文件

    DYNAMIC_MODULE_LIMIT。  

    1)MPM配置  

    关于MPM的配置调优将在下文中进行详细的介绍。  

    2)模块  

    既然内存用量是影响性能的重要因素,就应当尽量去除不需要的模块,如何将模块编译成DSO,取消不必要的模块就是一件非常简单的事情。

    只需要注释掉LoadModule指令中不需要的模块。

    如果已经将模块静态链接进Apache二进制核心,就必须重新编译Apache并去掉不想要的模块。增减模块牵涉到的一个问题是,究竟需要哪些模块、不需要哪些模块?这取决于服务器的具体情况。

    一般说来,至少要包含下列模块:

    mod_mime、mod_dir、mod_log_config。

    也可以不要mod_log_config,但是一般不推荐这样做。 

    3)原子操作  

    一些模块,比如mod_cache和worker使用APR(Apache可移植运行时)的原子API,这些API提供了能够用于轻量级线程同步的原子操作。  

    默认情况下,APR在每个目标OS/CPU上使用其最有效的特性执行这些操作。比如许多现代CPU的指令集中有一个原子的比较交换

    (compare-and-swap,CAS)

    操作指令。

    在一些老式平台上,APR默认使用一种缓慢的、基于互斥执行的原子API以保持对没有CAS指令的老式CPU的兼容。如果只打算在新式的CPU上运行Apache,那么可以在编译时使用--enable-nonportable-atomics选项:  

    ./buildconf  

    ./configure--with-mpm=worker--enable-nonportable-atomics=yes  

    --enable-nonportable-atomics选项只和下列平台相关:  

    SPARC上的Solaris,默认情况下,

    APR使用基于互斥执行的原子操作。如果你使用

    --enable-nonportable-atomics选项

    APR将使用SPARCv8plus操作码来加快基于硬件的CAS操作。

    注意,这仅对UltraSPARCCPU有效。  

    x86上的Linux默认情况下,APR在Linux上使用基于互斥执行的原子操作。

    如果使用--enable-nonportable-atomics选项

    APR将使用486操作码来加快基于硬件的CAS操作。

    注意,这仅对486以上的CPU有效。

    4)mod_status  

    如果Apache在编译时包含了mod_status

    而且在运行时设置了“ExtendedStatusOn”

    那么Apache会对每个请求调用两次

    gettimeofday()

    (或者根据操作系统的不同,调用times())

    以及(1.3版之前)几个额外的time()调用

    使状态记录带有时间标志。

    为了得到最佳性能,可以设置

    “ExtendedStatusoff”

    (这也是默认值)。

    5)多socket情况下的串行accept  

    需要注意UnixsocketAPI的一个缺点,假设web服务器使用了多个Listen语句监听多个端口或者多个地址,Apache会使用select()以检测每个socket是否就绪,select()会表明一个socket有零或至少一个连接正等候处理,由于Apache的模型是多子进程的,所有空闲进程会同时检测新的连接。 

    目前至少有两种解决方案:  

    第一:是使用非阻塞型socket,不阻塞子进程并允许它们立即继续执行。但是这样会浪费CPU时间,设想一下,select有10个子进程,当一个请求到达的时候,其中9个被唤醒,并试图accept此连接,继而进入select循环,并且其间没有一个子进程能够响应出现在其他socket上的请求,直到退出select循环。总之,除非有很多的CPU,而且开了很多子进程。  

    第二:Apache所使用的方案是,使内层循环的入口串行化。 

    6)单socket情况下的串行accept  

    上述对多socket的服务器进行的讲述,那么对单socket的服务器又怎样呢?理论上似乎应该没有什么问题,因为所有进程在连接到来的时候可以由accept()阻塞,而不会产生进程“饥饿”的问题,但是在实际应用中。

    它掩盖了与上述非阻塞方案几乎相同的问题。按大多数TCP栈的实现方法,在单个连接到来时,内核实际上唤醒了所有阻塞在accept的进程,但只有一个能得到此连接并返回到用户空间,而其余的由于得不到连接而在内核中处于休眠状态。这种休眠状态为代码所掩盖,但的确存在,并产生与多socket中采用非阻塞方案相同的负载尖峰的浪费。  

    同时,发现在许多体系结构中,即使在单socket的情况下,实施串行化的效果也不错,因此在几乎所有的情况下。

    都这样处理了。

    在Linux

    (2.0.30,双Pentiumpro166/128MRAM)

    下的测试显示。

    对单socket,串行化比不串行化每秒钟可以处理的请求少了不到3%,但是,不串行化对每一个请求多了额外的100ms的延迟,此延迟可能是因为长距离的网络线路所致,并且仅发生在LAN中。如果需要改变对单socket的串行化

    可以定义

    SINGLE_LISTEN_UNSERIALIZED_ACCEPT

    使单socket的服务器彻底放弃串行化。  

    7)Scoreboard文件  

    Apache父进程和子进程通过scoreboard进行通讯,通过共享内存来实现是最理想的,在曾经实践过或者提供了完整移植的操作系统中,都使用共享内存,其余的则使用磁盘文件。磁盘文件不仅速度慢,而且不可靠。

    注意:在对Linux的Apache1.2移植版本之前

    没有使用内存共享,此失误使Apache的早期版本在Linux中表现很差。

  • 相关阅读:
    Python3基础 str """ 多行字符串
    Python3基础 str *运算 重复拼接字符串
    Python3基础 time.localtime 当前系统的年月日 时分秒
    Python3基础 time 索引值访问元组中的年月日时分秒
    Python3基础 sys.path 查看搜索路径变量
    Python3基础 sys.path.append 增加模块的搜索路径
    C#中ListView的简单使用方法
    C#的注释和快速开启工具的命令
    sql server2008安装错误(无法处理异常)
    启动计算机总弹出页面配置问题
  • 原文地址:https://www.cnblogs.com/chuansinfo/p/14004234.html
Copyright © 2020-2023  润新知