本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书《软件性能测试分析与调优实践之路》部分章节归纳。

在国内互联网公司中,Web中间件用的最多的就是Apache和Nginx这两款了,包括很多大型电商网站淘宝、京东、苏宁易购等,都在使用Nginx或者Apache作为Web中间件。而且很多编程语言在做Web开发时,会将Apache或者Nginx作为其绑定的固定组件,比如php语言做Web开发时,就经常和Apache联系在一起,使得apche成为了php在Web开发时的一个标配。而Nginx不管是在作为Web静态资源访问管理或者作为动态的请求代理性能都是非常的高效,当然Nginx或者Apache在性能分析时,有时候也会存在性能瓶颈或者需要进行调优以支持更高的并发处理能力。

1. Nginx的性能分析和调优

1.1  Nginx的负载均衡策略的选择

在一般的时候,Web中间件最大的作用就是负责对请求进行分发,也就是我们常说的起到负载均衡的作用,当然负载均衡只是Nginx的作用之一,Nginx常见的负载均衡策略一般包括轮询、指定权重(weight)、ip_hash、least_conn、fair、url_hash等六种,其中默认执行的策略为轮询,fair、url_hash属于第三方策略,这两种策略不是Nginx自带支持的策略,需要安装第三方的插件来辅助支持。在不同的场景下,每一种策略的选择对系统的整体性能影响都非常大,一般建议根据实际场景和服务器配置来选择对应的负载均衡策略。

  •         轮询策略:Nginx的负载均衡是通过配置upstream来实现请求转发的,在upstream如果没有指定其他任何的策略时,Nginx会自动执行轮询转发策略,upstream中配置每台服务器的权重都一样,会按照顺序依次转发。如下所示就是一个简单的upstream配置,由于配置了192.168.1.14和192.168.1.15两台服务器,所以请求会按照接收到的顺序依次轮询的转发给192.168.1.14和192.168.1.15两台服务器进行执行。Nginx能自动感知转发到的后端服务器是否挂掉,如果挂掉后Nginx会自动将那台挂掉的服务器从upstream中剔除。
upstream applicationServer {

    server 192.168.1.14;

    server 192.168.1.15;

}

使用轮询策略时,其他非必填的辅助参数如下:(转载请注明出处:来源于博客园,作者:张永清 https://www.cnblogs.com/laoqing/p/14259788.html

 使用轮询策略的辅助参数

  •         指定权重(weight):通过在upstream配置中给相应的服务器指定weight权重参数来实现按照权重分发请求,weight参数值的大小和请求转发比率成正比,一般用于后端应用程序服务器硬件配置差异大而导致承受的访问压力不一样的情况可以使用该配置,配置示例如下:
upstream applicationServer {

    server 192.168.1.14 weight=8;

    server 192.168.1.15 weight=10;

}
  •         ip_hash:每个请求按原始访问ip的hash结果来进行请求转发,由于同一个ip的hash值肯定是不变的,这样每个固定客户端就会只访问一个后端应用程序服务器,此种配置一般可以用来解决多个应用程序服务器的session复制和同步的问题,因为同一个ip的请求都转发到了同一台服务器的应用程序上了,所以也就不会有session不同步的问题了,但是可能会导致后端应用服务器的负载不均的情况,因为这种策略下后端应用服务器收到的请求数肯定是很难一样多。配置示例如下:
upstream applicationServer {

ip_hash;

    server 192.168.1.14;

    server 192.168.1.15;

}
  •        least_conn:通过在upstream配置中增加least_conn配置后,Nginx在接收到请求后会把请求转发给连接数较少的后端应用程序服务器,前面讲到的轮询算法是把请求平均的转发给各个后端使它们的负载大致相同,但是有些请求占用的时间很长会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。示例配置如下:
upstream applicationServer {

least_conn;

    server 192.168.1.14;

    server 192.168.1.15;

}
  •        fair:fair属于第三方策略,即不是Nginx本身自带的策略,需要安装对应的第三方插件。fair是按照服务器端的响应时间来分配请求给后端应用程序服务器,响应时间短的优先分配。示例配置如下:
upstream applicationServer {

    server 192.168.1.14;

server 192.168.1.15;

fair;

}
  •       url_hash:url_hash同样属于第三方策略,也是需要安装对应的第三方插件。url_hash是按照访问的目标url的hash值来分配请求使同一个url的请求转发到同一个后端应用程序服务器,请求的分发策略和ip_hash有点类似。在做性能调优时主要是适用对缓存命中进行调优,同一个资源(也就是同一个目标url地址)多次请求,可能会到达不同的后端应用程序服务器上会导致不必要的多次下载,使用url_hash后可以使得同一个目标url(也就是同一个资源请求)会到达同一台后端应用程序服务器,这样可以在服务端进行资源缓存再次收到请求后,就可以直接从缓存中读取了。示例配置如下:
upstream applicationServer {

    server 192.168.1.14;

server 192.168.1.15;

hash $request_uri;

}

1.2  Nginx进程数的配置优化

nginx服务启动后会包括两个重要的进程:

  •        master进程:可以控制Nginx服务的启动、停止 、重启、配置文件的重新加载。
  •         worker进程:处理用户请求信息,将收到的用户请求转发到后端应用服务器上。

worker进程的个数可以在配置文件nginx.conf中进行配置,如下所示。

worker_processes  1;  #  Nginx配置文件中worker_processes指令后面的数值代表了Nginx启动后worker进程的个数。

worker进程的数量一般建议等于CPU的核数或者CPU核数的两倍。通过执行lscpu命令可以获取到CPU的核数,如图所示。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

或者通过执行grep processor /proc/cpuinfo|wc –l 命令也可以直接获取到CPU的核数。

[root@localhost conf]#grep processor /proc/cpuinfo|wc -l

在配置完worker进程的数量后,还建议将每一个worker进程绑定到不同的CPU核上,这样可以避免出现CPU的争抢。将worker进程绑定到不同的CPU核时可以通过在nginx.conf中增加worker_cpu_affinity 配置,例如将worker进程分配到4核的CPU上,可以按照如下配置进行配置。

worker_processes    4;

worker_cpu_affinity 0001 0010 0100 1000;

1.3  Nginx事件处理模型的优化

为了性能得到最优处理,Nginx的连接处理机制在不同的操作系统中一般会采用不同的I/O事件模型,在Linux操作系统中一般使用epollI/O多路复用模型,在freebsd操作系统中使用kqueueI/O多路复用模型,在solaris操作系统中使用/dev/pool方式的I/O多路复用模型,在windows操作系统中使用的icop模型。在实际使用Nginx时,我们也是需要根据不同的操作系统来选择事件处理模型,很多事件模型都只能在对应的操作系统上得到支持。比如我们在Linux操作系统中,可以使用如下配置来使用epoll事件处理模型。

events {
worker_connections  1024;
use epoll;
}

关于I/O多路复用做个说明:在Nginx中可以配置让一个进程处理多个I/O事件和多个调用请求,这种处理方式就类似Redis中的单线程处理模式一样,Redis缓存读写处理时采用的虽然是单线程,但是性能和效率却是非常的高,这就是因为Redis采用了异步非阻塞I/O多路复用的策略导致资源的开销很小,不需要重复的去创建和释放资源,而是共用一个处理线程。Nginx中也同样采用异步非阻塞I/O策略,每个worker进程会同时启动一个固定的线程来利用epoll监听各种需要处理的事件,当有事件需要处理时会将事件注册到epoll模型中去进行处理,异步非阻塞I/O策略在处理时线程可以不用因为某个I/O的处理耗时很长而一直导致线程阻塞等待,线程可以不用等待响应,也不必等待响应,而是可以继续去处理其他的I/O事件。当I/O事件处理完成后,操作系统内核会通知I/O事件已经处理完成,这时线程才会去获取处理好的结果。

下面表列出了Nginx常用事件处理模型的详细介绍。

Nginx常用事件处理模型

1.4  Nginx客户端连接数的优化

在高并发的请求调用中,连接数有时候很容易成为性能的一个瓶颈,Nginx中可以通过如下方式来调整Nginx的连接数。

  •        配置Nginx单个进程允许的客户端最大连接数:可以通过修改Nginx的nginx.conf配置文件中的如下配置:
events        #可以设置Nginx的工作模式以及连接数上限
 {
   worker_connections 1024;
 }
  •          配置Nginx worker进程可以打开的最大文件数:可以通过修改Nginx的nginx.conf配置文件中的如下配置:
worker_processes  2;
worker_rlimit_nofile 2048;   # 设置worker进程可以打开的文件数
  • Linux内核的优化:Linux操作系统的/etc/sysctl.conf配置文件中可以重新配置很多Linux系统的内核参数  

1.5  Nginx中文件传输的优化

Nginx中文件传输一般需要优化的是如表中所示的几个参数。

Nginx文件传输需要优化的参数


 

nginx.conf配置文件中开启sendfile参数的方式配置示例如下:

sendfile on ;#默认情况下,sendfile是off。

  

nginx.conf配置文件中开启tcp_nopush参数的方式配置示例如下:

tcp_nopush on ;#默认情况下tcp_nopush是off

  

nginx.conf配置文件中开启tcp_nodelay参数的方式配置示例如下:

tcp_nodelay on;#默认情况下tcp_nodelay是on

1.6  Nginx中FastCGI配置的优化

FastCGI是在CGI基础上的优化升级,CGI是Web服务器与CGI程序间传输数据的一种标准,运行在服务器上的CGI程序按照这个协议标准提供了传输接口,具体介绍如下。

  •    CGI:CGI是英文common gateway interface的简写,翻译过来就是通用网关接口,这套接口描述了Web服务器与同一计算机上的软件的通信方式,有了CGI标准后集成了CGI的Web服务器就可以通过CGI接口调用服务器上各种动态语言实现的程序了,这些程序只要通过CGI标准提供对应的调用接口即可。CGI的处理的一般流程如图所示。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

  • l         FastCGI:FastCGI是一个传输快速可伸缩的用于HTTP服务器和动态脚本语言间通信的接口,它为所有Internet应用程序提供了高性能,而不受Web服务器API的限制。包括Apache、Nginx在内的大多数Web服务都支持FastCGI,同时FastCGI也被许多脚本语言(例如Python、PHP等)所支持。

Nginx本身并不支持对外部动态程序的直接调用或者解析,所有的外部编程语言编写的程序(比如PythonPHP)必须通过FastCGI接口才能调用。FastCGI相关参数说明如表所示。

FastCGI相关参数说明

1.7  Nginx的监控

Nginx自带了监控模块,但是需要在Nginx编译安装时指定安装监控模块,默认情况下是不会安装该监控模块的,需要指定的编译参数为--with-http_stub_status_module。

编译安装完成后,Nginx的配置文件nginx.conf中还是不会开启监控,需要在配置文件中增加如下配置,其中allow 192.168.1.102代表允许访问监控页面的ip地址,如图所示。

location = /nginx_status {
             stub_status on;
             access_log off;
             allow 192.168.1.102;
             deny all;
        }

  软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP 

修改完配置文件后,通过执行nginx –s reload来重新加载配置信息,然后通过访问http://nginx服务器ip地址:端口号/nginx_status 就可以进入监控页面了,如图示。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP 

从图中可以看到当前已经建立的连接数、服务器已经接收的请求数、请求的处理情况等监控信息。

2、Apache的性能分析和调优

在Web中间件中除了Nginx外另一个用的最多的中间件就是Apache了,Apache几乎可以运行在所有的操作系统中,支持HTTP、SSL、Socket、FastCGI、SSO、负载均衡、服务器代理等很多功能模块,在性能测试分析中如果对Apache使用不当,那么Apache有时候也可能会成为高并发访问的瓶颈。

2.1  Apache的工作模式选择和进程数调优

Apache的工作模式主要是指Apache在运行时内存分配、CPU、进程以及线程的使用管理和请求任务的调度等。Apache比较稳定的工作模式有prefork模式、worker模式、event模式,这三种模式也是Apache经常使用的模式。Apache默认使用的是prefork模式,一般可以在编译安装Apache时通过参数--with-mpm来指定安装后使用的工作模式。

可以通过执行httpd –V命令来查看Apache当前使用的工作模式,如图所示可以看到当前的工作模式为默认的prefork模式。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP 

1. prefork模式

prefork是Apache的默认工作模式,采用非线程型的预派生方式来处理请求,在工作时使用多进程,每个进程在同一个固定的时间只单独处理一个连接,这种方式效率高但由于是多进程的方式所以内存使用比较大。如图所示,可以看到prefork模式下启动了多个进程。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP 

prefork工作模式在收到请求后的处理过程如图所示,从图中可以看到处理过程是单进程和单线程的方式,由于不存在线程安全问题所以这种模式非常适合于没有线程安全库,需要避免线程安全性问题的系统。虽然解决了线程安全问题,但是也必然会导致无法处理高并发请求的场景,prefork模式会将请求放进队列中,一直等到有可用子进程请求才会被处理,也很容易导致请求队列积压。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

  

prefork工作模式主要的配置参数如表所示。

<IfModule mpm_prefork_module>
    StartServers             8
    MinSpareServers          8
    MaxSpareServers         10
    MaxRequestWorkers      512
    MaxConnectionsPerChild   1000
</IfModule>  

表 prefork工作模式主要的配置参数说明

2. worker模式

worker模式使用了多进程和多线程相结合的混合模式来处理请求,如图所示work模式下也是主进程会首先派生出一批子进程,但和prefork模式不同的是work模式下每个子进程会创建多个线程,每个请求会分配给一个不同的线程处理。work模式中处理请求时由于采用了多线程的处理方式,所以高并发下处理能力会更强,但是由于是多线程处理方式,所以这种模式下需要考虑线程安全问题。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

转载请注明出处:来源于博客园,作者:张永清 https://www.cnblogs.com/laoqing/p/14259788.html 

worker工作模式主要的配置参数如表所示。

<IfModule mpm_worker_module>
    StartServers             4
ServerLimit 20
    MinSpareThreads         65
    MaxSpareThreads        256
    ThreadsPerChild         30
    MaxRequestWorkers      410
    MaxConnectionsPerChild   1200
</IfModule>

表 worker工作模式主要的配置参数说明

 转载请注明出处:来源于博客园,作者:张永清 https://www.cnblogs.com/laoqing/p/14259788.html

3. event模式

event模式和worker工作模式有点类似,在event工作模式中会有一些专门的线程来承担管理和分配线程的工作,通过这种方式使event工作模式解决了HTTP请求 keep-alive长连接的时候占用线程资源被浪费的问题,因为会有一些专门的线程用来管理这些keep-alive类型的工作线程,当有真实请求过来的时候,将请求传递给服务器端可用的工作线程进行处理,处理完毕后又允许其释放资源。如图所示。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

  

event工作模式主要的配置参数如下:

<IfModule mpm_event_module>
StartServers 3
ServerLimit 16
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>

event工作模式的配置参数几乎与worker模式是一样的,因为event模式本身就是对worker模式的一种升级改进。

2.2  Apache的mod选择和优化

未完待续,更多内容软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP  

备注:作者的原创文章,转载须注明出处。原创文章归作者所有,欢迎转载,但是保留版权。对于转载了博主的原创文章,不标注出处的,作者将依法追究版权,请尊重作者的成果。

关于软件性能分析调优,可以加微信号yq597365581或者微信号hqh345932,进入专业的性能分析调优群进行交流沟通。

软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结-LMLPHP

01-11 09:43