zoukankan      html  css  js  c++  java
  • apache 工作模式

    为什么会有工作模式?

    更高效率的支持不同的平台;能更好的为有特殊要求的站点定制。

    例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 workerevent; 需要可靠性或者与旧软件兼容的站点可以使用 prefork

    有几种工作模式?

    perfork
    [默认]
    多个子进程方式处理每个请求。
    [预派生][占内存大]适合于没有线程安全库,需要避免线程兼容性问题的系统。
    用单独的子进程来处理不同的请求,进程之间是彼此独立的,最稳定的MPM之一。
    worker
    [--with-mpm-worker]
    多进程多线程来进行处理请求
    多线程:处理海量请求,系统资源的开销小[高流量http服务器];多进程:稳定性
    每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
    event 把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。
    NetWare NetWare
    OS/2 OS/2
    WinNT Windows

    查看工作模式 httpd –l 、apachectl -l
    [root@centos1 bin]#Compiled in modules:
      core.c
      mod_so.c
      http_core.c
      worker.c     # 显示哪个就是哪种模式,现在为worker的工作模式

    参数解释

    # prefork MPM

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

    perfork模式:使用单独的子进程来处理每个请求
    # StartServers: 服务启动时建立的server进程数
    # MinSpareServers: 空闲server进程的最小数
    # MaxSpareServers: 空闲server进程的最大数
    # MaxRequestWorkers: 允许启动的最大server进程数
    # MaxConnectionsPerChild: 每个server进程在生存期允许伺服的最大请求数

    prefork控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止[预派生]。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。

    _CC______............K...C...C.WK...K.........................C.
    ...K............................................................
    ................................................................
    ................................................................      256个

    Scoreboard Key:
    "_" Waiting for Connection, "S" Starting up, "R" Reading Request,
    "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
    "C" Closing connection, "L" Logging, "G" Gracefully finishing,
    "I" Idle cleanup of worker, "." Open slot with no current process

    Srv :Child Server number - generation

    PID:OS process ID

    Acc:Number of accesses this connection / this child / this slot

    M:Mode of operation

    CPU:CPU usage, number of seconds

    SS:Seconds since beginning of most recent request

    Req:Milliseconds required to process most recent request

    Conn:Kilobytes transferred this connection

    Child:Megabytes transferred this child

    Slot:Total megabytes transferred this slot

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

    # worker MPM
    # StartServers: 服务启动时建立的server进程数
    # MinSpareThreads: 空闲的工作线程最小数
    # MaxSpareThreads: 空闲的工作线程最大数
    # ThreadsPerChild: 每个进程可建立的工作线程数
    # MaxRequestWorkers: 最大的工作线程数 ps -ef|grep http|wc -l
    # MaxConnectionsPerChild:每个sever进程生存期允许伺服的最大请求数

    Worker由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxRequestWorkers设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。如果MinSpareThreads、MaxSpareThreads相等,MaxSpareThreads为MinSpareThreads+1。MinSpareThreads为主。

    prefork、worker模式切换

    先在 /usr/sbin 下进行:mv httpd httpd.prefork
                                     mv httpd.worker httpd
    然后在 apache2 下,/usr/local/apache2/conf   下的  httpd.conf 增加

    <IfModule mpm_worker_module>
        StartServers          2
        MaxClients          150
        MinSpareThreads      30
        MaxSpareThreads      70
        ThreadsPerChild      30
        MaxRequestsPerChild   0
    </IfModule>

    然后在  /usr/local/apache2/bin   下 执行:httpd –l

    查看 server-status,起进程 一个进程下是30个线程。

    StartServers          2
        MaxClients          150
        MinSpareThreads      25
        MaxSpareThreads      75
        ThreadsPerChild      25
        MaxRequestsPerChild   0

    M requests currently being processed, N idle workers

    ##2*25, M+N=50

    StartServers          3
      MaxClients          150
      MinSpareThreads      75
      MaxSpareThreads      75
      ThreadsPerChild      30
      MaxRequestsPerChild   0

    ##90

      StartServers          3
      MaxClients          150
      MinSpareThreads      75
      MaxSpareThreads      75
      ThreadsPerChild      30
      MaxRequestsPerChild   0

    ##

    StartServers          2
        MaxClients          150
        MinSpareThreads      60
        MaxSpareThreads      120
        ThreadsPerChild      30
        MaxRequestsPerChild   0

    2* 30:1busy 59个空闲

    minsparethreads为60不够,现在为59个线程。要加个进程,有30个线程 所以后来变成了 90!

    ##

    StartServers          4
        MaxClients          150
        MinSpareThreads      60
        MaxSpareThreads      90
        ThreadsPerChild      30
        MaxRequestsPerChild   0

    4*30=120

    最小的为min60够了

    最大的 为max空闲为90,就把多的线程程杀掉【杀进程】(ThreadsPerChild整数倍 )

  • 相关阅读:
    系统并发报too much open files 错误
    plsql 安装Some Oracle Net versions cannot connect from a path with parentheses
    mysql登录报错
    web.xml配置文件详解之一servlet配置
    hibernate createQuery查询传递参数的两种方式
    mysql登录连接远程数据库命令行
    java 项目打包部署 过程
    flex ArrayCollection的新增与删除的同步
    加大eclipse以及jvm的内存
    2017 八月 UFED Series Releases 系列 6.3 重大更新发布
  • 原文地址:https://www.cnblogs.com/stay-sober/p/4211122.html
Copyright © 2011-2022 走看看