135956557-小三IT自学群,任何IT问题都可以一起讨论,各种服务网络等等

-------------------------------------------------------------------------------
 Apache的优化配置
 Apache所运行的环境,硬件性能,等都是影响性能的因素,如果不能对硬件升级,最好就让Apache独立在单台主机,避免干扰.
相对来说CPU  内存  硬盘读取IO会是Apache性能瓶颈
 Apache工作模式
各种脚本都在conf/ extra中

apachectl -M 查看使用的所有模块
                    -V查看工作模式状态
-------------------------------------------------------------------------------------------------------------------
 1,prefork模式
mpm_prefork会预先创建多个进程,默认五个
每个进程只有一个线程,当收到客户端请求后,mpm_prefork模块会自动交给子进程处理,每个子进程同时只能处理一个请求.当请求过多,会继续创建新的进程,prefork不适合在高并发的场景,因为独立线程太占用资源,但是效率高,单个线程出现问题不会影响到其他.
prefork参数

    StartServers             5
启动默认开启的子进程 

    MinSpareServers          5
最小闲置进程 

    MaxSpareServers         10
最大闲置进程 
serverlimit 20000
想增加大于256并发连接数,需要写这个 

    MaxRequestWorkers      250
最大并发链接,Apache2.3之前是maxclients 

    MaxConnectionsPerChild   0
每个子进程可处理的数量,到了以后自动销毁,0表示永不销毁
这个设置了可以释放一些资源,长期占用不怎么好看情况选择 


 
注1:MaxRequestWorkers是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。

注2:prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。  

注3:ServerLimit和MaxClients(MaxRequestWorkers)有什么区别呢?

是因为在apache1时代,控制最大进程数只有MaxClients这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于apache1时代的服务器硬件限制的。但是apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。
修改Apache的工作模式启用prefork 
 首先在hhtpd.conf文件中启用prefork模块然后在最下面写两行
 
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Include conf/extra/httpd-mpm.conf
----------------------------------------------------------------
 2:worker模式
对比prefork,worker使用了多线程和多进程的混合模式,worker也会预先生成一些子进程,然后子进程生成线程 ,包括一个监听简称,请求会分配到其他线程上.会内存占用资源消耗会好一点,对高并发的场景有很好的表现,但是只要一个线程有问题  会影响通一个进程中的其他线程.
worker配置参数
 

    StartServers             3
启动默认进程 

    MinSpareThreads         75
最小的工作线程 

    MaxSpareThreads        250
最大工作线程 

    ThreadsPerChild         25
每个进程生成的线程数 

    MaxRequestWorkers      400
并发量 

    MaxConnectionsPerChild   0
多少次后注销0表示永久 


 
注1:Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;

而MaxRequestWorkers 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程 

MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节 。

注2:ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。 

注3:Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也需要显式声明ServerLimit(系统配置的最大进程数量,最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

注4:进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

(4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

线程的划分尺度小于进程,使得多线程程序的并发性高。 

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 
启动worker模式只需要更改最后两行为worker然后启动worker模块
---------------------------------------------------------------------------- 
event模式
Apache最新的工作室模式,是worker模式的变种,服务进程从连接中分离,解决了worker  keep-alive长连接占用线程资源的问题,但是不能很好地支持https的访问
apache参数
 
1)KeepAlive On/Off

  KeepAlive指的是保持连接活跃,换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为On。

2)KeepAliveTimeOut number

  如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5秒。

3)MaxKeepAliveRequests 100

  一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

4)HostnameLookups on|off|double

如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。

如果为了安全,建议使用double;为了加快访问速度,建议使用off。

域名查找开启这个会增加apache的负担, 减慢访问速度建议关闭

5)timeout 5

推荐5 这个是 apache接受请求或者发出相应的时间超过这个时间 断开

注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf设置并在httpd.conf文件中通过include选项引用

MPM这个比较关键是影响并发效率的主要因素

1)StartServers        10

  设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数。

2)MinSpareServers     10

  设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

3)MaxSpareThreads     75

  设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。

4)ServerLimit       2000

  服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。

5)MaxClients/ MaxRequestWorkers         256

  用于客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。

6)MaxRequestsPerChild / MaxConnectionsPerChild  0

  设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100。所以一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试。

注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf设置并在httpd.conf文件中通过include选项引用