zoukankan      html  css  js  c++  java
  • Apache优化:修改最大并发连接数(ThreadsPerChild的值)

    Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting.

    当Apache的安装目录/logs下的error-2017-06-28.log文件中,出现以上日志说明时,说明Apache需要进行优化了,修改Apache的最大并发连接数。

    Apache是一个跨平台的web服务器,由于其简单高效、稳定安全的特性,被广泛应用于计算机技术的各个领域。现在,Apache凭借其庞大的用户数,已成为用户数排名第一的web服务器。

    众所周知,Apache是一个跨平台的、采用模块化设计的服务器。为了应对不同的平台和不同的环境产生的各种不同的需求,也为了在具体的平台或环境下达到最佳的效果,Apache在web服务器的基础功能方面(端口绑定、接收请求等)也同样采用了模块化设计,这个Apache的核心模块就叫做多路处理模块(Multi-Processing Module,简称MPM)。

    Apache针对不同的操作系统提供了多个不同的MPM模块,例如:mpm_beosmpm_eventmpm_netwarempmt_os2mpm_preforkmpm_winntmpm_worker。如果条件允许,我们可以根据实际需求将指定的MPM模块编译进我们自己的Apache中(Apache的源码是开放的,允许用户自行编译)。不过,如果在编译时我们没有选择,Apache将按照如下表格根据不同的操作系统自行选择对应的MPM模块,这也是Apache针对不同平台推荐使用的MPM模块。

    不同操作系统上默认的MPM模块
    操作系统MPM模块描述
    Windows mpm_winnt 不用介绍了吧:)
    Unix/Linux mpm_prefork 不用介绍了吧:)
    BeOS mpm_beos 由Be公司开发的一种多媒体操作系统,官方版已停止更新。
    Netware mpm_netware 由NOVELL公司推出的一种网络操作系统
    OS/2 mpmt_os2 一种最初由微软和IBM共同开发的操作系统,现由IBM单独开发(微软放弃OS/2,转而开发Windows)

    mpm_winnt模块

    mpm_winnt模块是专门针对Windows操作系统而优化设计的MPM模块。它只创建一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。

    修改MPM模块配置(方法一)

    在对Apache的MPM模块具备一定了解后,我们就可以针对不同的MPM模块来修改Apache最大并发连接数配置了。

    1.启用MPM模块配置文件

    Apace安装目录/conf/extra目录中有一个名为httpd-mpm.conf的配置文件。该文件主要用于进行MPM模块的相关配置。不过,在默认情况下,Apache的MPM模块配置文件并没有启用。因此,我们需要在httpd.conf文件中启用该配置文件,如下所示:

    # Server-pool management (MPM specific)
    Include conf/extra/httpd-mpm.conf (去掉该行前面的注释符号"#")

    2.修改MPM模块配置文件中的相关配置

    在启动MPM模块配置文件后,我们就可以使用文本编辑器打开该配置文件,我们可以看到,在该配置文件中有许多<IfModule>配置节点,如下图所示:

    只有Apache使用对应MPM模块时,对应配置才会生效

    此时,我们就需要根据当前Apache服务器所使用的MPM模块,来修改对应<IfModule>节点下的参数配置。首先,我们来看看mpm_winnt模块下的默认配置:

    #由于mpm_winnt模块只会创建1个子进程,因此这里对单个子进程的参数设置就相当于对整个Apache的参数设置。
    
    <IfModule mpm_winnt_module>
    ThreadsPerChild      150 #推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500
    MaxRequestsPerChild    0 #推荐设置:小=10000 中或大=20000~100000
    </IfModule>

    对应的配置参数作用如下:

    ThreadsPerChild
    每个子进程的最大并发线程数。
    MaxRequestsPerChild
    每个子进程允许处理的请求总数。如果累计处理的请求数超过该值,该子进程将会结束(然后根据需要确定是否创建新的子进程),该值设为0表示不限制请求总数(子进程永不结束)。

    该参数建议设为非零的值,可以带来以下两个好处:

    1. 可以防止程序中可能存在的内存泄漏无限进行下去,从而耗尽内存。
    2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

    修改MPM模块配置(方法二)

    直接在Apace安装目录/conf/httpd.conf 文件中,最下面加上

    <IfModule mpm_winnt_module>
    ThreadsPerChild 512
    MaxRequestsPerChild 0
    </IfModule>  

    也可。

    注意:在配置相关参数时,请先保证服务器具备足够的硬件性能(例如:CPU、内存等)。 如果发现自启动后,随着服务器的运行时间增加,服务器的内存占用也随之增加,可能是程序中出现内存泄露,请向下调整参数MaxRequestsPerChild的值以降低内存泄露带来的影响,然后尽快找出程序中的问题之所在。

  • 相关阅读:
    其实很简单——SpringIOC详解
    设计模式之原型模式与深拷贝、浅拷贝
    《Understanding the JVM》读书笔记之五——类加载器
    《Understanding the JVM》读书笔记之四——类加载机制
    《Understanding the JVM》读书笔记之三——垃圾收集器
    《Understanding the JVM》读书笔记之二——垃圾回收算法
    《Understanding the JVM》读书笔记之一——JVM内存模型
    开始实现功能(一)——用户模块,从注册登录开始
    网站后台搭建--springboot项目是如何创建的
    从网站功能入手创建数据库
  • 原文地址:https://www.cnblogs.com/xxj-bigshow/p/7095009.html
Copyright © 2011-2022 走看看