【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧

image.png

本文分享至飞腾开发者平台《基于飞腾腾云S2500的Apache部署及调优指南》

1 软件介绍

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/
Python等解释器编译到服务器中。

Apache源于NCSA httpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache Web服务器拥有以下特性:

1)支持最新的HTTP/1.1通信协议

2)拥有简单而强有力的基于文件的配置过程

3)支持通用网关接口

4)支持基于IP和基于域名的虚拟主机

5)支持多种方式的HTTP认证

6)集成Perl处理模块

7)集成代理服务器模块

8)支持实时监视服务器状态和定制服务器日志

9)支持服务器端包含指令(SSI)

10)支持安全Socket层(SSL)

11)提供用户会话过程的跟踪

12)支持FastCGI

13)通过第三方模块可以支持JavaServlets

(引用自https://baike.baidu.com/item/Apache/6265?fr=aladdin)

2 环境要求

2.1 硬件配置

用途型号
网络服务器飞腾腾云S2500处理器服务器
客户端飞腾腾云S2500处理器服务器

2.2 软件版本

软件名对应版本
httpd2.4.49
LuaJIT2.1
apr1.7.0
apr-util1.6.1
pcre8.45

3 应用部署

下面将详细介绍Web应用Apache的搭建步骤,并对其性能进行验证,主要包括如下步骤:

第一步,获取源码;

第二步,编译安装apr;

第三步,编译安装apr-util;

第四步,编译安装pcre;

第五步,编译安装httpd;

第六步,配置httpd端口;

第七步,运行验证。在运行验证时,通过网络服务器启动Apache服务,在客户端使用ab工具进行性能测试,一般地,模拟200用户共同发起20万次网络请求,之后,获取TPS(Requests per second)值。需要注意的是,网络服务器和客户端都需要部署Apache环境。

4 应用调优

4.1 调优目的

通过调整Apache配置文件来有效地提高Web应用性能。

4.2 调优方法

4.2.1 物理绑核

使用taskset对apache进程进行绑核,防止进程跨路;操作如下:

 taskset -c 0-63 /usr/local/httpd-2.4.49/bin/apachectl start 

4.2.2 优化httpd.conf

修改配置文件httpd.conf内容,主要包括:

1、启动压缩;

2、启用重写;

3、提供文件描述符缓存支持;

4、启用基于URL键的内容动态缓冲(内存或磁盘);

5、启用基于磁盘的缓冲管理器;

6、基于内存的缓冲管理器;

7、屏蔽所有不必要的模块;

8、启动静态文件缓存;

9、允许apache修改或清除传递到cgi或ssi页面的环境变量;

10、禁止根据客户端请求头字段设置环境变量;

11、禁止生成描述服务器状态的页面;

12、启用过滤(使用缓存必须启用过滤模块)。

4.2.3 配置mpm模式

Apache提供了多处理模块(MPM),用来绑定到网络端口上,接受请求以及调度子进程处理请求。

模块名说明
Prefork在启动时会预派生多个子进程,每个子进程只有一个线程。不需要担心线程安全问题,但是每个进程都占用系统资源,在处理高并发请求的场景中,会消耗大量的系统资源。
Worker每个子进程能生成更多的线程,每个线程都能处理请求。减少了子进程数以及内存使用量,提升了服务器的并发能力,但安全性低,不能与不是线程安全的模块一起使用。
Event基于Worker模块,但它解决了 keep-alive 场景下,长期被占用的线程的资源浪费问题。Event模块会有一个专门的线程管理keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样一个线程就能处理几个请求,实现异步非阻塞。

MPM模块的加载方式是在httpd.conf中添加下列内容(三者任选其一):

LoadModule mpm_event_module modules/mod_mpm_event.so 

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

如果需要调整MPM模块进程细节,则需要在httpd.conf中启用MPM模块配置文件:

Include conf/extra/httpd-mpm.conf

详细的MPM模块配置文件是httpd-mpm.conf,文件中包含以下内容:

Prefork MPM模块

默认配置:

<IfModule mpm_prefork_module>   
    StartServers            5   
    MinSpareServers         5   
    MaxSpareServers         10   
    MaxRequestWorkers       250   
    MaxConnectionsPerChild  0 
</IfModule> 

其中StartServers代表初始化预派生的子进程数,MinSpareServers代表最小空闲子进程数,MaxSpareServers代表最大空闲子进程数,MaxRequestWorker代表最大请求数(因为在Prefork MPM模块中一个请求数对应一个子进程,故也可以理解为最大派生子进程数),MaxConnectionsPerChild代表每个进程可处理的请求数(达到目标值后该进程将被杀死,0代表没有限制)。

Worker MPM模块

加载方式为在httpd.conf中添加下列内容:

LoadModule mpm_worker_module modules/mod_mpm_worker.so

默认配置:

<IfModule mpm_worker_module>   
    StartServers        3   
    MinSpareThreads     75   
    MaxSpareThreads    250   
    ThreadsPerChild      25   
    MaxRequestWorkers   400   
    MaxConnectionsPerChild  0 
</IfModule>

其中StartServer代表初始化预派生的子进程数,另外可以使用ServerLimit来指定最大进程数(默认为16)。MinSpareThr eads代表最小空闲线程数,MaxSpareThreads代表最大空闲线程数,ThreadsPerChild代表每个子进程可创建的线程数,MaxRequestWorkers代表最大请求数(因为在Worker MPM模块中,一个请求数对应一个线程,故也可以理解为最大线程数。理论上,最大线程数不能超过最大进程数与每个进程可创建的线程数的乘积),MaxConnectionsPerChild代表每个进程可处理的请求数(达到目标值后该进程将被杀死,0代表没有限制)。

Event MPM模块

加载方式为在httpd.conf中添加下列内容:

LoadModule mpm_event_module modules/mod_mpm_event.so

默认配置:

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

参数作用与Worker MPM模块一致。

4.3 调优示例

示例环境为一台飞腾腾云S2500处理器服务器与一台英特尔X86服务器,Apache同时部署在两台服务器上,飞腾腾云S2500处理器服务器作为Apache服务器,X86服务器作为客户端模拟200用户发起20万次网络请求,模拟100次后取TPS算平均值。由于Event是明显优于Worker的,所以优先选择Event模式,其初始配置如下:

初始进程数:3
最大进程数:16
最小空闲线程数:75
最大空闲线程数:400
每进程可创建线程数:25
最大线程数:400

下表中的调优记录均为Event模式下测出,且都基于上述配置进行修改。

序号吞吐量调优措施
162722初始配置
257165最大进程数:16-\>8,最大线程数:400-\>200
330372最大进程数:16-\>4,最大线程数:400-\>100
461362最大进程数:16-\>24,最大线程数:400-\>600
564477最大进程数:16-\>40,每进程可创建线程数:25-\>10
658884最大进程数:16-\>10,每进程可创建线程数:25-\>40
763783最大进程数:16-\>80,每进程可创建线程数:25-\>5
898785绑核0-63

二次测试以确认调优效果(测试前充分预热可让数值整体提升,预热操作为用ab压测十次)。

序号吞吐量调优措施
166403初始配置
266818最大进程数:16-\>24,最大线程数:400-\>600
369565最大进程数:16-\>40,每进程可创建线程数:25-\>10
465990最大进程数:16-\>10,每进程可创建线程数:25-\>40
568302最大进程数:16-\>80,每进程可创建线程数:25-\>5
6103228绑核0-63

由上表可知,通过绑核以及调整进程数与线程数的搭配可以提升Apache的性能。在飞腾腾云S2500处理器服务器上,通过设置最大进程数为40,每进程可创建线程数为10且将apache进程绑核0-63可达到最佳性能。

5 常见问题

1)apr-util编译报错

如果报错内容如下图所示:

image.png

则通过安装expat-devel包可以解决。

2)修改Apache配置后不生效

部分Apache配置修改后需要关闭Apache服务再启动,直接重启服务不生效。

# /usr/local/httpd-2.4.49/bin/apachectl stop && sleep 4 && /usr/local/httpd-2.4.49/bin/apachectl start 

6 附录

6.1 示例脚本

预热:

# for i in {1..10};do ab -c 200 -n 200000 -k http://10.31.72.37:80/index.html;sleep 2;done

压测:

# rm -f ave.log;for l in {1..20};do rm -f tmp.log;for i in {1..5};do ab -c 200 -n 200000 -k http://10.31.72.37:80/index.html\|grep "Requests per second" \>\> tmp.log;sleep 1;done ;cat tmp.log\|awk -F" " 'BEGIN{sum=0} {sum=sum+\$4} END{print sum/5}' \>\> ave.log;done;cat ave.log \|awk 'BEGIN{sum=0} {sum=sum+\$1} END{print sum/20}'


欢迎广大开发者来飞腾开发者平台获取更多前沿技术文档及资料

如开发者在使用飞腾产品有任何问题可通过在线工单联系我们



版权所有。飞腾信息技术有限公司 2023。保留所有权利。

未经本公司同意,任何单位、公司或个人不得擅自复制,翻译,摘抄本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。

商标声明

Phytium和其他飞腾商标均为飞腾信息技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。

本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。


飞腾开发者
6 声望3 粉丝

飞腾开发者技术小助手,定期分享飞腾技术文档,助力开发者打怪升级。更多材料获取:[链接]