⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1266.html

📁 著名的linux英雄站点的文档打包
💻 HTML
📖 第 1 页 / 共 3 页
字号:
        border=0></TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=10 cellPadding=0 width="100%" bgColor=#ffffff 
        border=0>
         <TR>
          <TD>
            <TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
              
              <TR>
                <TD vAlign=top align=middle width="60%">
                  <TABLE cellSpacing=0 cellPadding=0 width="100%" 
                  background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
                    <TBODY>
                    <TR>
                        <TD vAlign=top width="80%"> 
                          <DIV align=center>
                        <FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
                            </FORM>
                        <TABLE cellSpacing=0 cellPadding=0 width="95%" 
                          border=0><TBODY>
                          <TR>
                            <TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif" 
                          height=30></TD></TR></TBODY></TABLE>
                        <TABLE cellSpacing=0 cellPadding=3 width="95%" 
                        align=center border=0>
                          <TBODY>
                          <TR>
                            <TD>
                              <TABLE cellSpacing=0 cellPadding=3 width="100%" 
                              border=0>
                                <TBODY>
                                <TR>
                                      <TD vAlign=top> 
<p><FONT class=normalfont><B><font color=blue>Apache性能提示</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:作者<br>来自:Linux知识宝库<br>联系方式:无名<br><br>Apache是把正确性放在首位、把速度放在其次的通用Web服务器。即使这样,它的性能十分令人满意。<br>
许多站点只有不到10M的出口带宽。Apache能够在这些站点的低端Pentium服务器上全速工作。实际上,<br>
拥有更多带宽的站点出于一些原因(比如大量的CGI和数据库事务处理)需要用一台以上的机器满足带<br>
宽需求。这些原因导致了以往的Apache开发工作集中在正确性和可配置性。<br>
<br>
不幸的是许多人过于重视某些指标,并把它们的原始数据当作评价Web服务器优劣的标准。被普遍接受<br>
标准的是“原始最低性能(bare minimum performance)”,而在这以外的其他速度指标只适用于很<br>
小部分的市场需求。但为了避免Apache在一些市场中受到排挤,我们在Apache1.3上尽了相当的努力,<br>
将它与高端服务器的差距减至最小。<br>
<br>
另有一些人只是想试试这些东东能运行得多快。这些人竭力把Apache最后一滴性能挤出来,他们也想看<br>
看究竟是什么影响了Apache的性能。这篇文章的其余部分就是针对他们而撰的。<br>
<br>
请注意本文适用于Unix上的Apache1.3,部分内容适用于NT平台。目前的Apache尚未在NT上进行优化。<br>
事实上,不同的编程模型使它在NT上的性能表现相当不好。(即POSIX模型。NT借助POSIX子系统模拟<br>
这种编程标准,因此效率很低。Apache2.0抛弃了POSIX直接与操作系统打交道,<br>
性能将有所飞跃——译者注)<br>
<br>
关于硬件平台和操作系统<br>
最直接影响Web服务器性能的硬件要数RAM。一台Web服务器从不应该访问内存交换区。交换增加了每次<br>
请求的延时,用户将因此认为“不够快”。他们会点击[停止]并重新装载网页,这将进一步增加服务器<br>
的负担。您能够也有必要调节MaxClients,使您的服务器不会衍生太多的子进程而导致交换。<br>
<br>
除此之外的事情就没那么关键了。拥有快速的CPU、快速的网卡和硬盘都可以让您的服务器“足够快”。<br>
其实这足够快个词是需要凭经验去体会的。<br>
<br>
操作系统的选用也是值得斟酌的大问题。普遍的准则是:及时得到操作系统提供商的最新TCP/IP补丁。<br>
迅速涌现的HTTP服务打破了截止到1994年乃至95年的Unix内核中设定的许多假设情况。理想的选择包括<br>
目前的FreeBSD和Linux。<br>
<br>
关于运行时设置(Run-Time Configuration)<br>
HostnameLookups<br>
1.3版以前的Apache中,HostnameLookups的缺省值是On,这将导致每次请求时服务器都要进行NDS查询,<br>
从而增加了延迟。Apache1.3将此缺省值设为Off。在1.3及以后的版本中,如果您使用了任何<br>
allow from domain或deny from domain命令,所付出的代价将是两次DNS查询带来的延时(在一次逆向<br>
查询后跟着一次正向查询,以保证前者得到的结果是真实的)。因此为了得到最理想的性能应避免使用<br>
HostnameLookups(使用IP地址而非域名也是个好主意)。<br>
<br>
限制命令的使用范围是可行的,比如使用类似&lt;Location /server-status&gt;的容器。这种情况下,DNS查<br>
询只发生在符合条件的请求中。下面的例子使查询只发生在.html和.cgi文件的请求中:<br>
<br>
HostnameLookups off<br>
&lt;Files ~ ".(html|cgi)$&gt;<br>
HostnameLookups on<br>
&lt;/Files&gt;<br>
关闭了DNS查询后,如果在您的CGI程序中需要DNS名称的话,可以考虑在那些程序中调用gethostbyname。<br>
<br>
FollowSymLinks 和 SymLinksIfOwnerMatch<br>
在任何情况下,只要您没有指定FollowSymLinks的选项(即Options FollowSymLinks),或者指定了<br>
SymLinksIfOwnerMatch选项,Apache将不得不调用额外的系统函数来检查符号链接。每次针对文件名<br>
的请求都将触发一次检查。比如您指定了:<br>
<br>
DocumentRoot /www/htdocs<br>
&lt;Directory /&gt;<br>
Options SymLinksIfOwnerMatch<br>
&lt;/Directory&gt;<br>
当一个指向URI /index.html的请求到来时,Apache将对/www,/www/htdocs和/www/htdocs/index.html<br>
分别调用lstat(2)。不仅如此,lstat的结果是从不被缓存的,因此每次请求都要重新这样的检查。如果<br>
您的确需要安全的符号链接的话,可以试着这样做:<br>
<br>
DocumentRoot /www/htdocs<br>
&lt;Directory /&gt;<br>
Options FollowSymLinks<br>
&lt;/Directory&gt;<br>
&lt;Directory /www/htdocs&gt;<br>
Options -FollowSymLinks +SymLinksIfOwnerMatch<br>
&lt;/Directory&gt;<br>
这至少避免了对DocumentRoot目录本身的检查。请注意,如果在RocumentRoot之外有Alias或者<br>
RewriteRule涉及的目录,您需要为这些目录增加类似的选项。为了在无符号链接检查的情况下得到最<br>
佳性能,请在所有地方设置FollowSymLinks,并去掉所有的SymLinksIfOwnerMatch。<br>
<br>
AllowOverride<br>
在任何情况下,只要您允许覆盖(通常是.htaccess文件),Apache将试图为每次针对文件名称的请求打<br>
开.htaccess文件。比如:<br>
<br>
DocumentRoot /www/htdocs<br>
&lt;Directory /&gt;<br>
AllowOverride all<br>
&lt;/Directory&gt;<br>
当指向URI /index.html的请求到来时,Apache将试图打开<br>
/.htaccess、/www/.htaccess和/www/htdocs/.htaccess。这个问题可以用类似解决FollowSymLinks的方<br>
法解决。为了得到最佳性能,在所有地方使用AllowOverride None。<br>
<br>
内容协商<br>
如果您对每处细微的性能调节都很在意,在可能的情况下避免内容协商(content-negotiation)。实际<br>
应用中,协商的益处超过了给性能带来的损失。您可以在一种情况下提速服务器:避免使用这样的通配符:<br>
<br>
DirectoryIndex index<br>
请列出所有可能的情况:<br>
<br>
DirectoryIndex index.cgi index.pl index.shtml index.html<br>
并把最常用的选择放在前面。<br>
<br>
 <br>
<br>
进程的建立<br>
对于1.3版以前的Apache,MinSpareServers、MaxSpareServers、和StartServers这三个参数对性能测<br>
试的结果有巨大影响。Apache启动后需要一个“爬升”期使其子进程数与服务器的负载相平衡。刚刚<br>
启动的Apache生成StartServers个子进程。而后将每隔一秒生成一个新的子进程,最终达到<br>
MinSpareServers的要求。所以如果服务器用StartServers等于5的默认值启动后被100个客户并发访问,<br>
Apache将用后续的95秒种生成足够的子进程以平衡负载。由于现实中的服务器不经常启动,这种技术<br>
在实际应用中工作得很好。但在评测软件中的表现就不那么出色了,因为这些软件可能顶多运行10分钟。<br>
<br>
一秒一个的规则防止服务器在生成子进程时过于忙碌。如果它忙于繁殖进程,请求将被搁置。但这个<br>
规则对直观性能的影响太大了,它必须有所改观。在Apache 1.3中,一秒一个的规则被废弃了。它首<br>
先衍生一个子进程,等一秒,衍生两个,等一秒,再衍生两个,直到一秒衍生32个子进程。随后它将<br>
保持这个速度直到满足MinSpareServers的要求。<br>
<br>
这看起来足够好了。几乎不用在MinSpareServers、MaxSpareServers或StartServers上费工夫了。当<br>
每秒钟衍生的进程数超过4时,ErrorLog中会增加一条相应的记录。如果您看到了很多这样的提示,请<br>
调整这些参数。mod_status的输出会给您一些提示。<br>
<br>
于进程相关的问题是由MaxRequestsPerChild导致的进程终止。MaxRequestsPerChild缺省地设置为0,<br>
意味每个子进程处理的请求数不受限制。如果当前的设置值非常小,您可能希望大幅度提升这个值。为<br>
了防止内存泄露,在SunOS或者低版本的Solaris上,应把此值设为10000左右。<br>
<br>
如果使用了持续连接(keep-alives),子进程将繁忙等待(busy waiting)已打开连接的后续请求而不<br>
能做其他的事。缺省的15秒种试图使影响将至最底。您需要在网络带宽和服务器资源之间作出权衡。任<br>
何情况下,不应设置持续连接时间超过60秒。否则大部分好处将变成损失。<br>
<br>
关于编译时设置<br>
mod_status 和 ExtendedStatus On<br>
如果在编译Apache时您包含了mod_status并且将ExtendedStatus设置为On,Apache将为每个请求进行两<br>
次gettimeofday(2)系统调用(或者针对不同的系统调用times(2))及(在1.3以前的版本)许多次<br>
time(2)。这些都是为了在报告中含有时间戳。为了得到最佳性能,请将ExtendedStatus设为Off(这是<br>
缺省的设置)。<br>
<br>
多socket中的accept 串行化<br>
这部分文章将讨论Unix socket API不利的一方面。假设您的服务器用多个Listen命令侦听多个端口或<br>
者多个IP地址。Apache使用select(2)检测每个socket连接(connection)是否就绪。select(2)示意有<br>
零个或至少一个连接等待某个socket。Apache含有多个子进程,所有空闲的子进程同时侦听新的连接。<br>
原始的实现如下所示(这个例子不是真正的代码,它出于教学目的被简化了)<br>
<br>
for (;icon_wink.gif {<br>
for (;icon_wink.gif {<br>
fd_set accept_fds;<br>
<br>
FD_ZERO (&accept_fds);<br>
for (i = first_socket; i &lt;= last_socket; ++i) {<br>
FD_SET (i, &accept_fds);<br>
}<br>
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);<br>
if (rc &lt; 1) continue;<br>
new_connection = -1;<br>
for (i = first_socket; i &lt;= last_socket; ++i) {<br>
if (FD_ISSET (i, &accept_fds)) {<br>
new_connection = accept (i, NULL, NULL);<br>
if (new_connection != -1) break;<br>
}<br>
}<br>
if (new_connection != -1) break;<br>
}<br>
process the new_connection;<br>
}<br>
但这种实现会引起严重的饥饿问题。由于多个子进程同时执行这个循环,它们将在select中阻塞。<br>
当任何socket上出现一个请求时,所有被阻塞的进程将复苏,并从select返回(苏醒进程的数量取<br>
决于操作系统和时间)。它们将继续执行并试图接受这个连接,但只有一个进程会成功(假设目前<br>
仍只有一个连接),其余进程将阻塞在accept中。这将把所有失败的进程锁定,使它们只为一个<br>
socket上的请求服务。它们会一直被阻塞,直到在那个socket上出现足够的请求把它们唤醒。这一<br>
饥饿问题首先在PR#467被提出。至少有两种解决它的方法。<br>
<br>
一种方案是使用非阻塞的socket。这种情况下,accept不会阻塞子进程,它们将会立即返回。但这<br>
种方案会造成CPU时间的浪费。假设有十个在select中的空闲进程,而后到来了一个连接请求。九个<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -