You are here

Drupal专业开发指南 第22章 Web服务器用完了RAM

Web服务器进程处理一个请求时,用到RAM的地方包括,web服务器加载所有的模块(比如Apache的mime_module, rewrite_module,等等),还有PHP解释器使用的内存。启用的web服务器和Drupal模块越多,处理单个请求耗费的RAM就越多。

    因为RAM是个有限的资源,你应该决定对于每个请求分配多少内存,还有你的web服务器能够同时处理多少个请求。为了知道平均为每个请求使用多少内存,可使用一个像Unix中top一样的程序来查看你的进程列表。在Apache中,可以使用指令MaxClients来设置能够处理的最大并发请求数。一个常见的错误认为,解决满负荷的web服务器的方案是增加MaxClients的值。这只会让问题变得更加复杂,因为你将同时收到太多的请求。这意味着RAM将被耗尽,而你的服务器将开始进行磁盘交换并开始不能响应请求。让我们假定,你的web服务器拥有2GB的内存,而每个Apache请求大约使用20MB(对于Unix,你可以使用top来检查实际值;对于windows,则可以使用任务管理器)。通过下面的公式,你可以为MaxClients计算出一个合适的值;你要记住你需要为你的操作系统和其它进程预留一定的内存:
 
2GB RAM / 20MB per process = 100 MaxClients
 
如果禁用了不需要的web服务器模块,并且优化了定制的模块或者代码以后,你的服务器仍然耗尽内存,那么接下来你要做的是,确保数据库和操作系统不是产生瓶颈的原因。如果是由它们引起的,那么就添加更多的内存。如果不是,那么问题就很简单了,你收到的请求比你能够处理的请求要多;解决方案就是添加更多的web服务器。
 
提示 由于Apache进程用到的内存,随着它的子进程增多,有逐步增加的趋势,通过将MaxRequestsPerChild的值设得小一点比如300(实际的值依赖于你所处的环境)可以收回不少的内存。Apache将会更努力的工作来生成新的子进程,而新的子进程比替换掉的子进程所需的内存要少一些,这样你就可以使用较少的内存来处理更多的请求了。MaxRequestsPerChild的默认值为0,这意味着进程永不过期。(译者注:我不知道这里讲的什么意思,没学过)。
 

Drupal版本: