﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-深蓝色心情-随笔分类-软件安装入门</title><link>http://www.blogjava.net/darkbluefeeling/category/7131.html</link><description>过来聊聊~~~~</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 15:52:08 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 15:52:08 GMT</pubDate><ttl>60</ttl><item><title>提高 Linux 上 socket 性能</title><link>http://www.blogjava.net/darkbluefeeling/archive/2006/02/15/30741.html</link><dc:creator>深蓝色心情</dc:creator><author>深蓝色心情</author><pubDate>Wed, 15 Feb 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/darkbluefeeling/archive/2006/02/15/30741.html</guid><wfw:comment>http://www.blogjava.net/darkbluefeeling/comments/30741.html</wfw:comment><comments>http://www.blogjava.net/darkbluefeeling/archive/2006/02/15/30741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/darkbluefeeling/comments/commentRss/30741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/darkbluefeeling/services/trackbacks/30741.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width="100%">
<H1>提高 Linux 上 socket 性能</H1>
<P id=subtitle>加速网络应用程序的 4 种方法</P><IMG class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></TD>
<TD class=no-print width=192><IMG height=18 alt=developerWorks src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" width=192></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=10><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></TD>
<TD width="100%">
<TABLE class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
<TBODY>
<TR>
<TD width=10><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></TD>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD class=v14-header-1-small></TD></TR></TBODY></TABLE>
<TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=no-padding width=150>
<TABLE cellSpacing=0 cellPadding=0 width=143 border=0><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8> 
<FORM name=email action=https://www-130.ibm.com/developerworks/secure/email-it.jsp>
<SCRIPT language=JavaScript type=text/javascript>
<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
</SCRIPT>
&nbsp;
<TBODY>
<TR vAlign=top>
<TD width=8><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></TD>
<TD width=16></TD>
<TD width=122></TD></TR><NOSCRIPT><tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="//www.ibm.com/i/c.gif" height="16" width="16" alt="" /></td><td width="122" class="small"><p><span class="ast">未显示需要 JavaScript 的文档选项</span></p></td></tr></NOSCRIPT></FORM></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD class=v14-header-1-small></TD></TR></TBODY></TABLE>
<TABLE class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=no-padding width=150>
<TABLE cellSpacing=0 cellPadding=0 width=143 border=0>
<TBODY>
<TR vAlign=top>
<TD width=8><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></TD>
<TD></TD>
<TD width=125>
<P><B><FONT face=Verdana color=#5c81a7 size=2></FONT></B>&nbsp;</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE>
<P>级别: 中级</P>
<P><A href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#author"><FONT color=#5c81a7>M. Tim Jones </FONT></A>，资深软件工程师，Emulex<BR></P>
<P>2006 年 2 月 13 日</P>
<BLOCKQUOTE>使用 Sockets API，我们可以开发客户机和服务器应用程序，它们可以在本地网络上进行通信，也可以通过 Internet 在全球范围内进行通信。与其他 API 一样，您可以通过一些方法使用 Sockets API，从而提高 Socket 的性能，或者限制 Socket 的性能。本文探索了 4 种使用 Sockets API 来榨取应用程序的最大性能并对 GNU/Linux® 环境进行优化从而达到最好结果的方法。</BLOCKQUOTE>
<P>在开发 socket 应用程序时，首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示，您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。</P>
<P>为了能够开发性能卓越的应用程序，请遵循以下技巧：</P>
<UL>
<LI>最小化报文传输的延时。 
<LI>最小化系统调用的负载。 
<LI>为 Bandwidth Delay Product 调节 TCP 窗口。 
<LI>动态优化 GNU/Linux TCP/IP 栈。</LI></UL>
<P><A name=IDAZS2YB><SPAN class=atitle><STRONG><FONT size=4>技巧 1. 最小化报文传输的延时</FONT></STRONG></SPAN></A></P>
<P>在通过 TCP socket 进行通信时，数据都拆分成了数据块，这样它们就可以封装到给定连接的 TCP payload（指 TCP 数据包中的有效负荷）中了。TCP payload 的大小取决于几个因素（例如最大报文长度和路径），但是这些因素在连接发起时都是已知的。为了达到最好的性能，我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充 payload 时（也称为<I>最大报文段长度（maximum segment size）</I> 或 MSS），TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率，并减轻整体的网络拥塞问题。</P>
<P>尽管 John Nagle 的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量，但是有时您可能希望只发送一些较小的报文。一个简单的例子是 telnet 程序，它让用户可以与远程系统进行交互，这通常都是通过一个 shell 来进行的。如果用户被要求用发送报文之前输入的字符来填充某个报文段，那么这种方法就绝对不能满足我们的需要。</P>
<P>另外一个例子是 HTTP 协议。通常，客户机浏览器会产生一个小请求（一条 HTTP 请求消息），然后 Web 服务器就会返回一个更大的响应（Web 页面）。</P>
<P><A name=IDAFT2YB><SPAN class=smalltitle><STRONG>解决方案</STRONG></SPAN></A></P>
<P>您应该考虑的第一件事情是 Nagle 算法满足一种需求。由于这种算法对数据进行合并，试图构成一个完整的 TCP 报文段，因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文的数量，因此可以最小化网络拥塞的问题。</P>
<P>但是在需要最小化传输延时的情况中，Sockets API 可以提供一种解决方案。要禁用 Nagle 算法，您可以设置 <CODE><FONT face=Courier size=2>TCP_NODELAY</FONT></CODE> socket 选项，如清单 1 所示。</P><BR><A name=IDAVT2YB><B>清单 1. 为 TCP socket 禁用 Nagle 算法</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">int sock, flag, ret;

/* Create new stream socket */
sock = <SPAN class=boldcode><STRONG>socket</STRONG></SPAN>( AF_INET, SOCK_STREAM, 0 );

/* Disable the Nagle (TCP No Delay) algorithm */
flag = 1;
ret = <SPAN class=boldcode><STRONG>setsockopt</STRONG></SPAN>( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&amp;flag, sizeof(flag) );

if (ret == -1) {
  printf("Couldn't setsockopt(TCP_NODELAY)\n");
  exit(-1);
}
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P><B>提示：</B>使用 Samba 的实验表明，在从 Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时，禁用 Nagle 算法几乎可以加倍提高读性能。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=IDACU2YB><SPAN class=atitle><STRONG><FONT size=4>技巧 2. 最小化系统调用的负载</FONT></STRONG></SPAN></A></P>
<P>任何时候通过一个 socket 来读写数据时，您都是在使用一个<I>系统调用（system call）</I>。这个调用（例如 <CODE><FONT face=Courier size=2>read</FONT></CODE> 或 <CODE><FONT face=Courier size=2>write</FONT></CODE>）跨越了用户空间应用程序与内核的边界。另外，在进入内核之前，您的调用会通过 C 库来进入内核中的一个通用函数（<CODE><FONT face=Courier size=2>system_call()</FONT></CODE>）。从 <CODE><FONT face=Courier size=2>system_call()</FONT></CODE> 中，这个调用会进入文件系统层，内核会在这儿确定正在处理的是哪种类型的设备。最后，调用会进入 socket 层，数据就是在这里进行读取或进行排队从而通过 socket 进行传输的（这涉及数据的副本）。</P>
<P>这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的，而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高，因此调用次数越多，通过这个调用链进行的工作所需要的时间就越长，应用程序的性能也就越低。</P>
<P>由于我们无法避免这些系统调用，因此惟一的选择是最小化使用这些调用的次数。幸运的是，我们可以对这个过程进行控制。</P>
<P><A name=IDA4U2YB><SPAN class=smalltitle><STRONG>解决方案</STRONG></SPAN></A></P>
<P>在将数据写入一个 socket 时，尽量一次写入所有的数据，而不是执行多次写数据的操作。对于读操作来说，最好传入可以支持的最大缓冲区，因为如果没有足够多的数据，内核也会试图填充整个缓冲区（另外还需要保持 TCP 的通告窗口为打开状态）。这样，您就可以最小化调用的次数，并可以实现更好的整体性能。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=IDAFV2YB><SPAN class=atitle><STRONG><FONT size=4>技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口</FONT></STRONG></SPAN></A></P>
<P>TCP 的性能取决于几个方面的因素。两个最重要的因素是<I>链接带宽（link bandwidth）</I>（报文在网络上传输的速率）和 <I>往返时间（round-trip time）</I> 或 RTT（发送报文与接收到另一端的响应之间的延时）。这两个值确定了称为 <I>Bandwidth Delay Product</I>（BDP）的内容。</P>
<P>给定链接带宽和 RTT 之后，您就可以计算出 BDP 的值了，不过这代表什么意义呢？BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小（其中保存了排队等待传输和等待应用程序接收的数据）。如果缓冲区太小，那么 TCP 窗口就不能完全打开，这会对性能造成限制。如果缓冲区太大，那么宝贵的内存资源就会造成浪费。如果您设置的缓冲区大小正好合适，那么就可以完全利用可用的带宽。下面我们来看一个例子：</P>
<P><CODE><FONT face=Courier size=2>BDP = link_bandwidth * RTT</FONT></CODE></P>
<P>如果应用程序是通过一个 100Mbps 的局域网进行通信，其 RRT 为 50 ms，那么 BDP 就是：</P>
<P><CODE><FONT face=Courier size=2>100MBps * 0.050 sec / 8 = 0.625MB = 625KB</FONT></CODE></P>
<P><B>注意：</B>此处除以 8 是将位转换成通信使用的字节。</P>
<P>因此，我们可以将 TCP 窗口设置为 BDP 或 1.25MB。但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB，这会将连接的带宽限制为 2.2MBps，计算方法如下：</P>
<P><CODE><FONT face=Courier size=2>throughput = window_size / RTT<BR><BR>110KB / 0.050 = 2.2MBps</FONT></CODE></P>
<P>如果使用上面计算的窗口大小，我们得到的带宽就是 12.5MBps，计算方法如下：</P>
<P><CODE><FONT face=Courier size=2>625KB / 0.050 = 12.5MBps </FONT></CODE></P>
<P>差别的确很大，并且可以为 socket 提供更大的吞吐量。因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了。但是又该如何来改变呢？</P>
<P><A name=IDAOW2YB><SPAN class=smalltitle><STRONG>解决方案</STRONG></SPAN></A></P>
<P>Sockets API 提供了几个 socket 选项，其中两个可以用于修改 socket 的发送和接收缓冲区的大小。清单 2 展示了如何使用 <CODE><FONT face=Courier size=2>SO_SNDBUF</FONT></CODE> 和 <CODE><FONT face=Courier size=2>SO_RCVBUF</FONT></CODE> 选项来调整发送和接收缓冲区的大小。</P>
<P><B>注意：</B>尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小，但是 TCP 还在通告窗口内维护了一个拥塞窗口。因此，由于这个拥塞窗口的存在，给定的 socket 可能永远都不会利用最大的通告窗口。</P><BR><A name=IDAEX2YB><B>清单 2. 手动设置发送和接收 socket 缓冲区大小</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">int ret, sock, sock_buf_size;

sock = <SPAN class=boldcode><STRONG>socket</STRONG></SPAN>( AF_INET, SOCK_STREAM, 0 );

sock_buf_size = BDP;

ret = <SPAN class=boldcode><STRONG>setsockopt</STRONG></SPAN>( sock, SOL_SOCKET, SO_SNDBUF,
                   (char *)&amp;sock_buf_size, sizeof(sock_buf_size) );

ret = <SPAN class=boldcode><STRONG>setsockopt</STRONG></SPAN>( sock, SOL_SOCKET, SO_RCVBUF,
                   (char *)&amp;sock_buf_size, sizeof(sock_buf_size) );
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P>在 Linux 2.6 内核中，发送缓冲区的大小是由调用用户来定义的，但是接收缓冲区会自动加倍。您可以进行 <CODE><FONT face=Courier size=2>getsockopt</FONT></CODE> 调用来验证每个缓冲区的大小。</P>
<TABLE cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
<TBODY>
<TR>
<TD width=10><IMG height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></TD>
<TD>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=1>
<TBODY>
<TR>
<TD bgColor=#eeeeee><A name=IDAXX2YB><B>巨帧（jumbo frame）</B></A><BR>
<P>我们还可以考虑将包的大小从 1,500 字节修改为 9,000 字节（称为巨帧）。在本地网络中可以通过设置最大传输单元（Maximum Transmit Unit，MTU）来设置巨帧，这可以极大地提高性能。</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P>就 window scaling 来说，TCP 最初可以支持最大为 64KB 的窗口（使用 16 位的值来定义窗口的大小）。采用 window scaling（RFC 1323）扩展之后，您就可以使用 32 位的值来表示窗口的大小了。GNU/Linux 中提供的 TCP/IP 栈可以支持这个选项（以及其他一些选项）。</P>
<P><B>提示：</B>Linux 内核还包括了自动对这些 socket 缓冲区进行优化的能力（请参阅下面 <A href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#table1"><FONT color=#5c81a7>表 1</FONT></A> 中的 <CODE><FONT face=Courier size=2>tcp_rmem</FONT></CODE> 和 <CODE><FONT face=Courier size=2>tcp_wmem</FONT></CODE>），不过这些选项会对整个栈造成影响。如果您只需要为一个连接或一类连接调节窗口的大小，那么这种机制也许不能满足您的需要了。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=IDAQAGEC><SPAN class=atitle><STRONG><FONT size=4>技巧 4. 动态优化 GNU/Linux TCP/IP 栈</FONT></STRONG></SPAN></A></P>
<P>标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。</P>
<P><A name=IDAXAGEC><SPAN class=smalltitle><STRONG>解决方案</STRONG></SPAN></A></P>
<P>GNU/Linux 提供了很多可调节的内核参数，您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响 socket 性能的一些更重要的选项。</P>
<P>在 <CODE><FONT face=Courier size=2>/proc</FONT></CODE> 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数，它们可以通过 <CODE><FONT face=Courier size=2>cat</FONT></CODE> 工具进行读取，或使用 <CODE><FONT face=Courier size=2>echo</FONT></CODE> 命令进行修改。清单 3 展示了如何查询或启用一个可调节的参数（在这种情况中，可以在 TCP/IP 栈中启用 IP 转发）。</P><BR><A name=IDAPBGEC><B>清单 3. 调优：在 TCP/IP 栈中启用 IP 转发</B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE class=section>
<FONT face="Lucida Console">[root@camus]# cat /proc/sys/net/ipv4/ip_forward
0
[root@camus]# echo "1" &gt; /poc/sys/net/ipv4/ip_forward
[root@camus]# cat /proc/sys/net/ipv4/ip_forward
1
[root@camus]#
</FONT></CODE></PRE></TD></TR></TBODY></TABLE><BR>
<P><A name=table1>表 1</A> 给出了几个可调节的参数，它们可以帮助您提高 Linux TCP/IP 栈的性能。</P>
<TABLE class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 1. Kernel tunable parameters for TCP/IP stack performance" border=0>
<CAPTION><STRONG><FONT face=Verdana color=#ffffff>表 1. TCP/IP 栈性能使用的可调节内核参数</FONT></STRONG></CAPTION>
<TBODY>
<TR>
<TH>可调节的参数</TH>
<TH>默认值</TH>
<TH>选项说明</TH></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/core/rmem_default</FONT></CODE></TD>
<TD vAlign=top>"110592"</TD>
<TD>定义默认的接收窗口大小；对于更大的 BDP 来说，这个大小也应该更大。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/core/rmem_max</FONT></CODE></TD>
<TD vAlign=top>"110592"</TD>
<TD>定义接收窗口的最大大小；对于更大的 BDP 来说，这个大小也应该更大。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/core/wmem_default</FONT></CODE></TD>
<TD vAlign=top>"110592"</TD>
<TD>定义默认的发送窗口大小；对于更大的 BDP 来说，这个大小也应该更大。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/core/wmem_max</FONT></CODE></TD>
<TD vAlign=top>"110592"</TD>
<TD>定义发送窗口的最大大小；对于更大的 BDP 来说，这个大小也应该更大。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_window_scaling</FONT></CODE></TD>
<TD vAlign=top>"1"</TD>
<TD>启用 RFC 1323 定义的 window scaling；要支持超过 64KB 的窗口，必须启用该值。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_sack</FONT></CODE></TD>
<TD vAlign=top>"1"</TD>
<TD>启用有选择的应答（Selective Acknowledgment），这可以通过有选择地应答乱序接收到的报文来提高性能（这样可以让发送者只发送丢失的报文段）；（对于广域网通信来说）这个选项应该启用，但是这会增加对 CPU 的占用。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_fack</FONT></CODE></TD>
<TD vAlign=top>"1"</TD>
<TD>启用转发应答（Forward Acknowledgment），这可以进行有选择应答（SACK）从而减少拥塞情况的发生；这个选项也应该启用。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_timestamps</FONT></CODE></TD>
<TD vAlign=top>"1"</TD>
<TD>以一种比重发超时更精确的方法（请参阅 RFC 1323）来启用对 RTT 的计算；为了实现更好的性能应该启用这个选项。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_mem</FONT></CODE></TD>
<TD vAlign=top>"24576 32768 49152"</TD>
<TD>确定 TCP 栈应该如何反映内存使用；每个值的单位都是内存页（通常是 4KB）。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃，从而减少对内存的使用。对于较大的 BDP 可以增大这些值（但是要记住，其单位是内存页，而不是字节）。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_wmem</FONT></CODE></TD>
<TD vAlign=top>"4096 16384 131072"</TD>
<TD>为自动调优定义每个 socket 使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值（该值会被 <CODE><FONT face=Courier size=2>wmem_default</FONT></CODE> 覆盖），缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数（该值会被 <CODE><FONT face=Courier size=2>wmem_max</FONT></CODE> 覆盖）。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_rmem</FONT></CODE></TD>
<TD vAlign=top>"4096 87380 174760"</TD>
<TD>与 <CODE><FONT face=Courier size=2>tcp_wmem</FONT></CODE> 类似，不过它表示的是为自动调优所使用的接收缓冲区的值。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_low_latency</FONT></CODE></TD>
<TD vAlign=top>"0"</TD>
<TD>允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况；这个选项应该禁用。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_westwood</FONT></CODE></TD>
<TD vAlign=top>"0"</TD>
<TD>启用发送者端的拥塞控制算法，它可以维护对吞吐量的评估，并试图对带宽的整体利用情况进行优化；对于 WAN 通信来说应该启用这个选项。</TD></TR>
<TR>
<TD class=tb-row vAlign=top><CODE><FONT face=Courier size=2>/proc/sys/net/ipv4/tcp_bic</FONT></CODE></TD>
<TD vAlign=top>"1"</TD>
<TD>为快速长距离网络启用 Binary Increase Congestion；这样可以更好地利用以 GB 速度进行操作的链接；对于 WAN 通信应该启用这个选项。</TD></TR></TBODY></TABLE><BR>
<P>与任何调优努力一样，最好的方法实际上就是不断进行实验。您的应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数影响性能的方式。在某些情况中，您认为有益的操作可能恰恰是有害的（反之亦然）。因此，我们需要逐一试验各个选项，然后检查每个选项的结果。换而言之，我们需要相信自己的经验，但是对每次修改都要进行验证。</P>
<P><B>提示：</B>下面介绍一个有关永久性配置的问题。注意，如果您重新启动了 GNU/Linux 系统，那么您所需要的任何可调节的内核参数都会恢复成默认值。为了将您所设置的值作为这些参数的默认值，可以使用 <CODE><FONT face=Courier size=2>/etc/sysctl.conf</FONT></CODE> 在系统启动时将这些参数配置成您所设置的值。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=IDAYHGEC><SPAN class=atitle><STRONG><FONT size=4>GNU/Linux 工具</FONT></STRONG></SPAN></A></P>
<P>GNU/Linux 对我非常有吸引力，这是因为其中有很多工具可以使用。尽管其中大部分都是命令行工具，但是它们都非常有用，而且非常直观。GNU/Linux 提供了几个工具 —— 有些是 GNU/Linux 自己提供的，有些是开放源码软件 —— 用于调试网络应用程序，测量带宽/吞吐量，以及检查链接的使用情况。</P>
<P>表 2 列出最有用的几个 GNU/Linux 工具，以及它们的用途。表 3 列出了 GNU/Linux 发行版没有提供的几个有用工具。有关表 3 中工具的更多信息请参阅 <A href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#resources"><FONT color=#5c81a7>参考资料</FONT></A>。</P>
<TABLE class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 2. Native tools commonly found in any GNU/Linux distribution" border=0>
<CAPTION><STRONG><FONT face=Verdana color=#ffffff>表 2. 任何 GNU/Linux 发行版中都可以找到的工具</FONT></STRONG></CAPTION>
<TBODY>
<TR>
<TH>GNU/Linux 工具</TH>
<TH>用途</TH></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>ping</FONT></CODE></TD>
<TD>这是用于检查主机的可用性的最常用的工具，但是也可以用于识别带宽延时产品计算的 RTT。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>traceroute</FONT></CODE></TD>
<TD>打印某个连接到网络主机所经过的包括一系列路由器和网关的路径（路由），从而确定每个 hop 之间的延时。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>netstat</FONT></CODE></TD>
<TD>确定有关网络子系统、协议和连接的各种统计信息。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>tcpdump</FONT></CODE></TD>
<TD>显示一个或多个连接的协议级的报文跟踪信息；其中还包括时间信息，您可以使用这些信息来研究不同协议服务的报文时间。</TD></TR></TBODY></TABLE><BR>
<TABLE class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 3. Useful performance tools not typically available in a GNU/Linux distribution" border=0>
<CAPTION><STRONG><FONT face=Verdana color=#ffffff>表 3. GNU/Linux 发行版中没有提供的有用性能工具</FONT></STRONG></CAPTION>
<TBODY>
<TR>
<TH>GNU/Linux 工具</TH>
<TH>用途</TH></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>netlog</FONT></CODE></TD>
<TD>为应用程序提供一些有关网络性能方面的信息。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>nettimer</FONT></CODE></TD>
<TD>为瓶颈链接带宽生成一个度量标准；可以用于协议的自动优化。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>Ethereal</FONT></CODE></TD>
<TD>以一个易于使用的图形化界面提供了 <CODE><FONT face=Courier size=2>tcpump</FONT></CODE>（报文跟踪）的特性。</TD></TR>
<TR>
<TD class=tb-row><CODE><FONT face=Courier size=2>iperf</FONT></CODE></TD>
<TD>测量 TCP 和 UDP 的网络性能；测量最大带宽，并汇报延时和数据报的丢失情况。</TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=IDA5KGEC><SPAN class=atitle><STRONG><FONT size=4>结束语</FONT></STRONG></SPAN></A></P>
<P>尝试使用本文中介绍的技巧和技术来提高 socket 应用程序的性能，包括通过禁用 Nagle 算法来减少传输延时，通过设置缓冲区的大小来提高 socket 带宽的利用，通过最小化系统调用的个数来降低系统调用的负载，以及使用可调节的内核参数来优化 Linux 的 TCP/IP 栈。</P>
<P>在进行优化时还需要考虑应用程序的特性。例如，您的应用程序是基于 LAN 的还是会通过 Internet 进行通信？如果您的应用程序仅仅会在 LAN 内部进行操作，那么增大 socket 缓冲区的大小可能不会带来太大的改进，不过启用巨帧却一定会极大地改进性能！</P>
<P>最后，还要使用 <CODE><FONT face=Courier size=2>tcpdump</FONT></CODE> 或 <CODE><FONT face=Courier size=2>Ethereal</FONT></CODE> 来检查优化之后的结果。在报文级看到的变化可以帮助展示使用这些技术进行优化之后所取得的成功效果。</P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><IMG height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><BR></TD>
<TD vAlign=top align=right><A class=fbox href="http://www-128.ibm.com/developerworks/cn/linux/l-hisock.html?ca=dwcn-newsletter-linux#main"><B><FONT face=Verdana color=#5c81a7>回页首</FONT></B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><BR>
<P><A name=resources><SPAN class=atitle><STRONG><FONT size=4>参考资料 </FONT></STRONG></SPAN></A></P><STRONG>学习</STRONG><BR>
<UL>
<LI>您可以参阅本文在 developerWorks 全球站点上的 <A href="http://www.ibm.com/developerworks/linux/library/l-hisock.html" target=_blank><FONT color=#5c81a7>英文原文</FONT></A>。<BR><BR>
<LI>两部分的系列文章 “<A href="http://www-128.ibm.com/developerworks/cn/views/linux/tutorials.jsp?view_by=search&amp;search_by=Linux+socket+%E7%BC%96%E7%A8%8B"><FONT color=#5c81a7>Linux Socket 编程</FONT></A>”（developerWorks，2003 年 10 月和 2004 年 1 月）可以帮助您编写 socket 应用程序。 <BR><BR>
<LI>请参阅 Pittsburgh Supercomputing Center 有关 <A href="http://www.psc.edu/networking/projects/tcpfriendly/"><FONT color=#5c81a7>TCP 友好的拥塞控制算法</FONT></A> 的其他文章。 <BR><BR>
<LI>增大 MTU 可以极大地影响性能。请参阅更多有关 <A href="http://sd.wareonearth.com/~phil/jumbo.html"><FONT color=#5c81a7>巨帧</FONT></A> 及其优点的内容。 <BR><BR>
<LI>请参阅 <A href="http://www.icir.org/"><FONT color=#5c81a7>ICSI Center for Internet Research</FONT></A> 有关 <A href="http://www.icir.org/floyd/sacks.html"><FONT color=#5c81a7>选择性应答</FONT></A> 的文章。 <BR><BR>
<LI>查看 <A href="http://www.cs.ucla.edu/NRL/hpi/tcpw/"><FONT color=#5c81a7>TCP Westwood 主页</FONT></A>，了解更多有关 TCP Westwood 算法的详细内容。 <BR><BR>
<LI>研究 North Carolina State University 的 <A href="http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/"><FONT color=#5c81a7>Binary Increase Congestion TCP</FONT></A>。 <BR><BR>
<LI>请阅读本文作者编写的书 <A href="http://www.charlesriver.com/Books/BookDetail.aspx?productID=70637"><I><FONT color=#5c81a7>BSD Sockets Programming from a Multilanguage Perspective</FONT></I></A>（Charles River Media，2003 年 9 月），其中介绍了使用 6 种不同的语言来编写 socket 程序的技术。 <BR><BR>
<LI>在 <A href="http://www.ibm.com/developerworks/cn/linux/"><FONT color=#5c81a7>developerWorks Linux 专区</FONT></A> 中可以找到为 Linux 开发人员准备的更多资源。 <BR><BR>
<LI>跟踪 <A href="http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGX03&amp;S_CMP=art"><FONT color=#5c81a7>developerWorks 技术事件和 Webcasts</FONT></A> 的最新进展。 </LI></UL><BR><B>获得产品和技术</B><BR>
<UL>
<LI>您可以将 <A href="http://dast.nlanr.net/Projects/Netlog/"><FONT color=#5c81a7>netlog 库</FONT></A> 链接到一个应用程序，以便为性能分析提供方便。 <BR><BR>
<LI><A href="http://www.ethereal.com/"><FONT color=#5c81a7>Ethereal</FONT></A> 是一个图形化的网络协议分析器，其中包括了用于协议分析的插件架构。 <BR><BR>
<LI>请阅读 <A href="http://nlanr.net/"><FONT color=#5c81a7>National Laboratory for Applied Network Research</FONT></A> 上更多有关 <A href="http://dast.nlanr.net/Projects/Iperf/"><FONT color=#5c81a7>Iperf 工具</FONT></A> 的内容。 <BR><BR>
<LI><A href="http://www.ibm.com/developerworks/offers/sek/?S_TACT=105AGX03"><FONT color=#5c81a7>订购免费的 SEK for Linux</FONT></A>，这有两张 DVD，包括最新的 IBM for Linux 的试用软件，包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。 <BR><BR>
<LI>在您的下一个开发项目中采用 <A href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX03"><FONT color=#5c81a7>IBM 试用软件</FONT></A>，这可以从 developerWorks 上直接下载。<BR><BR><BR></LI></UL><BR><B>讨论</B><BR>
<UL>
<LI>通过参与 <A href="http://www.ibm.com/developerworks/blogs/"><FONT color=#5c81a7>developerWorks blogs</FONT></A> 加入 developerWorks 社区。<BR><BR></LI></UL></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/darkbluefeeling/aggbug/30741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/darkbluefeeling/" target="_blank">深蓝色心情</a> 2006-02-15 09:34 <a href="http://www.blogjava.net/darkbluefeeling/archive/2006/02/15/30741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Database 10g (10.1.0.2) Installation On RedHat Advanced Server 4.0</title><link>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28647.html</link><dc:creator>深蓝色心情</dc:creator><author>深蓝色心情</author><pubDate>Thu, 19 Jan 2006 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28647.html</guid><wfw:comment>http://www.blogjava.net/darkbluefeeling/comments/28647.html</wfw:comment><comments>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/darkbluefeeling/comments/commentRss/28647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/darkbluefeeling/services/trackbacks/28647.html</trackback:ping><description><![CDATA[
<a id="Top"></a>
<h1>Oracle Database 10g (10.1.0.2) Installation On RedHat Advanced Server 4.0</h1>

In this article I'll describe the installation of Oracle Database 10g (10.1.0.2) on RedHat Advanced Server 4.0.
The article is based on a server installation with a minimum of 2G swap, secure Linux disabled and the following package groups installed:<br />

<ul>
  <li>X Window System</li>
  <li>GNOME Desktop Environment</li>
  <li>Editors</li>
  <li>Graphical Internet</li>
  <li>Text-based Internet</li>
  <li>Server Configuration Tools</li>
  <li>Development Tools</li>
  <li>Administration Tools</li>
  <li>System Tools</li>
</ul>

Alternative installations may require additional packages to be loaded in addition to the ones listed below.<br />

<ul>
  <li><a href="#DownloadSoftware">Download Software</a></li>
  <li><a href="#UnpackFiles">Unpack Files</a></li>
  <li><a href="#HostsFile">Hosts File</a></li>
  <li><a href="#SetKernelParameters">Set Kernel Parameters</a></li>
  <li><a href="#Setup">Setup</a></li>
  <li><a href="#Installation">Installation</a></li>
  <li><a href="#PostInstallation">Post Installation</a></li>
</ul>

<a id="DownloadSoftware"></a><h2>Download Software</h2>

Download the following software:<br />

<ul>
  <li><a href="http://otn.oracle.com/software/products/database/oracle10g/index.html">Oracle Database 10g (10.1.0.2) Software</a></li>
</ul>

<a id="UnpackFiles"></a><h2>Unpack Files</h2>

First unzip the files:<br />

<blockquote><pre>
gunzip ship.db.cpio.gz</pre></blockquote>

Next unpack the contents of the files:<br />

<blockquote><pre>
cpio -idmv &lt; ship.db.cpio</pre></blockquote>

You should now have a single directory (Disk1) containing installation files.<br />

<a id="HostsFile"></a><h2>Hosts File</h2>

The /etc/hosts file must contain a fully qualified name for the server:<br />

<blockquote><pre>
&lt;IP-address&gt;  &lt;fully-qualified-machine-name&gt;  &lt;machine-name&gt;</pre></blockquote>

<a id="SetKernelParameters"></a><h2>Set Kernel Parameters</h2>

Add the following lines to the /etc/sysctl.conf file:<br />

<blockquote><pre>
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000</pre></blockquote>

Run the following command to change the current kernel parameters:<br />

<blockquote><pre>
/sbin/sysctl -p</pre></blockquote>


Add the following lines to the /etc/security/limits.conf file:<br />

<blockquote><pre>
*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536</pre></blockquote>

Add the following line to the /etc/pam.d/login file, if it does not already exist:<br />

<blockquote><pre>
session    required     /lib/security/pam_limits.so</pre></blockquote>

Note by Kent Anderson: In the event that pam_limits.so cannot set privilidged limit settings see <a href="http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=115442">Bug 115442</a>.<br />

<br />

Disable secure linux by editing the /etc/selinux/config file, making sure the SELINUX flag is set as follows:<br />

<blockquote><pre>
SELINUX=disabled</pre></blockquote>

Alternatively, this alteration can be done using the GUI tool (Applications > System Settings > Security Level). Click on the SELinux tab and disable the feature.<br />

<a id="Setup"></a><h2>Setup</h2>

Install the following packages:<br />

<blockquote><pre>
# From RedHat AS4 Disk 2
cd /media/cdrom/RedHat/RPMS
rpm -Uvh setarch-1.6-1.i386.rpm
rpm -Uvh compat-libstdc++-33-3.2.3-47.3.i386.rpm

# From RedHat AS4 Disk 3
cd /media/cdrom/RedHat/RPMS
rpm -Uvh openmotif-2.2.3-6.RHEL4.2.i386.rpm
rpm -Uvh compat-db-4.1.25-9.i386.rpm

# From RedHat AS4 Disk 4
cd /media/cdrom/RedHat/RPMS
rpm -Uvh compat-gcc-32-3.2.3-47.3.i386.rpm
rpm -Uvh compat-gcc-32-c++-3.2.3-47.3.i386.rpm</pre></blockquote>

Create the new groups and users:<br />

<blockquote><pre>
groupadd oinstall
groupadd dba
groupadd oper

useradd -g oinstall -G dba oracle
passwd oracle</pre></blockquote>

Create the directories in which the Oracle software will be installed:<br />

<blockquote><pre>
mkdir -p /u01/app/oracle/product/10.1.0/db_1
chown -R oracle.oinstall /u01</pre></blockquote>

Login as root and issue the following command:<br />

<blockquote><pre>
xhost +&lt;machine-name&gt;</pre></blockquote>

Edit the /etc/redhat-release file replacing the current release information (Red Hat Enterprise Linux AS release 4 (Nahant)) with the following:<br />

<blockquote><pre>
redhat-3</pre></blockquote>

Login as the oracle user and add the following lines at the end of the .bash_profile file:<br />

<blockquote><pre>
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1; export ORACLE_HOME
ORACLE_SID=TSH1; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
#LD_ASSUME_KERNEL=2.4.1; export LD_ASSUME_KERNEL

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi</pre></blockquote>

<a id="Installation"></a><h2>Installation</h2>

Log into the oracle user. If you are using X emulation then set the DISPLAY environmental variable:<br />

<blockquote><pre>
DISPLAY=&lt;machine-name&gt;:0.0; export DISPLAY</pre></blockquote>

Start the Oracle Universal Installer (OUI) by issuing the following command in the Disk1 directory:<br />

<blockquote><pre>
./runInstaller</pre></blockquote>


During the installation enter the appropriate ORACLE_HOME and name then continue with a "software only" installation.<br />

<a id="PostInstallation"></a><h2>Post Installation</h2>

Create a new instance using the DBCA. If you get the "ORA-27125: unable to create shared memory segment" error when using the DBCA issue the following
commands as the oracle user then try again:<br />

<blockquote><pre>
cd $ORACLE_HOME/bin

mv oracle oracle.bin

cat >oracle <<"EOF"
#!/bin/bash
 
export DISABLE_HUGETLBFS=1
exec $ORACLE_HOME/bin/oracle.bin $@
EOF
 
chmod +x oracle</pre></blockquote>

I didn't encounter the previous issue myself, so hopefully you won't either.<br />

<br />

Edit the /etc/redhat-release file restoring the original release information:<br />

<blockquote><pre>
Red Hat Enterprise Linux AS release 4 (Nahant)</pre></blockquote>

Finally edit the /etc/oratab file setting the restart flag for each instance to 'Y':<br />

<blockquote><pre>
TSH1:/u01/app/oracle/product/10.1.0/db_1:Y</pre></blockquote>

Create a file called /etc/init.d/dbora containing the following:<br />

<blockquote><pre>
#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 20 80
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the 
# Oracle database in ORA_HOME.
ORA_HOME=/u01/app/oracle/product/10.1.0/db_1
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
    echo "Oracle startup: cannot start"
    exit
fi
case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
        su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login 
        # will not prompt the user for any values
        su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
        ;;
esac</pre></blockquote>

Use chmod to set the privileges to 750:<br />

<blockquote><pre>
chmod 750 /etc/init.d/dbora</pre></blockquote>

Link the file into the appropriate run-level script directories:<br />

<blockquote><pre>
ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora</pre></blockquote>

Associate the dbora service with the appropriate run levels:<br />

<blockquote><pre>
chkconfig --level 345 dbora on</pre></blockquote>

The relevant instances should now startup/shutdown automatically at system startup/shutdown.<br />

<br />

For more information see:<br />

<ul>
  <li><a href="http://download-uk.oracle.com/docs/html/B10811_01/toc.htm">Oracle Database Installation Guide 10g Release 1 (10.1) for UNIX Systems</a></li>
  <li><a href="http://www.puschitz.com/InstallingOracle10g.shtml">Installing Oracle Database 10g on Red Hat Enterprise Linux AS 3 and 2.1, Red Hat 9, and on Red Hat Fedora Core 1</a></li>
  <li><a href="http://staff.in2.hr/denis/oracle/index.html">Oracle on Linux</a></li>
</ul>

Hope this helps. Regards Tim...<br />

<br />

<a href="#Top">Back to the Top.</a><br /><img src ="http://www.blogjava.net/darkbluefeeling/aggbug/28647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/darkbluefeeling/" target="_blank">深蓝色心情</a> 2006-01-19 14:08 <a href="http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Installing Oracle 9i on Red Hat Linux (RHEL 4, 3, 2.1, RH 9, 8.0, 7.3, 7.2, 7.1) x86</title><link>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28644.html</link><dc:creator>深蓝色心情</dc:creator><author>深蓝色心情</author><pubDate>Thu, 19 Jan 2006 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28644.html</guid><wfw:comment>http://www.blogjava.net/darkbluefeeling/comments/28644.html</wfw:comment><comments>http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/darkbluefeeling/comments/commentRss/28644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/darkbluefeeling/services/trackbacks/28644.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Here is a summary (HOWTO) how I installed: Oracle 9iR2 (9.2.0.6.0) Database on Red Hat Advanced Server 4 (x86, kernel 2.6.9-5.EL, glibc-2.3.4-2) Oracle 9iR2 (9.2.0) Database on Red Hat Advanced Server...&nbsp;&nbsp;<a href='http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28644.html'>阅读全文</a><img src ="http://www.blogjava.net/darkbluefeeling/aggbug/28644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/darkbluefeeling/" target="_blank">深蓝色心情</a> 2006-01-19 13:51 <a href="http://www.blogjava.net/darkbluefeeling/archive/2006/01/19/28644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>