【写在前面】飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适配认证四大板块,旨在共享尖端技术,为开发者提供一个涵盖多领域的开发平台和工具套件。点击这里开始你的技术升级之旅吧
本文分享至飞腾开发者平台《基于飞腾腾云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 软件版本
软件名 | 对应版本 |
---|---|
httpd | 2.4.49 |
LuaJIT | 2.1 |
apr | 1.7.0 |
apr-util | 1.6.1 |
pcre | 8.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模式下测出,且都基于上述配置进行修改。
序号 | 吞吐量 | 调优措施 |
---|---|---|
1 | 62722 | 初始配置 |
2 | 57165 | 最大进程数:16-\>8,最大线程数:400-\>200 |
3 | 30372 | 最大进程数:16-\>4,最大线程数:400-\>100 |
4 | 61362 | 最大进程数:16-\>24,最大线程数:400-\>600 |
5 | 64477 | 最大进程数:16-\>40,每进程可创建线程数:25-\>10 |
6 | 58884 | 最大进程数:16-\>10,每进程可创建线程数:25-\>40 |
7 | 63783 | 最大进程数:16-\>80,每进程可创建线程数:25-\>5 |
8 | 98785 | 绑核0-63 |
二次测试以确认调优效果(测试前充分预热可让数值整体提升,预热操作为用ab压测十次)。
序号 | 吞吐量 | 调优措施 |
---|---|---|
1 | 66403 | 初始配置 |
2 | 66818 | 最大进程数:16-\>24,最大线程数:400-\>600 |
3 | 69565 | 最大进程数:16-\>40,每进程可创建线程数:25-\>10 |
4 | 65990 | 最大进程数:16-\>10,每进程可创建线程数:25-\>40 |
5 | 68302 | 最大进程数:16-\>80,每进程可创建线程数:25-\>5 |
6 | 103228 | 绑核0-63 |
由上表可知,通过绑核以及调整进程数与线程数的搭配可以提升Apache的性能。在飞腾腾云S2500处理器服务器上,通过设置最大进程数为40,每进程可创建线程数为10且将apache进程绑核0-63可达到最佳性能。
5 常见问题
1)apr-util编译报错
如果报错内容如下图所示:
则通过安装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和其他飞腾商标均为飞腾信息技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
本文档的内容视为飞腾的保密信息,您应当严格遵守保密任务;未经飞腾事先书面同意,您不得向任何第三方披露本文档内容或提供给任何第三方使用。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,飞腾在现有技术的基础上尽最大努力提供相应的介绍及操作指引,但飞腾在此明确声明对本文档内容的准确性、完整性、适用性、可靠性的等不作任何明示或暗示的保证。
本文档中所有内容,包括但不限于图片、架构设计、页面布局、文字描述,均由飞腾和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权等。非经飞腾和/或其关联公司书面同意,任何人不得擅自使用、修改,复制上述内容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。