lchl0388 发表于 2018-11-18 11:49:25

Apache优化配置——工作模式

  Apache所运行的硬件环境都是对性能影响最大的因素

  各个硬件指标中,对性能影响最大的是内存,其次是硬盘的速度
  ●Apache的工作模式
  1、prefork模式(一个 非线程型的)
  ⑴、主要工作方式:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求,这样客户端的请求就不需要在接收后等候子进程的产生。
  ⑵prefork在效率上要比worker要高,但是内存使用大多不擅长处理高并发的场景
  ⑶Apache在prefork工作模式下影响性能的重要参数说明:
  #prefork MPM
  
        StartServers    5      #Apache启动时默认开始的子进程数

        MinSpareServers    5      #最小的闲置子进程数

        MaxSpareServers    10      #最大的闲置子进程数,

        MaxRequestWorkers    250      #MaxRequestWorkers设置了允许同时最大接入的请求数量,任何超过MaxRequestWorkers限制的请求将进入等候队列
        MaxConnectionsPerChild    500      #设置的是每个子进程可处理的请求数。每个进程在处理了“MaxConnectionsPerChild”请求后将自动销毁。0意味着无限,即子进程永不销毁。设置为1时可防止意外的内存泄漏。设置为2时表示在服务器负载下降的时候会自动减少子进程数。可根据服务器的负载来调整此值

  ★注:
  ①MaxRequestWorkers是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。如果请求总数已经达到这个值(通过ps -ef | grep http | wc -l来确认)那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而http访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为以MB为单位的最大物理内存/2,然后根据负载情况进行动态调整。
  ②prefork控制进程在最初建立“StartServers”子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个......如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止,这种模式可以不必再请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会kill掉一些多余的进程,这个值不要设的过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
  ③ServerLimit和MaxClients(MaxRequestWorkers)的区别:在Apache时代,控制最大进程数只有MaxClients这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于Apache1时代的服务器硬件是限制的。但是Apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以ServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值不要小于Maxclients。
  ④查看Apache加载的模块:apachectl -t -D DUMP_MODULES 或 apachectl -M 或 apachectl -l
      查看Apache的工作模式:httpd -v 或 httpd -l

  ⑤修改prefork参数和启动prefork模式
     vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf

      vi /usr/local/http-2.4.23/conf/httpd.conf 添加两行:LoadModule mpm_prefork_module/mod_mpm_prefork.so 和 Include conf/extra/httpd-mpm.conf
      重启httpd服务

  2、Worker模式(多线程多进程)
  ⑴与prefork的比较:prefork速度要稍高于worker,然而它需要的CPU和memory资源也稍多于worker
  ⑵Apache在worker工作模式下影响性能的重要参数说明
  #worker MPM
  
      StartServers    3      #Apache启动时默认开始的子进程数

      MinSpareThreads    75      #最小空闲数量的工作进程

      MaxSpareThreads    250      #最大空闲数量的工作线程
      ThreadPerChild    25      #每个子进程产生的线程数量

      MaxRequestWorkers    400      #MaxRequestWorkers设置了允许同时最大接入的请求数量,任何超过MaxRequestWorkers限制的请求将进入等候队列
      MaxConnectionsPerChild    0      #设置的是每个子进程可处理的请求数。每个进程在处理了“MaxConnectionsPerChild”请求后将自动销毁。0意味着无限,即子进程永不销毁。
  ★注:
  ①Worker由主控制进程生成“StartServers”子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数。而MaxRequestWorkers设置了同时连入的clients最大总数,如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250.这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节
  ② ThreadsPerChild是worker MPM 中与性能相关最密切的指令,ThreadsPerChild的最大缺省值是64,如果负载较大,64位也是不够的,这时要使用ThreadLimit指令,他的最大缺省值是20000
  ③Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显示声明ServerLimit。需要注意的是,如果显示声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值。
  ④进程与线程的区别(线程是指进程内的一个执行单元,也是进程内的可调度实体)

  a、地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间
  b、资源拥有:进程是资源分配和拥有的单位,同一进程内的线程共享进程的资源
  c、线程是处理器调度的基本单位,但进程不是
  d、二者均可并发执行:进程和线程都是由操作 系统所体会的程序运行的基本单元, 系统利用该基本单元实现系统对应用的并发性
  e、简单来说,就是一个程序至少有一个进程,一个进程至少有一个线程
      线程的划分尺度小于进程,使得多线程程序的并发性高

      进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

  3、Event模式
  这是Apache最新的工作模式,是worker模式的变种,它把服务进程从连接中分离出来,worker模式不同的是在于它解决了,keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支持https的访问

  




页: [1]
查看完整版本: Apache优化配置——工作模式