查看apache工作模式 $ apachectl -V
(注:apachectl可理解为apache control,其实是一段bash脚本)
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2018-06-07T19:43:03
Server's Module Magic Number: 20120211:52
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
...
Server MPM 即为当前apache的工作模式(MPM:Multi-Processing Module,多路处理模块)
各工作模式的区别
- prefork 中没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。
- worker 是多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。与prefork相比,worker模式更节省系统的内存资源。不过,需要注意worker模式下的Apache与php等程序模块的兼容性。
- event 是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载。
prefork和worker模式的比较prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。
prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。
但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
prefork模式(apache默认)及worker模式 配置参数
# 配置路径 /etc/apache2/mods-available/mpm_prefork.conf
# 默认配置如下
<IfModule mpm_prefork_module>
#ServerLimit 256
StartServers 5 #推荐设置:小=默认 中=20~50 大=50~100
MinSpareServers 5 #推荐设置:与StartServers保持一致
MaxSpareServers 10 #推荐设置:小=20 中=30~80 大=80~120
MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~500000
</IfModule>
# ServerLimit: 服务器最大进程限制数(Apache默认256),该数值应大于等于MaxRequestWorkers,否则MaxRequestWorkers无法设置
# StartServers: 默认开始的服务器进程数
# MinSpareServers: 最小的空闲进程数
# MaxSpareServers: 最大的空闲进程数
# MaxRequestWorkers: 最大数量的服务器进程数,2.3.13之前叫MaxClients ,最重要的一个参数
# MaxConnectionsPerChild: 最大连接数的一个服务器进程服务
- ServerLimit,取决于你系统的资源,每个apache进程默认占用20M内存,基本可以按照这个公式来计算:最大内存*80%/2M=ServerLimit
- MaxRequestWorkers,一般apache线程数不会超过100,为什么?内存为2G的,100个线程就近2G了。
注:调到这就是极限了,要是网站访问还是大,哪就要增加apache服务器了如果网站的pv值 百万 ServerLimit 2500 *# 用于修改apache编程参数 MaxClients 2000 *# 最大并发数
- MinSpareServers,如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。
在一台压力大(并发访问2800)的服务器上,MaxSpareServers这个值设置的是200
- MaxRequestsPerChild,指令设置每个子进程在其生存期内允许伺服的最大请求数量。完成了指定的请求数后,会自动结束。好处:可防止偶然的内存泄露。若为0,可服务无限次。另外,kepalive连接,只计一个数
- Keep-Alive 默认:ON
- MaxKeepAliveRequests 默认:100,到该请求数后,将关闭该keepalive
- KeepAliveTimeout 默认:5 ,到达该时间后,将关闭keepalive
- TimeOut 默认:300 ,
worker模式
Worker MPM支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
<IfModule mpm_worker_module>
StartServers 2 #推荐设置:小=默认 中=3~5 大=5~10
MaxClients 150 #推荐设置:小=500 中=500~1500 大型=1500~3000
MinSpareThreads 25 #推荐设置:小=默认 中=50~100 大=100~200
MaxSpareThreads 75 #推荐设置:小=默认 中=80~160 大=200~400
ThreadsPerChild 25 #推荐设置:小=默认 中=50~100 大型=100~200
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=10000~50000
(此外,如果MaxClients/ThreadsPerChild大于16,还需额外设置ServerLimit参数,ServerLimit必须大于等于 MaxClients/ThreadsPerChild 的值。)
</IfModule>
StartServers 3 //apache已启动马上创建3个httpd进程(ps aux可以看到)
MaxClients 2000 //同一时间最大接受2000个请求(其实就是2000个线程)
ServerLimit 25 //apache最大能启动25个进程。
MinSpareThreads 50 //apache至少要有50个空闲线程,用来等待接下来的请求,不满则由进程创建线程
MaxSpareThreads 200 //apache最多能有200个线程,超出了200个线程,则杀死多余的线程
ThreadLimit 200 //限制一个进程最多只能创建200个线程
ThreadsPerChild 100 //设定一个进程固定创建100个线程
MaxRequestsPerChild 10000 //设定当一个进程一共接受过10000此请求之后被杀死。以释放内存。
将apache设为worker模式是需要在编译apache时配置参数
监控当前apache线程总数: watch -n 1 -d "pgrep apache|wc -l"
计算当前apahce平均内存占用大小 ps aux|grep -v grep|awk '/apache2/{sum+=$6;n++};END{print sum/n}'
(注意:可通过调整$6,$4,$3查看内存\CPU使用百分比,或修改输出公式为num,查看总量)
自带测试工具 ab -n 1000 -c 10 127.0.0.1/index.php
- 升级 Apache 到最新版本,新版本往往包含性能提升和安全更新。
- 在 httpd.conf 中设置 "HostNameLookups off" 能避免针对每个访问者的 DNS 域名的反向查询。
- 对于繁忙的网站,在 httpd.conf 中设置 "MaxClients 230" 或者更高。这项设置让更多的 httpd 进程同时响应请求,并避免了处理器排队的情况发生。
- 采用另外一台服务器处理图片文件。
- 缺保您的 Web 页面和 CGI 页面采用了浏览器缓冲技术。具体的文章可以参考本站:采用 mod_gzip 加速 Zope 和 Apache
- 保持您的 Apache 苗条,编译那些仅仅需要的模块,在编译之前,修改 src/Configuration 文件,在那些不需要的模块之前用 # 号注释掉。
- 如果不需要流量日志,那么把 httpd.conf 中的 TransferLog 指向到 /dev/null/
- 除非你确定使用 .htaccess 文件来控制一些目录的权限,否则设置 "AllowOverride None" ,这样就免去 Apache 在每个目录搜索 .htaccess 文件的劳役之苦。
- 不要让不需要的后台进程运行。
- 千万不要把页面或者日志文件写到网络磁盘上,例如 NFS。
- 不要让 Apache (httpd) 运行于 inetd 模式。
- 不要让 X Windows 运行在你的 Web 服务器上,用 Ctrl-Alt-Backspace 关闭 X 。
- 避免使用 SSI tag。
- 在 CGI 脚本中: ** 文件 I/O:打开的文件数目越少越好。 ** Shell 命令:采用全路径来调用 shell 命令。 ** 如果你的网站主要以 CGI 来驱动,那么请使用 mod_perl。 ** 在你的 Web 页面目录中,不要让文件数超过 1000 个,文件越多花费在定位上的时间也越多。
- 在 Web 服务器上的图片越少越好,保证每个图片都经由图片压缩器运行。
- 对你的网站做压力测试,建议采用 Apache 自带的 ab 命令来测试。
- 为了最好的性能,最好把网线拔掉,这样你的 Web 服务器就十分安全,而且负载马上降为 0。
来源:https://wiki.absoft.cn/s/7da4789901.html