📄 configtuning-kernel-limits.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="generator" content="HTML Tidy, see www.w3.org" /><title>调整内核限制</title><meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.7" /><link rel="HOME" title="FreeBSD 使用手册" href="index.html" /><link rel="UP" title="设置和调整" href="config-tuning.html" /><link rel="PREVIOUS" title="调整磁盘" href="configtuning-disk.html" /><link rel="NEXT" title="添加交换空间" href="adding-swap-space.html" /><link rel="STYLESHEET" type="text/css" href="docbook.css" /><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body class="SECT1" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#840084"alink="#0000FF"><div class="NAVHEADER"><table summary="Header navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><th colspan="3" align="center">FreeBSD 使用手册</th></tr><tr><td width="10%" align="left" valign="bottom"><a href="configtuning-disk.html"accesskey="P">后退</a></td><td width="80%" align="center" valign="bottom">章 11. 设置和调整</td><td width="10%" align="right" valign="bottom"><a href="adding-swap-space.html"accesskey="N">前进</a></td></tr></table><hr align="LEFT" width="100%" /></div><div class="SECT1"><h1 class="SECT1"><a id="CONFIGTUNING-KERNEL-LIMITS"name="CONFIGTUNING-KERNEL-LIMITS">11.13. 调整内核限制</a></h1><div class="SECT2"><h2 class="SECT2"><a id="FILE-PROCESS-LIMITS" name="FILE-PROCESS-LIMITS">11.13.1.文件/进程限制</a></h2><div class="SECT3"><h3 class="SECT3"><a id="KERN-MAXFILES" name="KERN-MAXFILES">11.13.1.1. <varclass="VARNAME">kern.maxfiles</var></a></h3><p><var class="VARNAME">kern.maxfiles</var>可以根据系统的需求加大或者减小。这个变量指出了在系统上文件描述符的最大数量。当文件描述符表曼的时候,用<tt class="COMMAND">dmesg</tt> 命令可以看到 ``<tt class="ERRORNAME">file: table isfull</tt>'' 将会在系统信息缓存里反复的出现。</p><p>每个打开的文件、套接字、fifo都使用一个描述符。一个大规模的服务器很容易使用上千个文件描述符,这取决于系统中同时运行着的服务的数量和类型。</p><p><var class="VARNAME">kern.maxfile</var> 的默认值以系统配置文件中的 <varclass="OPTION">MAXUSERS</var> 选项来决定。<var class="VARNAME">kern.maxfiles</var> 同<var class="OPTION">MAXUSERS</var>的值成比例的增长。编译一个自定义内核的时候,按照你系统中用户的数量来设置这个值是个好主意。从这个数字可以确定内核很多先前定义的限制。即使一台机器不会真有256个用户同时连接,所需要的资源也可能跟一个高负荷的web服务器差不多。</p><div class="NOTE"><blockquote class="NOTE"><p><b>注:</b> 像是 FreeBSD 4.5,在你的内核配置中设置 <varclass="OPTION">MAXUSERS</var> 为会通过系统中内存的数量来选择一个合适的值。</p></blockquote></div></div><div class="SECT3"><h3 class="SECT3"><a id="AEN16603" name="AEN16603">11.13.1.2. <varclass="VARNAME">kern.ipc.somaxconn</var></a></h3><p><var class="VARNAME">kern.ipc.somaxconn</var> sysctl 变量 限制了接收新 TCP连接侦听队列的大小。对于一个经常处理新连接的高负载web服务环境来说,默认的 <varclass="LITERAL">128</var> 太小了。大多数环境这个值建议增加到 <varclass="LITERAL">1024</var> 或者更多。服务进程会自己限制侦听队列的大小(例如 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">sendmail</span>(8)</span> 或者 <bclass="APPLICATION">Apache</b>),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务<abbr class="ABBREV">DoS</abbr> 攻击也会有所帮助。</p></div></div><div class="SECT2"><h2 class="SECT2"><a id="AEN16618" name="AEN16618">11.13.2. 网络限制</a></h2><p><var class="OPTION">NMBCLUSTERS</var>内核配置选项指出了系统可用的网络Mbuf的数量。一个高流量的服务器使用一个小数目的网络缓存会影响FreeBSD 的性能。每个 cluster可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。一个简单的方法可以计算出来需要多少网络缓存。如果你有一个同时发生1000个以上连接的web服务器,并且每个连接用掉16K接收和发送缓存,你需要大概32M网络缓存来确保web服务器的工作。一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。我们建议在有大量内存的机器上把这个值设置在4096到32768之间。没有必要把它设置成任意太高的值,它会在启动时引起崩溃。<span class="CITEREFENTRY"><span class="REFENTRYTITLE">netstat</span>(1)</span> 的 <varclass="OPTION">-m</var> 选项可以用来观察网络cluster使用情况。</p><p><var class="VARNAME">kern.ipc.nmbclusters</var>可以用来在启动时刻调节这个。仅仅在旧版本的 FreeBSD 需要使用 <varclass="OPTION">NMBCLUSTERS</var> <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">config</span>(8)</span> 选项。</p><p>繁忙的服务器经常使用 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">sendfile</span>(2)</span> 系统呼叫,有必要通过 <varclass="OPTION">NSFBUFS</var> 内核选项或者在 <ttclass="FILENAME">/boot/loader.conf</tt>(查看 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">loader</span>(8)</span> 以获得更多细节)中设置它的值来调节 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">sendfile</span>(2)</span>缓存数量。这个参数需要调节的普通原因是在进程中看到 ``<tt class="ERRORNAME">sfbufa</tt>''状态。sysctl <var class="VARNAME">kern.ipc.nsfbufs</var>变量在内核配置变量中是只读的。这个参数是由 <var class="VARNAME">kern.maxusers</var>决定的,然而它可能有必有因此而调整。</p><div class="IMPORTANT"><blockquote class="IMPORTANT"><p><b>重要:</b> 即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">sendfile</span>(2)</span> 可能导致 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">sendfile</span>(2)</span>呼叫阻塞直到有足够的 <var class="LITERAL">struct sf_buf</var> 可用。</p></blockquote></div><div class="SECT3"><h3 class="SECT3"><a id="AEN16656" name="AEN16656">11.13.2.1. <varclass="VARNAME">net.inet.ip.portrange.*</var></a></h3><p>The <var class="VARNAME">net.inet.ip.portrange.*</var> sysctl 变量自动的控制绑定在 TCP和 UDP套接字上的端口范围。这里有三个范围:一个低端范围,一个默认范围和一个高端范围。大多数网络程序分别使用由<var class="VARNAME">net.inet.ip.portrange.first</var> 和 <varclass="VARNAME">net.inet.ip.portrange.last</var>控制的从1024到5000的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口,这经常发生在运行一个高负荷web代理服务器的时候。这个端口范围不是用来限制主要的例如web服务器进入连接或者有固定端口例如邮件传递对外连接的。有时你可能用完了端口,那就建议适当的增加<var class="VARNAME">net.inet.ip.portrange.last</var>。<var class="LITERAL">10000</var>,<var class="LITERAL">20000</var> 或者 <var class="LITERAL">30000</var>可能是适当的值。更改端口范围的时候也要考虑到防火墙。一些防火墙会阻止端口的大部分范围(通常是低范围的端口)并且用高端口进行对外连接(--)。基于这个问题建议把<var class="VARNAME">net.inet.ip.portrange.first</var> 设置的小一点。</p></div><div class="SECT3"><h3 class="SECT3"><a id="AEN16670" name="AEN16670">11.13.2.2. TCP 带宽迟延(BandwidthDelay Product)</a></h3><p>The TCP Bandwidth Delay Product Limiting 类似于 NetBSD 的TCP/Vegas。它可以通过设置<var class="VARNAME">net.inet.tcp.inflight_enable</var> sysctl 变量为 <varclass="LITERAL">1</var>来启动。系统将会为每个连接尝试带宽迟延并且限制发送到网络中的队列中的数据数量以维持适当的吞吐量。similar to TCP/Vegas in <b class="APPLICATION">NetBSD</b>. It can be enabled by setting<var class="VARNAME">net.inet.tcp.inflight_enable</var> sysctl variable to <varclass="LITERAL">1</var>. The system will attempt to calculate the bandwidth delay productfor each connection and limit the amount of data queued to the network to just the amountrequired to maintain optimum throughput.</p><p>如果你在使用调制解调器,千兆以太网或者高速的广域网连接(或者其他有高的带宽迟延的产品)提供数据服务,这个特性就会很有用。特别是你在使用窗口缩放或者配置一个大的发送窗口。如果启用了这个选项,童谣要确信设置<var class="VARNAME">net.inet.tcp.inflight_debug</var> 为 <varclass="LITERAL">0</var>(关闭调试),对于生产用来说,设置 <varclass="VARNAME">net.inet.tcp.inflight_min</var> 至少为 <var class="LITERAL">6144</var>可能会受益。然而,注意设置一个高的最小值能有效的关闭依赖连接的带宽限制。这个限制特性减少了在路由和交换包队列的堵塞数据数量,也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、交互式连接,尤其是通过慢速的调制解调器,也能用低的<span class="emphasis"><iclass="EMPHASIS">往返时间</i></span>操作。但是,注意这只影响到数据发送(上载/服务端)。对数据接收(下载)没有效果。</p><p>调整 <var class="VARNAME">net.inet.tcp.inflight_stab</var> 是<span class="emphasis"><iclass="EMPHASIS">不</i></span>被建议的。这个参数的默认值是20,它代表两个最大的包被添加到带宽迟延窗口考虑。另外的窗口是稳定算法和改善改变条件时的应答所需要的,但是它也能导致通过慢速连接产生高的ping时间(虽然比你不用这个算法还慢)。这些情况下,你可能想试着把这个参数减小到15,10或者5;并且也可能需要减小<varclass="VARNAME">net.inet.tcp.inflight_min</var>(例如3500)来达到效果。减少这些参数应该是最后的唯一手段。</p></div></div></div><div class="NAVFOOTER"><hr align="LEFT" width="100%" /><table summary="Footer navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><td width="33%" align="left" valign="top"><a href="configtuning-disk.html"accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html"accesskey="H">起点</a></td><td width="33%" align="right" valign="top"><a href="adding-swap-space.html"accesskey="N">前进</a></td></tr><tr><td width="33%" align="left" valign="top">调整磁盘</td><td width="34%" align="center" valign="top"><a href="config-tuning.html"accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">添加交换空间</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -