« 是研究生还是学术民工? | 首 页 | [ZT]Apache 2.0性能优化—MPM的选择与配置 »

2004 年 11 月 18 日

Running a High-Performance Web Server

| 分类: 服务器技术 Server Tech. |

最近老是连不上主机,经常重起但是又找不到原因。昨天又出现了这个问题的时候在突然恢复正常的时候审查了一下主机,发现是mysqld会出现内存溢出的问题。由于我跑的是论坛,在论坛上会有下载服务,所以自然也想到apache的配置问题。
虽然流量的增大的确是一件好事,但是配置一个高负载的服务器还是没有经验,草草地收集了一下资料。

Apache Performance Tuning
Running a High-Performance Web Server on HPUX
FreeBSD連載(84):配置Apache伺服器(1)
Multi-Processing Modules (MPMs)
Apache MPM prefork
Apache MPM worker

几个得注意的参数:

TimeOut 300
KeepAlive On
KeepAliveTimeout 3
MaxKeepAliveRequests 100


StartServers 3
MinSpareServers 2
MaxSpareServers 4
MaxClients 250
MaxRequestsPerChild 0
# Not neccessary if we don't have so much connection
#ServerLimit 1000

MaxRequestsPerChild 1000
(这里我发现我设置为了0,就是没有限制。但是参看了doc,发现还是设置一个比较稳定。)

特别注意:
ServerLimit 和 ThreadLimit 的设定一定要放在所有参数的前面,不然将无效。
参考文档:http://httpd.apache.org/docs-2.0/ja/mod/worker.html#how-it-works

ServerLimit は活動中の子プロセスの越えられない上限を設定し、 MaxClients ディレクティブ の値を ThreadsPerChild の値で割った値以上である 必要があります。ThreadLimit は サーバスレッドの越えられない上限で、ThreadsPerChild ディレクティブの 値以上である必要があります。デフォルト以外の値を指定する場合は 他の worker ディレクティブよりも前に書かれている 必要があります。

>>> 中文 worker.c 的解释 <<<

Apache MPM worker 说明: 使网络服务器支持多线程多进程的多道处理模块 状态: MPM 模块名: mpm_worker_module 源文件: worker.c

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

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

它是如何运作的
每个进程可以拥有的线程数量是固定的。 服务器会根据负载情况做增加或减少进程数量的调整。

单个控制进程负责子进程的建立。每个子进程可以建立由ThreadsPerChild指定的固定数量的线程。 然后,由独立的线程监听并处理到来的连接。

Apache总是试图维持一个备用的或者说空闲的服务线程池。 如此,客户端无须等待线程或进程的建立即可得到处理。 最初建立进程的数量由StartServers指令所决定。 其后,Apache检测所有进程中空闲线程的总数,并新建或结束进程使总数维持在MinSpareThreads和MaxSpareThreads所指定的范围以内。 由于这个过程是自动调整的,几乎没有必要修改这些指令的缺省值。 同时可以得到处理的客户端的最大数量取决于MaxClients指令,而进程建立的最大数量取决于ServerLimit指令。ServerLimit乘以ThreadsPerChild必须大于等于MaxClients。

worker MPM 中进程-线程控制的典型配置如下:

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
ServerLimit 16
在Unix中,为了能够绑定端口80,父进程一般都是以root身份启动的, 其后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于设置Apache子过程的权限。 虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予它较少的特权。 另外,除非使用了suexec, 否则,这些指令设置的权限将被CGI脚本所继承。

MaxRequestsPerChild 指令用于控制服务器建立和结束进程的频率。

worker MPM 中进程-线程控制的典型配置如下:

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
ServerLimit 16

在Unix中,为了能够绑定端口80,父进程一般都是以root身份启动的, 其后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于设置Apache子过程的权限。 虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予它较少的特权。 另外,除非使用了suexec, 否则,这些指令设置的权限将被CGI脚本所继承。

MaxRequestsPerChild 指令用于控制服务器建立和结束进程的频率。

引用自 FreeBSD連載(84):配置Apache伺服器(1)
  Timeout 300

  Timeout定義客戶程序和伺服器連接的超時間隔,超過這個時間間隔(秒)後伺服器將斷開與客戶機的連接。

  KeepAlive On

  在HTTP 1.0中,一次連接只能作傳輸一次HTTP請求,而KeepAlive參數用於支持HTTP 1.1版本的一次連接、多次傳輸功能,這樣就可以在一次連接中傳遞多個HTTP請求。雖然只有較新的瀏覽器才支持這個功能,但還是打開使用這個選項。

  MaxKeepAliveRequests 100

  MaxKeepAliveRequests為一次連接可以進行的HTTP請求的最大請求次數。將其值設為0將支持在一次連接內進行無限次的傳輸請求。事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個上限就完成連接了。

  KeepAliveTimeout 15

  KeepAliveTimeout測試一次連接中的多次請求傳輸之間的時間,如果伺服器已經完成了一次請求,但一直沒有接收到客戶程序的下一次請求,在間隔超過了這個參數設置的值之後,伺服器就斷開連接。

  MinSpareServers 5
  MaxSpareServers 10

  在使用子進程處理HTTP請求的Web伺服器上,由於要首先生成子進程才能處理客戶的請求,因此反應時間就有一點延遲。但是,Apache伺服器使用了一個特殊技術來擺脫這個問題,這就是預先生成多個空余的子進程駐留在系統中,一旦有請求出現,就立即使用這些空余的子進程進行處理,這樣就不存在生成子進程造成的延遲了。在運行中隨著客戶請求的增多,啟動的子進程會隨之增多,但這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在電腦中等待下次請求。但是空余的子進程副本不能光增加不減少,太多的空余子進程沒有處理任務,也占用伺服器的處理能力,因此也要限制空余副本的數量,使其保持一個合適的數量,使得既能及時回應客戶請求,又能減少不必要的進程數量。

  因此就可以使用參數MinSpareServers來設置最少的空余子進程數量, 以及使用參數MaxSpareServers 來限制最多的空閑子進程數量,多余的伺服器進程副本就會退出。根據伺服器的實際情況來進行設置,如果伺服器性能較高,並且也被頻繁訪問,就應該增大這兩個參數的設置。對於高負載的專業網站,這兩個值應該大致相同,並且等同於系統支持的最多伺服器副本數量,也減少不必要的副本退出。

  StartServers 5

  StartServers參數就是用來設置httpd啟動時啟動的子進程副本數量,這個參數與上面定義的MinSpareServers和MaxSpareServers參數相關,都是用於啟動空閑子進程以提高伺服器的反應速度的。這個參數應該設置為前兩個值之間的一個數值,小於MinSpareServers和大於MaxS pareServers都沒有意義。

  MaxClients 150

  在另一方面,伺服器的能力畢竟是有限的,不可能同時處理無限多的連接請求,因此參數Maxclient s就用於規定伺服器支持的最多並發訪問的客戶數,如果這個值設置得過大,系統在繁忙時不得不在過多的進程之間進行切換來為太多的客戶進行服務,這樣對每個客戶的反應就會減慢,並降低了整體的效率。如果這個值設置的較小,那麼系統繁忙時就會拒絕一些客戶的連接請求。當伺服器性能較高時,就可以適當增加這個值的設置。對於專業網站,應該使用提高伺服器效率的策略,因此這個參數不能超過硬體本身的限制,如果頻繁出現拒絕訪問現象,就說明需要升級伺服器硬體了。對於非專業網站,不太在意對客戶瀏覽器的反應速度,或者認為反應速度較慢也比拒絕連接好,就也可以略微超過硬體條件來設置這個參數。

  這個參數限制了MinSpareServers和MaxSpareServers的設置,它們不應該大於這個參數的設置。

  MaxRequestsPerChild 30

  使用子進程的方式提供服務的Web服務,常用的方式是一個子進程為一次連接服務,這樣造成的問題就是每次連接都需要生成、退出子進程的系統操作,使得這些額外的處理過程占據了電腦的大量處理能力。因此最好的方式是一個子進程可以為多次連接請求服務,這樣就不需要這些生成、退出進程的系統消耗,Apache就採用了這樣的方式,一次連接結束後,子進程並不退出,而是停留在系統中等待下一次服務請求,這樣就極大的提高了性能。

  但由於在處理過程中子進程要不斷的申請和釋放內存,次數多了就會造成一些內存垃圾,就會影響系統的穩定性,並且影響系統資源的有效利用。因此在一個副本處理過一定次數的請求之後,就可以讓這個子進程副本退出,再從原始的htt pd進程中重新復制一個干淨的副本,這樣就能提高系統的穩定性。這樣,每個子進程處理服務請求次數由MaxRe questPerChild定義。 預設的設置值為30,這個值對於具備高穩定性特點的FreeBSD系統來講是過於保守的設置,可以設置為1000甚至更高,設置為0支持每個副本進行無限次的服務處理。

>>> 使用的一些命令 <<<

查看一个IP的连接数目
$ netstat -anlp | grep 218.57.68.60 | wc -l

$ ./configure --help|grep mpm

显示如下:
--with-mpm=MPM
Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}

>> 草草收集的佳文 <<

听朋友说静态把PHP编入Apache会提高服务器的性能,于是google了一些文章。
apache的静态/动态编译在apache+php+mysql的应用:张微波的BLOG
Apache和PHP/Perl/Python组合加速
httperf---A Tool for Measuring Web Server Performance


>> 当出现 httpd 的纪录 <<
用 top -d 1 记录下几次 出现 httpd 的情况。

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
9031 root 16 0 5308 5308 5104 S 99.9 0.5 0:27 3 httpd
16017 apache 16 0 0 0 0 Z 99.9 0.0 0:07 3 httpd <defunct>
9031 root 16 0 5308 5308 5104 S 99.9 0.5 0:13 3 httpd
15661 apache 16 0 0 0 0 Z 99.9 0.0 0:14 1 httpd <defunct>
9031 root 16 0 5308 5308 5104 S 99.9 0.5 0:13 2 httpd
16493 apache 17 0 0 0 0 Z 99.9 0.0 0:05 3 httpd <defunct>
9031 root 16 0 5308 5308 5104 S 99.9 0.5 0:28 2 httpd
16574 apache 16 0 0 0 0 Z 99.9 0.0 0:08 3 httpd <defunct>
9031 root 16 0 5308 5308 5152 S 99.9 0.5 0:04 1 httpd
16735 apache 16 0 0 0 0 Z 99.9 0.0 0:09 3 httpd <defunct>

(END)

引用

引用本文的 URL:
/cgi-bin/mt/mt-tb.cgi/161.

以下是参考 Running a High-Performance Web Server 的 blog 链接:

» Kreny's Blog 的 继续对 httpd <defunct> 的试验
最近的 httpd <defunct> 又频繁增多,主要原因现在还在寻找中。今天通宵看了很多文摘,同时也有所心得。现在把整个过程记录一下,以备后用。 第一步,针对log 文件的2G 的limitation 作排除性 [Read More]

发表评论

(如果您还为在此成功留言,也许是因为需要管理员逐一审核留言内容后放可看到您的评论。请稍后并感谢您的耐心等待。)

阅览更多文章请访问 首页过去的存档