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的情况下 , 实施串行化的效果也不错 , 因此在几乎所有的情况下 。
【LoaRunner性能测试系统学习教程:编译时的配置(5)】都这样处理了 。
在Linux
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 华为|骁龙870和骁龙855区别都是7nm芯片吗 性能对比评测
- 器件|苏州纳米所等在高性能柔性储能器件研究中取得进展
- 超强|RedmiNote9系列发布!天玑800U赋予超强5G性能
- iPhoneX|iPhone12和iPhoneX性能对决:差距比想象的大太多
- Redmi|Redmi Note 9系列发布,搭载天玑800U具备超强5G性能
- 首发|华为或首发联发科6纳米+A78新U:性能超强不输麒麟9000
- 华为|安兔兔10月安卓性能榜:华为Mate40 Pro第一 麒麟9000碾压骁龙865
- 骁龙865|5G手机中的性能怪兽,256+120W闪充,比iPhone12值得买
- 网间|新外观专利陆续曝光 徐起和网间透露realme极致性能新机将至
