Apache如何合理设置连接数,apache连接数


Apache如何合理设置连接数

1、首先要了解Apache采用的MPMMulti -Processing Modules,多道处理模块)
       MPMApache的核心,它的作用是管理网络连接、调度请求

       Apache2.0MPM分为3种(perforkworkerevent)。perforkApache1.3中继承下来的,它采用的是进程管理方式,所以它可以提供更可靠的性能和更好的兼容性;workerApache2.0中新增加的方式,它采用了线程控制方法,可以比perfork更节约系统开销、处理更多的数据量,但同时兼容性并不是很好,很多旧的程序无法工作在worker下;event仍处于试验阶段,它为每个任务分配不同的进程池,目前不应该采用。通过命令 httpd -l  apache2 -l可以获取目前Apache采用的是哪种MPM

2、了解perfork的工作方式

  查看Apache2.0的配置文件httpd.conf,可以看到perfork的配置段,大致如下:

ServerLimit 256

StartServers 5

MinSpareServers 10

MaxSpareServers 15

MaxClients 256

MaxRequestsPerChild 4000

  当Apache被启动时,Apache会自动创建StartServers个进程,并且尽力将空闲进程数保持在MinSpareServersMaxSpareServers之间。

如果空闲进程小于MinSpareServersApache将会以大约每秒1个的速度新建进程。

如果空闲进程大于MaxSpareServersApache将会删除多余的空闲进程,释放服务器资源。
进程数的最大值由MaxClients控制,在Apache1.3中最大只能设置为256,但在Apache2.0中,可以

通过在配置开头增加ServerLimit项目来突破256的限制,此时必须MaxClients ≤ ServerLimit ≤ 20000
MaxRequestsPerChild用来控制每个进程在处理了多少次请求之后自动销毁,这个参数可以设置为0表示无限(即不销毁进程)。

3、 优化perfork
  首先,对于一个负载相对较高的网站来说,256的进程限制是不够的,如果服务器已经达到256的极
限,那么接下去的访问就需要排队,这也就是为什么某些服务器负载不高,但是访问却很慢的原因之一。所以首先应该了解服务器在繁忙时的进程数量。通过命令ps -ef|grep httpd|wc -l可以了解到当前系统中Apache进程数,通过设置ServerLimitMaxClients来达到为服务器软扩容的目的。

  然后,在访问量高峰期,经常会出现的情况是突然之间发生非常多的并发连接,然后突然之间减少了很多访问。如果Apache没有准备足够数量的预备进程,那访问只能等待Apache每秒1个的新增进程,随后又要将多余的进程删除,那Apache只能一直忙于新建和销毁进程,大大地降低了访问速度。可以适当增加StartServersMinSpareServersMaxSpareServers 来使得Apache不需要一直忙于作无用功。

  最后,强烈推荐MaxRequestsPerChild不要设置为0,设置为非0,可以保护Apache进程免遭内存泄漏的影响,因为你不知道运行在Apache上的应用程式在什么时候会出错导致内存泄漏。

设置完之后大致是这样的:

ServerLimit 1000

StartServers 30

MinSpareServers 30

MaxSpareServers 45

MaxClients 1000

MaxRequestsPerChild 4000

4、最后补充一下apache的知识:

       Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。不同的平台和不同的环境经常产生不同的需求,或是为了达到同样的最佳效果而采用不同的方法。Apache凭借它的模块化设计很好的适应了大量不同的环境。这一设计使得网站管理员能够在编译时和运行时凭借载入不同的模块来决定服务器的不同附加功能。

        Apache2.0将这种模块化的设计延伸到了web服务器的基础功能上。这个版本带有多路处理模块(MPM)的选择以处理网络端口绑定、接受请求并指派子进程来处理这些请求。将模块化设计延伸到这一层次主要有以下两大好处:

 (1) Apache可以更简洁、更有效地支持各种操作系统。尤其是在mpm_winnt中使用本地网络特性代替Apache1.3中使用的POSIX模拟层后,Windows版本的Apache现在具有更好的性能。这个优势借助特定的MPM同样延伸到了其他各种操作系统。

(2) 服务器可以为某些特定的站点进行定制。比如,需要更好伸缩性的站点可以选择象workerevent这样线程化的MPM,而需要更好的稳定性和兼容性以适应一些旧的软件的站点可以用prefork

  从用户角度来看,MPM更像其他的Apache模块。主要的不同在于:不论何时,必须有且仅有一个MPM被载入到服务器中。现有的MPM列表可以在模块索引中找到。

  选择一个MPM:MPM必须在编译配置时进行选择,并静态编译到服务器中。如果编译器能够确定线程功能被启用,它将会负责优化大量功能。因为一些MPMUnix上使用了线程,而另外一些没有使用,所以如果在编译配置时选择MPM并静态编译进ApacheApache将会有更好的表现。

  你可以在使用configure脚本时用--with-mpm=NAME 选项指定MPMNAME就是你想使用的MPM的名称。一旦服务器编译完成,就可以用./httpd -l 命令来查看使用了哪个MPM。这个命令将列出所有已经被编译到服务器中的模块,包括MPM

下面主要阐述preforkworker这两种和性能关系最大的产品级MPM

Apache MPM prefork:一个非线程型的、预派生的MPM

  这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

  这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

工作方式一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。

Apache MPM worker:支持混合的多线程多进程的多路处理模块

  此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。

  控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令和控制允许建立的总线程数的MaxClients指令。

工作方式每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

        Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。初始化时建立的进程数量由StartServers指令决定。随后父进程检测所有子进程中空闲线程的总数,并新建或结束子进程使空闲线程的总数维持在MinSpareThreadsMaxSpareThreads所指定的范围内。由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。可以并行处理的客户端的最大数量取决于MaxClients指令。活动子进程的最大数量取决于MaxClients除以ThreadsPerChild的值。

       有两个指令设置了活动子进程数量和每个子进程中线程数量的硬限制。要想改变这个硬限制必须完全停止服务器然后再启动服务器(直接重启是不行的)ServerLimit是活动子进程数量的硬限制,它必须大于或等于MaxClients除以ThreadsPerChild的值。ThreadLimit所有服务线程总数的硬限制,它必须大于或等于ThreadsPerChild指令。这两个指令必须出现在其他workerMPM指令的前面。



相关内容

    暂无相关文章