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

📄 perf-tuning.html

📁 这个是我在web培训时老师提供的手册
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>性能方面的提示 - Apache 2.2 中文版参考手册</title>
</head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">文档</a> &gt; <a href="../index.html">版本2.2</a> &gt; <a href="./index.html">杂项文档</a></div>

<div id="translation-info">   <a href="../translator_announcement.html#thanks">致谢</a> | <a href="../translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:&#099;sfr&#0097;nk&#0064;&#099;itiz&#046;n&#0101;t">金步国</a> | 本篇译稿最后更新:2006年1月10日 | <a href="../translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>性能方面的提示</h1>



    <p>Apache2.0是一个多用途的web服务器,其设计在灵活性、可移植性和性能中求得平衡。虽然没有在设计上刻意追求性能指标,但是Apache2.0仍然在许多现实环境中拥有很高的性能。</p>

    <p>相比于Apache 1.3 ,2.0版本作了大量的优化来提升处理能力和可伸缩性,而且大多数的改进在默认状态下就可以生效。但是,在编译时和运行时,都有许多可以显著提高性能的选择。本文阐述在安装Apache2.0时,服务器管理员可以改善性能的各种方法。其中,部分配置选择可以使httpd更好地利用硬件和操作系统的兼容性,其他则是以功能换取速度。</p>

  </div>
	<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="hardware" id="hardware">硬件和操作系统</a></h2>

    

    <p>影响web服务器性能的最大的因素是内存。一个web服务器应该从不使用交换机制,因为交换产生的滞后使用户总感觉"不够快",所以用户就可能去按"停止"和"刷新",从而带来更大的负载。你可以,也应该,控制<code class="directive"><a href="../mod/mpm_common.html#maxclients">MaxClients</a></code>的设置,以避免服务器产生太多的子进程而发生交换。这个过程很简单:通过<code>top</code>命令计算出每个Apache进程平均消耗的内存,然后再为其它进程留出足够多的内存。</p>

    <p>其他因素就很普通了,装一个足够快的CPU,一个足够快的网卡,几个足够快的硬盘,这里说的"足够快"是指能满足实际应用的需求。</p>

    <p>操作系统是很值得关注的又一个因素,已经被证实的很有用的经验有:</p>

    <ul>
      <li>
        <p>选择能够得到的最新最稳定的版本并打好补丁。近年来,许多操作系统厂商都提供了可以显著改善性能的TCP协议栈和线程库。</p>
      </li>

      <li>
        <p>如果你的操作系统支持<code>sendfile()</code>系统调用,则务必安装带有此功能的版本或补丁(对Linux来说,就是使用Linux2.4或更高版本,对Solaris8的早期版本,则需要安装补丁)。在支持<code>sendfile</code>的系统中,Apache2可以更快地发送静态内容而且占用较少的CPU时间。</p>
      </li>
    </ul>

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="runtime" id="runtime">运行时的配置</a></h2>

    

    <table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="related">
<tr><th>相关模块</th><th>相关指令</th></tr>
<tr><td><ul><li><code class="module"><a href="../mod/mod_dir.html">mod_dir</a></code></li><li><code class="module"><a href="../mod/mpm_common.html">mpm_common</a></code></li><li><code class="module"><a href="../mod/mod_status.html">mod_status</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code></li><li><code class="directive"><a href="../mod/mod_dir.html#directoryindex">DirectoryIndex</a></code></li><li><code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code></li><li><code class="directive"><a href="../mod/core.html#enablemmap">EnableMMAP</a></code></li><li><code class="directive"><a href="../mod/core.html#enablesendfile">EnableSendfile</a></code></li><li><code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code></li><li><code class="directive"><a href="../mod/prefork.html#maxspareservers">MaxSpareServers</a></code></li><li><code class="directive"><a href="../mod/prefork.html#minspareservers">MinSpareServers</a></code></li><li><code class="directive"><a href="../mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code></li></ul></td></tr>
</table>

    <h3><a name="dns" id="dns">HostnameLookups 和其他DNS考虑</a></h3>

      

      <p>在Apache1.3以前的版本中,<code class="directive"><a href="../mod/core.html#hostnamelookups">HostnameLookups</a></code>默认被设为 <code>On</code> 。它会带来延迟,因为对每一个请求都需要作一次DNS查询。在Apache1.3中,它被默认地设置为 <code>Off</code> 。如果需要日志文件提供主机名信息以生成分析报告,则可以使用日志后处理程序<code class="program"><a href="../programs/logresolve.html">logresolve</a></code> ,以完成DNS查询,而客户端无须等待。</p>

      <p>推荐你最好是在其他机器上,而不是在web服务器上执行后处理和其他日志统计操作,以免影响服务器的性能。</p>

      <p>如果你使用了任何"<code><code class="directive"><a href="../mod/mod_access.html#allow">Allow</a></code> from domain</code>"或"<code><code class="directive"><a href="../mod/mod_access.html#deny">Deny</a></code> from domain</code>"指令(也就是<code>domain</code>使用的是主机名而不是IP地址),则代价是要进行两次DNS查询(一次正向和一次反向,以确认没有作假)。所以,为了得到最高的性能,应该避免使用这些指令(不用域名而用IP地址也是可以的)。</p>

      <p>注意,可以把这些指令包含在<code>&lt;Location /server-status&gt;</code>段中使之局部化。在这种情况下,只有对这个区域的请求才会发生DNS查询。下例禁止除了<code>.html</code>和<code>.cgi</code>以外的所有DNS查询:</p>

      <div class="example"><p><code>
        HostnameLookups off<br />
        &lt;Files ~ "\.(html|cgi)$"&gt;<br />
        <span class="indent">
          HostnameLookups on<br />
        </span>
        &lt;/Files&gt;
      </code></p></div>

      <p>如果在某些CGI中偶尔需要DNS名称,则可以调用<code>gethostbyname</code>来解决。</p>

    

    <h3><a name="symlinks" id="symlinks">FollowSymLinks 和 SymLinksIfOwnerMatch</a></h3>

      

      <p>如果网站空间中<em>没有使用</em> <code>Options FollowSymLinks</code> ,或<em>使用</em>了 <code>Options SymLinksIfOwnerMatch</code> ,Apache就必须执行额外的系统调用以验证符号连接。文件名的每一个组成部分都需要一个额外的调用。例如,如果设置了:</p>

      <div class="example"><p><code>
        DocumentRoot /www/htdocs<br />
        &lt;Directory /&gt;<br />
        <span class="indent">
          Options SymLinksIfOwnerMatch<br />
        </span>
        &lt;/Directory&gt;
      </code></p></div>

      <p>在请求"<code>/index.html</code>"时,Apache将对"<code>/www</code>"、"<code>/www/htdocs</code>"、"<code>/www/htdocs/index.html</code>"执行<code>lstat()</code>调用。而且<code>lstat()</code>的执行结果不被缓存,因此对每一个请求都要执行一次。如果确实需要验证符号连接的安全性,则可以这样:</p>

      <div class="example"><p><code>
        DocumentRoot /www/htdocs<br />
        &lt;Directory /&gt;<br />
        <span class="indent">
          Options FollowSymLinks<br />
        </span>
        &lt;/Directory&gt;<br />
        <br />
        &lt;Directory /www/htdocs&gt;<br />
        <span class="indent">
          Options -FollowSymLinks +SymLinksIfOwnerMatch<br />
        </span>
        &lt;/Directory&gt;
      </code></p></div>

      <p>这样,至少可以避免对<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>路径的多余的验证。注意,如果<code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>或<code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>中含有<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>以外的路径,那么同样需要增加这样的段。为了得到最佳性能,应当放弃对符号连接的保护,在所有地方都设置<code>FollowSymLinks</code> ,并放弃使用<code>SymLinksIfOwnerMatch</code> 。</p>

    

    <h3><a name="htacess" id="htacess">AllowOverride</a></h3>

      

      <p>如果网站空间允许覆盖(通常是用<code>.htaccess</code>文件),则Apache会试图对文件名的每一个组成部分都打开<code>.htaccess</code> ,例如:</p>

      <div class="example"><p><code>
        DocumentRoot /www/htdocs<br />
        &lt;Directory /&gt;<br />
        <span class="indent">
          AllowOverride all<br />
        </span>
        &lt;/Directory&gt;
      </code></p></div>

      <p>如果请求"<code>/index.html</code>",则Apache会试图打开"<code>/.htaccess</code>"、"<code>/www/.htaccess</code>"、"<code>/www/htdocs/.htaccess</code>"。其解决方法和前面所述的 <code>Options FollowSymLinks</code> 类似。为了得到最佳性能,应当对文件系统中所有的地方都使用 <code>AllowOverride None</code> 。</p>

    

    <h3><a name="negotiation" id="negotiation">内容协商</a></h3>

      

      <p>实践中,内容协商的好处大于性能的损失,如果你很在意那一点点的性能损失,则可以禁止使用内容协商。但是仍然有个方法可以提高服务器的速度,就是不要使用通配符,如:</p>

      <div class="example"><p><code>
        DirectoryIndex index
      </code></p></div>

      <p>而使用完整的列表,如:</p>

      <div class="example"><p><code>
        DirectoryIndex index.cgi index.pl index.shtml index.html
      </code></p></div>

      <p>其中最常用的应该放在前面。</p>

      <p>还有,建立一个明确的<code>type-map</code>文件在性能上优于使用"<code>Options MultiViews</code>",因为所有需要的信息都在一个单独的文件中,而无须搜索目录。请参考<a href="../content-negotiation.html">内容协商</a>文档以获得更详细的协商方法和创建<code>type-map</code>文件的指导。</p>

    

    <h3>内存映射</h3>

      <p>在Apache2.0需要搜索被发送文件的内容时,比如处理服务器端包含时,如果操作系统支持某种形式的<code>mmap()</code> ,则会对此文件执行内存映射。</p>

      <p>在某些平台上,内存映射可以提高性能,但是在某些情况下,内存映射会降低性能甚至影响到httpd的稳定性:</p>

      <ul>
        <li>
          <p>在某些操作系统中,如果增加了CPU,<code>mmap</code>还不如<code>read()</code>迅速。比如,在多处理器的Solaris服务器上,关闭了<code>mmap</code> ,Apache2.0传送服务端解析文件有时候反而更快。</p>
        </li>

        <li>
          <p>如果你对作为NFS装载的文件系统中的一个文件进行了内存映射,而另一个NFS客户端的进程删除或者截断了这个文件,那么你的进程在下一次访问已经被映射的文件内容时,会产生一个总线错误。</p>
        </li>
      </ul>

      <p>如果有上述情况发生,则应该使用 <code>EnableMMAP off</code> 关闭对发送文件的内存映射。注意:此指令可以被针对目录的设置覆盖。</p>


    <h3>Sendfile</h3>

      <p>在Apache2.0能够忽略将要被发送的文件的内容的时候(比如发送静态内容),如果操作系统支持<code>sendfile()</code> ,则Apache将使用内核提供的<code>sendfile()</code>来发送文件。</p>

      <p>在大多数平台上,使用sendfile可以通过免除分离的读和写操作来提升性能。然而在某些情况下,使用sendfile会危害到httpd的稳定性</p>

      <ul>
        <li>
          <p>一些平台可能会有Apache编译系统检测不到的有缺陷的sendfile支持,特别是将在其他平台上使用交叉编译得到的二进制文件运行于当前对sendfile支持有缺陷的平台时。</p>
        </li>
        <li>
          <p>对于一个挂载了NFS文件系统的内核,它可能无法可靠的通过自己的cache服务于网络文件。</p>

⌨️ 快捷键说明

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