linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > unix > unix入门 >
栏目导栏
资料搜索
热门文章
·SCO OpenServer系统手册
·solaris迅速查找手册
·UNIX常用命令-目录及文件操作命
·常见的“压缩与解压缩”方法
·SUN的入门培训资料
·Solaris FAQ 1.2
·UNIX系统操作入门篇
·unix大全下载基地
·教你如何配置安全的SOLARIS系统
·吐血奉献.samba安装设置!
·solaris常用命令及简单解释
·UNIX 常识总集~!
·Windows XP 与 Solaris 10 双操
·隆重推荐:Solaris硬盘分区简介
·UNIX基础知识
最新文章
·Solaris SSH的配置和管理介绍
·在Unix环境下mount ISO文件
·Solaris 管理员常用的168条命令
·solaris raid 制作大集合
·在Solaris下使用USB存储设备
·SecureCRT访问HPUX没办法用vi问
·scounix网络设置心得
·solaris网络配置
·solaris上直接运行linux二进制
·HP Unix的补丁安装
·系统备份与恢复命令:fbackup+
·Oracle 10g基于Solaris 9 x86平
·完全硬盘安装solaris10
·solaris点滴9.29-10.07
·solaris volume manager do RA
Google
 
ndd 命令中各项参数详解
[ 作者:Linux联盟收集  加入时间:2006-07-19 12:49:27  来自:Linux联盟收集 ]
http://www.sean.de/Solaris/soltune.html R4bLinux联盟
  R4bLinux联盟
SolarisTM 2.x - Tuning Your TCP/IP Stack and More R4bLinux联盟
R4bLinux联盟
R4bLinux联盟
Last update: 24.05.2002 (change log) R4bLinux联盟
R4bLinux联盟
Please check your location line carefully. If you don't see http://www.sean.de/Solaris/ in your location bar, you might want to check with the original site for the most up to date information. R4bLinux联盟
R4bLinux联盟
Important Notice!  R4bLinux联盟
SUN managed to publish a Solaris Tunable Parameters Reference Manual, applying to Solaris 8, HW 2/02, and Solaris Tunable Parameters Reference Manual, applying to Solaris 9, HW 9/02. You might want to check there for anything you miss here. Another good read is Solaris Operating Environment Network Settings for Security, if you are concerned about security and denial-of-service attacks. R4bLinux联盟
R4bLinux联盟
Table of contents R4bLinux联盟
Introduction  R4bLinux联盟
1.1 History  R4bLinux联盟
1.2 Quick intro into ndd  R4bLinux联盟
1.3 How to read this document  R4bLinux联盟
TCP connection initiation  R4bLinux联盟
Retransmission related parameters  R4bLinux联盟
Path MTU discovery  R4bLinux联盟
Further advice, hints and remarks  R4bLinux联盟
5.1 Common TCP timers  R4bLinux联盟
5.2 Erratic IPX behaviors  R4bLinux联盟
5.3 Common IP parameters  R4bLinux联盟
5.4 TCP and UDP port related parameters  R4bLinux联盟
Windows, buffers and watermarks  R4bLinux联盟
Tuning your system  R4bLinux联盟
7.1 Things to watch  R4bLinux联盟
7.2 General entries in the file /etc/system  R4bLinux联盟
7.3 System V IPC related entries  R4bLinux联盟
7.4 How to find further entries  R4bLinux联盟
100 Mbit ethernet and related entries R4bLinux联盟
R4bLinux联盟
8.1 The hme interface  R4bLinux联盟
8.2 Other problems  R4bLinux联盟
Recommended patches  R4bLinux联盟
Literature  R4bLinux联盟
10.1 Books  R4bLinux联盟
10.2 Internet resources  R4bLinux联盟
10.3 RFC, mentioned and otherwise  R4bLinux联盟
10.4 Further material  R4bLinux联盟
Solaris' Future  R4bLinux联盟
11.1 Solaris 7  R4bLinux联盟
11.2 Solaris 8  R4bLinux联盟
11.3 Solaris 9  R4bLinux联盟
Uncovered material  R4bLinux联盟
Scripts  R4bLinux联盟
List of things to do  R4bLinux联盟
Appendices are separate documents. They are quoted from within the text, but you might be interested in them when downloading the current document. If you say "print" for this document, the appendices will not be printed. You have to download and print them separately. R4bLinux联盟
R4bLinux联盟
Simple transactions using TCP  R4bLinux联盟
System V IPC parameter  R4bLinux联盟
Retransmission behavior  R4bLinux联盟
Slow start implications  R4bLinux联盟
The change log  R4bLinux联盟
Glossary (first attempt)  R4bLinux联盟
Index (first attempt)  R4bLinux联盟
1. Introduction R4bLinux联盟
Use at your own risk!  R4bLinux联盟
If your system behaves erratically after applying some tweaks, please don't blame me. Remember to have a backup handy before starting to tune. Always make backup copies of the files you are changing. I tried carefully to assemble the information you are seeing here, aimed at improved system performance. As usual, there are no guarantees that what worked for me will work for you. Please don't take my recommendation at heart: They are starting points, not absolutes. Always read my reasoning, don't use them blindly. R4bLinux联盟
R4bLinux联盟
Before you start, you ought to grab a copy of the TCP state transition diagram as specified in RFC 793 on page 23. The drawback is the missing error correction supplied by later RFCs. There is an easier way to obtain blowup printouts to staple to your office walls. Grab a copy of the PostScript file pocket guide, page 2 accompanying Stevens' TCP/IP Illustrated Volume 1 [4]. Or simply open the book at figure 18.12. R4bLinux联盟
R4bLinux联盟
Please share your knowledge  R4bLinux联盟
I try to assemble this page and related material for everybody interested in gaining more from her or his system. If you have an item I didn't cover, but which you deem worthwhile, please write to me. A few dozen or so regular readers of this page will thank you for it. I am only human, thus if you stumble over an error, misconception, or blatant nonsense, please have me correct it. In the past, there were quite a few mistakes. R4bLinux联盟
R4bLinux联盟
The set of documents may look a trifle colorful, or just odd, if your browser supports cascading stylesheets. Care was taken to select the formatting tags in a way that the printed output still resembles the intentions of the author, and that the set of documents is still viewable with browser like Mosaic or Lynx. Stylesheets were used as an optical enhancement. Most notable is the different color of interior and external links. Interior links are shown in greenish colors, and will be rendered within the same frame. External links on the other hand are shown in bluish colors, and all will be shown in the same new frame. If you leave it open, a new external link will be shown within the same window. Literature references within the text are often interior links, pointing to the literature section, where the external links are located. R4bLinux联盟
R4bLinux联盟
1.1 History R4bLinux联盟
This page and the related work have a long history in gathering. I started out peeking wide eyed over the shoulders of two people from a search engine provider when they were installing the German server of a customer of my former employer. My only alternative resource of tuning information was the brilliant book TCP/IP Illustrated 1 [4] by Stevens. I started gathering all information about tuning I was able to get my hands upon. The cumulation of these you are experiencing on these pages. R4bLinux联盟
R4bLinux联盟
1.2 Quick intro into ndd R4bLinux联盟
Solaris allows you to tune, tweak, set and reset various parameters related to the TCP/IP stack while the system is running. Back in the SunOS 4.x days, one had to change various C files in the kernel source tree, generate a new kernel, reboot the machine and try out the changes. The Solaris feature of changing the important parameters on the fly is very convenient. R4bLinux联盟
R4bLinux联盟
Many of the parameters I mention in the rest of the document you are reading are time intervals. All intervals are measured in milliseconds. Other parameters are usually bytecounts, but a few times different units of measurements are used and documented. A few items appear totally unrelated to TCP/IP, but due to the lack of a better framework, they materialized on this page. R4bLinux联盟
R4bLinux联盟
Most tunings can be achieved using the program ndd. Any user may execute this program to read the current settings, depending on the readability of the respective device files. But only the super user is allowed to execute ndd -set to change values. This makes sense considering the sensitive parameters you are tuning. Details on the use of ndd can be obtained from the respective manual page. R4bLinux联盟
R4bLinux联盟
ndd will become your friend, as it is the major tool to tweak most of the parameters described in this document. Therefore you better make yourself familiar with it. A quick overview will be given in this section, too. ndd is not limited to tweaking TCP/IP related parameters. Many other devices, which have a device file underneath /dev and a kernel module can be configured with the help of ndd. For instance, any networking driver which supports the Data Link Provider Interface (DLPI) can be configured. R4bLinux联盟
R4bLinux联盟
The parameters supplied to ndd are symbolic keys indexing either a single usually numerically value, or a table. Please note that the keys usually (but not always) start out with the module or device name. For instance, changing values of the IP driver, you have to use the device file /dev/ip and all parameters start out with ip_. The question mark is the most notable exception to this rule. R4bLinux联盟
R4bLinux联盟
1.2.1 Interactive mode R4bLinux联盟
The interactive mode allows you to inspect and modify a device, driver or module interactively. In order to inspect the available keyword names associated with a parameter, just type the question mark. The next item will explain about the output format of the parameter list. R4bLinux联盟
R4bLinux联盟
# ndd /dev/tcp R4bLinux联盟
name to get/set ? tcp_slow_start_initial R4bLinux联盟
value ?  R4bLinux联盟
length ?  R4bLinux联盟
2 R4bLinux联盟
name to get/set ? ^D R4bLinux联盟
The example above queries the TCP driver for the value of the slow start feature in an interactive fashion. The typed input is shown boldface. R4bLinux联盟
R4bLinux联盟
1.2.2 Show all available parameters R4bLinux联盟
If you are interested in the parameters you can tweak for a given module, query for the question mark. This special parameter name is part of all ndd configurable material. It tells the names of all parameters available - including itself - and the access mode of the parameter. R4bLinux联盟
R4bLinux联盟
# ndd /dev/icmp \? R4bLinux联盟
?                             (read only) R4bLinux联盟
icmp_wroff_extra              (read and write) R4bLinux联盟
icmp_def_ttl                  (read and write) R4bLinux联盟
icmp_bsd_compat               (read and write) R4bLinux联盟
icmp_xmit_hiwat               (read and write) R4bLinux联盟
icmp_xmit_lowat               (read and write) R4bLinux联盟
icmp_recv_hiwat               (read and write) R4bLinux联盟
icmp_max_buf                  (read and write) R4bLinux联盟
Please mind that you have to escape the question mark with a backslash from the shell, if you are querying in the non-interactive fashion as shown above. R4bLinux联盟
R4bLinux联盟
1.2.3 Query the value of one or more parameters (read access) R4bLinux联盟
At the command line, you often need to check on settings of your TCP/IP stack or other parameters. By supplying the parameter name, you can examine the current setting. It is permissible to mention several parameters to check on at once. R4bLinux联盟
R4bLinux联盟
 # ndd /dev/udp udp_smallest_anon_port R4bLinux联盟
 32768 R4bLinux联盟
 # ndd /dev/hme link_status link_speed link_mode R4bLinux联盟
 1 R4bLinux联盟
R4bLinux联盟
 1 R4bLinux联盟
  R4bLinux联盟
 1 R4bLinux联盟
The first example checks on the smallest anonymous port UDP may use when sending a PDU. Please refer to the appropriate section later in this document on the recommended settings for this parameter. R4bLinux联盟
R4bLinux联盟
The second example checks the three important link report values of a 100 Mbit ethernet interface. The results are separated by an empty line, because some parameters may refer to tabular values instead of a single number. R4bLinux联盟
R4bLinux联盟
1.2.4 Modify the value of one parameter (write access) R4bLinux联盟
This mode of interaction with ndd will frequently be found in scripts or when changing value at the command line in a non-interactive fashion. Please note that you may only set one value at a time. The scripts section below contains examples in how to make changes permanent using a startup script. R4bLinux联盟
R4bLinux联盟
 # ndd -set /dev/ip ip_forwarding 0 R4bLinux联盟
The example will stop the forwarding of IP PDUs, even if more than one non-local interface is active and up. Of course, you can only change parameters which are marked for both, reading and writing. R4bLinux联盟
R4bLinux联盟
1.2.5 Further remarks R4bLinux联盟
Andres Kroonmaa kindly supplied a nifty script to check all existing values for a network component (tcp, udp, ip, icmp, etc.). Usually I do the same thing using a small Perl script. R4bLinux联盟
R4bLinux联盟
1.3 How to read this document R4bLinux联盟
This document is separated into several chapters with little inter-relation. It is still advisable to loosely follow the order outlined in the table of contents. R4bLinux联盟
R4bLinux联盟
The first chapter entirely focusses on the TCP connection queues. It is quite long for such small topic, but it is also meant to introduce you into my style of writing. The next chapter deals with TCP retransmission related parameters that you can adjust to your needs. The chapter is more concise. One chapter on deals with path MTU discovery, as there used to be problems with older versions of Solaris. Recent versions usually do not need any adjustments. R4bLinux联盟
R4bLinux联盟
The fifth chapter is a kind of catch-all. Some TCP, some UDP and some IP related parameters are explained (forwarding, port ranges, timers), and a quick detour into bug 1226653 explains that some versions were capable of sending packages larger than the MTU. The following chapter in depth deals with windows, buffers and related issues. R4bLinux联盟
R4bLinux联盟
Chapter seven detours from the ndd interface, and focusses on variables you can set in your /etc/system file, as some things can only be thus managed. Another part of that chapter deals with the hme interface and appropriate tunables. The chapter may be split in future, and parts of it are already found in the appendices. R4bLinux联盟
R4bLinux联盟
The chapter dealing with patches, an important topic with any OS, just points you to various sources, and only mentions some essential things for older versions of Solaris. R4bLinux联盟
R4bLinux联盟
Literature exists in abundance. The literature sections is more a lose collection of links and some books that I consider essential when working with TCP/IP, not limited to Solaris. The RFC sections is kind of hard to keep up-to-date, but then, I reckon you know how to read the rfc-index file. R4bLinux联盟
R4bLinux联盟
The final chapters quickly glance at new or at one time new versions of Solaris - time makes them obsolete. The chapter is there for historical reason, more or less. The scripts sections deals with the nettune script used by YaSSP. It finishes with some TODO material. R4bLinux联盟
R4bLinux联盟
2. TCP connection initiation R4bLinux联盟
This section is dedicated exclusively to the various queues and tunable variable(s) used during connection instantiation. The socket API maintains some control over the queues. But in order to tune anything, you have to understand how listen and accept interact with the queues. For details, see the various Stevens books mentioned in the literature section. R4bLinux联盟
R4bLinux联盟
When the server calls listen, the kernel moves the socket from the TCP state CLOSED into the state LISTEN, thus doing a passive open. All TCP servers work like this. Also, the kernel creates and initializes various data structures, among them the socket buffers and two queues: R4bLinux联盟
R4bLinux联盟
incomplete connection queue  R4bLinux联盟
This queue contains an entry for every SYN that has arrived. BSD sources assign so_q0len entries to this queue. The server sends off the ACK of the client's SYN and the server side SYN. The connection get queued and the kernel now awaits the completion of the TCP three way handshake to open a connection. The socket is in the SYN_RCVD state. On the reception of the client's ACK to the server's SYN, the connection stays one round trip time (RTT) in this queue before the kernel moves the entry into the  R4bLinux联盟
R4bLinux联盟
completed connection queue  R4bLinux联盟
This queue contains an entry for each connection for which the three way handshake is completed. The socket is in the ESTABLISHED state. Each call to accept() removes the front entry of the queue. If there are no entries in the queue, the call to accept usually blocks. BSD source assign a length of so_qlen to this queue. R4bLinux联盟
R4bLinux联盟
Both queues are limited regarding their number of entries. By calling listen(), the server is allowed to specify the size of the second queue for completed connections. If the server is for whatever reason unable to remove entries from the completed connection queue, the kernel is not supposed to queue any more connections. A timeout is associated with each received and queued SYN segment. If the server never receives an acknowledgment for a queued SYN segment, TCP state SYN_RCVD, the time will run out and the connection thrown away. The timeout is an important resistance against SYN flood attacks. R4bLinux联盟
R4bLinux联盟
     R4bLinux联盟
Figure 1: Queues maintained for listening sockets.   Figure 2: TCP three way handshake, connection initiation.  R4bLinux联盟
R4bLinux联盟
Historically, the argument to the listen function specified the maximum number of entries for the sum of both queues. Many BSD derived implementations multiply the argument with a fudge factor of 3/2. Solaris <= 2.5.1 do not use the fudge factor, but adds 1, while Solaris 2.6 does use the fudge factor, though with a slightly different rounding mechanism than the one BSD uses. With a backlog argument of 14, Solaris 2.5.1 servers can queue 15 connections. Solaris 2.6 server can queue 22 connections. R4bLinux联盟
R4bLinux联盟
Stevens shows that the incomplete connection queue does need more entries for busy servers than the completed connection queue. The only reason for specifying a large backlog value is to enable the incomplete connection queue to grow as SYN arrive from clients. Stevens shows that moderately busy webserver has an empty completed connection queue during 99 % of the time, but the incomplete connection queue needed 15 or less entries in 98 % of the time! Just try to imagine what this would mean for a really busy webcache like Squid. R4bLinux联盟
R4bLinux联盟
Data for an established connection which arrives before the connection is accept()ed, should be stored into the socket buffer. If the queues are full when a SYN arrived, it is dropped in the hope that the client will resend it, hopefully finding room in the queues then. R4bLinux联盟
R4bLinux联盟
According to Cockroft [2], there was only one listen queue for unpatched Solari <= 2.5.1. Solari >;= 2.6 or an applied TCP patch 103582-12 or above splits the single queue in the two shown in figure 1. The system administrator is allowed to tweak and tune the various maxima of the queue or queues with Solaris. Depending on whether there are one or two queues, there are different sets of tweakable parameters. R4bLinux联盟
R4bLinux联盟
The old semantics contained just one tunable parameter tcp_conn_req_max which specified the maximum argument for the listen(). The patched versions and Solaris 2.6 replaced this parameter with the two new parameters tcp_conn_req_max_q0 and tcp_conn_req_max_q. A SunWorld article on 2.6 by Adrian Cockroft tells the following about the new parameters: R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max [is] replaced. This value is well-known as it normally needs to be increased for Web servers in older releases of Solaris 2. It no longer exists in Solaris 2.6, and patch 103582-12 adds this feature to Solaris 2.5.1. The change is part of a fix that prevents denial of service from SYN flood attacks. There are now two separate queues of partially complete connections instead of one. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max_q0 is the maximum number of connections with handshake incomplete. A SYN flood attack could only affect this queue, and a special algorithm makes sure that valid connections can still get through. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max_q is the maximum number of completed connections waiting to return from an accept call as soon as the right process gets some CPU time. R4bLinux联盟
R4bLinux联盟
In other words, the first specifies the size of the incomplete connection queue while the second parameters assigns the maximum length of the completed connection queue. All three parameters are covered below. R4bLinux联盟
R4bLinux联盟
You can determine if you need to tweak this set of parameters by watching the output of netstat -sP tcp. Look for the value of tcpListenDrop, if available on your version of Solaris. Older versions don't have this counter. Any value showing up might indicate something wrong with your server, but then, killing a busy server (like squid) shuts down its listening socket, and might increase this counter (and others). If you get many drops, you might need to increase the appropriate parameter. Since connections can also be dropped, because listen() specifies a too small argument, you have to be careful interpreting the counter value. On old versions, a SYN flood attack might also increase this counter. R4bLinux联盟
R4bLinux联盟
Newer or patched versions of Solaris, with both queues available, will also have the additional counters tcpListenDropQ0 and tcpHalfOpenDrop. Now the original counter tcpListenDrop counts only connections dropped from the completed connection queue, and the counter ending in Q0 the drops from the incomplete connection queue. Killing a busy server application might increase either or both counters. If the tcpHalfOpenDrop shows up values, your server was likely to be the victim of a SYN flood. The counter is only incremented for dropping noxious connection attempts. I have no idea, if those will also show up in the Q0 counter, too. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max  R4bLinux联盟
default 8 (max. 32), since 2.5 32 (max. 1024), recommended 128 <= x <= 1024 R4bLinux联盟
since 2.6 or 2.5.1 with patches 103630-09 and 103582-12 or above applied: R4bLinux联盟
see tcp_conn_req_max_q and tcp_conn_req_max_q0 R4bLinux联盟
R4bLinux联盟
The current parameter describes the maximum number of pending connection requests queued for a listening endpoint in the completed connection queue. The queue can only save the specified finite number of requests. If a queue overflows, nothing is sent back. The client will time out and (hopefully) retransmit. R4bLinux联盟
R4bLinux联盟
The size of the completed connection queue does not influence the maximum number of simultaneous established connections after they were accepted nor does it have any influence on the maximum number of clients a server can serve. With Solaris, the maximum number of file descriptors is the limiting factor for simultaneous connections, which just happened to coincide with the maximum backlog queue size. R4bLinux联盟
R4bLinux联盟
From the viewpoint of TCP those connections placed in the completed connection queue are in the TCP state ESTABLISHED, even though the application has not reaped the connection with a call to accept. That is the number limited by the size of the queue, which you tune with this parameter. If the application, for some reason, does not release entries from the queue by calling accept, the queue might overflow, and the connection is dropped. The client's TCP will hopefully retransmit, and might find a place in the queue. R4bLinux联盟
R4bLinux联盟
Solaris offers the possibility to place connections into the backlog queue as soon as the first SYN arrives, called eager listening. The three way handshake will be completed as soon as the application accept()s the connection. The use of eager listening is not recommended for production systems. R4bLinux联盟
R4bLinux联盟
Solari < 2.5 have a maximum queue length of 32 pending connections. The length of the completed connection queue can also be used to decrease the load on an overloaded server: If the queue is completely filled, remote clients will be denied further connections. Sometimes this will lead to a connection timed out error message. R4bLinux联盟
R4bLinux联盟
Naively, I assumed that a very huge length might lead to a long service time on a loaded server. Stevens showed that the incomplete connection queue needs much more attention than the completed connection queue. But with tcp_conn_req_max you have no option to tweak that particular length. R4bLinux联盟
R4bLinux联盟
Earlier versions of this document suggested to tune tcp_conn_req_max with regards to the values of rlim_fd_max and rlim_fd_cur, but the interdependencies are more complex than any rule of thumb. You have to find your own ideal. When a connection is still in the queue, only the queue length limits the number of entries. Connections taken from the queue are put into a file descriptor each. R4bLinux联盟
R4bLinux联盟
There is a trick to overcome the hardcoded limit of 1024 with a patch. SunSolve shows this trick in connection with SYN flood attacks. A greatly increased listen backlog queue may offer some small increased protection against this vulnerability. On this topic also look at the tcp_ip_abort_cinterval parameter. Better, use the mentioned TCP patches, and increase the q0 length. R4bLinux联盟
R4bLinux联盟
echo "tcp_param_arr+14/W 0t10240" | adb -kw /dev/ksyms /dev/mem R4bLinux联盟
This patch is only effective on the currently active kernel, limiting its extend to the next boot. Usually you want to append the line above on the startup script /etc/init.d/inetinit. The shown patch increases hard limit of the listen backlog queue to 10240. Only after applying this patch you may use values above 1024 for the tcp_conn_req_max parameter. R4bLinux联盟
R4bLinux联盟
A further warning: Changes to the value of tcp_conn_req_max parameter in a running system will not take effect until each listening application is restarted. The backlog queue length is evaluated whenever an application calls listen(3N), usually once during startup. Sending a HUP signal may or may not work; personally I prefer to TERM the application and restart them manually or, even better, use a startup script. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max_q0  R4bLinux联盟
since 2.5.1 with patches 103630-09 and 103582-12 or above applied: default 1024; R4bLinux联盟
since 2.6: default 1024, recommended 1024 <= x <= 10240 R4bLinux联盟
R4bLinux联盟
After installing the mentioned TCP patches, alternatively after installing Solaris 2.6, the parameter tcp_conn_req_max is no longer available. In its stead the new parameters tcp_conn_req_max_q and tcp_conn_req_max_q0 emerged. tcp_conn_req_max_q0 is the maximum number of connections with handshake incomplete, basically the length of the incomplete connection queue. R4bLinux联盟
R4bLinux联盟
In other words, the connections in this queue are just being instantiated. A SYN was just received from the client, thus the connection is in the TCP SYN_RCVD state. The connection cannot be accept()ed until the handshake is complete, even if the eager listening is active. R4bLinux联盟
R4bLinux联盟
To protect against SYN flooding, you can increase this parameter. Also refer to the parameter tcp_conn_req_max_q above. I believe that changes won't take effect unless the applications are restarted. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_max_q  R4bLinux联盟
since 2.5.1 with patches 103630-09 and 103582-12 or above applied: default 128; R4bLinux联盟
since 2.6: default 128, recommended 128 <= x <= tcp_conn_req_max_q0 R4bLinux联盟
R4bLinux联盟
After installing the mentioned TCP patches, alternatively after installing Solaris 2.6, the parameter tcp_conn_req_max is no longer available. In its stead the new parameters tcp_conn_req_max_q and tcp_conn_req_max_q0 emerged. tcp_conn_req_max_q is the length of the completed connection queue. R4bLinux联盟
R4bLinux联盟
In other words, connections in this queue of length tcp_conn_req_max_q have completed the three way handshake of a TCP open. The connection is in the state ESTABLISHED. Connections in this queue have not been accept()ed by the server process (yet). R4bLinux联盟
R4bLinux联盟
Also refer to the parameter tcp_conn_req_max_q0. Remember that changes won't take effect unless the applications are restarted. R4bLinux联盟
R4bLinux联盟
tcp_conn_req_min  R4bLinux联盟
Since 2.6: default 1, recommended: don't touch R4bLinux联盟
R4bLinux联盟
This parameter specifies the minimum number of available connections in the completed connection queue for select() or poll() to return "readable" for a listening (server) socket descriptor. R4bLinux联盟
R4bLinux联盟
Programmers should note that Stevens [7] describes a timing problem, if the connection is RST between the select() or poll() call and the subsequent accept() call. If the listening socket is blocking, the default for sockets, it will block in accept() until a valid connection is received. While this seems no tragedy with a webserver or cache receiving several connection requests per second, the application is not free to do other things in the meantime, which might constitute a problem. R4bLinux联盟
R4bLinux联盟
3. Retransmission related parameters R4bLinux联盟
The retransmission timeout values used by Solaris are way too aggressive for wide area networks, although they can be considered appropriate for local area networks. SUN thus did not follow the suggestions mentioned in RFC 1122. Newer releases of the Solaris kernel are correcting the values in question: R4bLinux联盟
R4bLinux联盟
The recommended upper and lower bounds on the RTO are known to be inadequate on large internets. The lower bound SHOULD be measured in fractions of a second (to accommodate high speed LANs) and the upper bound should be 2*MSL, i.e., 240 seconds.  R4bLinux联盟
Besides the retransmit timeout (RTO) value two further parameters R1 and R2 may be of interest. These don't seem to be tunable via any Solaris' offered interface that I know of. R4bLinux联盟
R4bLinux联盟
The value of R1 SHOULD correspond to at least 3 retransmissions, at the current RTO. The value of R2 SHOULD correspond to at least 100 seconds. R4bLinux联盟
R4bLinux联盟
[...] R4bLinux联盟
R4bLinux联盟
However, the values of R1 and R2 may be different for SYN and data segments. In particular, R2 for a SYN segment MUST be set large enough to provide retransmission of the segment for at least 3 minutes. The application can close the connection (i.e., give up on the open attempt) sooner, of course. R4bLinux联盟
R4bLinux联盟
Great many internet servers which are running Solaris do retransmit segments unnecessarily often. The current condition of European networks indicate that a connection to the US may take up to 2 seconds. All parameters mentioned in the first part of this section relate to each other! R4bLinux联盟
R4bLinux联盟
As a starter take this little example. Consider a picture, size 1440 byte, LZW compressed, which is to be transferred over a serial linkup with 14400 bps and using a MTU of 1500. In the ideal case only one PDU gets transmitted. The ACK segment can only be sent after the complete PDU is received. The transmission takes about 1 second. These values seem low, but they are meant as 'food for thought'. Now consider something going awry... R4bLinux联盟
R4bLinux联盟
Solaris 2.5.1 is behaving strange, if the initial SYN segment from the host doing the active open is lost. The initial SYN gets retransmitted only after a period of 4 * tcp_rexmit_interval_initial plus a constant C. The time is 12 seconds with the default settings. More information is being prepared on the retransmission test page. R4bLinux联盟
R4bLinux联盟
The initial lost SYN may or may not be of importance in your environment. For instance, if you are connected via ATM SVCs, the initial PDU might initiate a logical connection (ATM works point to point) in less than 0.3 seconds, but will still be lost in the process. It is rather annoying for a user of 2.5.1 to wait 12 seconds until something happens. R4bLinux联盟
R4bLinux联盟
tcp_rexmit_interval_initial  R4bLinux联盟
default 500, since 2.5.1 3000, recommended >;= 2000 (500 for special purposes) R4bLinux联盟
R4bLinux联盟
This interval is waited before the last data sent is retransmitted due to a missing acknowledgment. Mind that this interval is used only for the first retransmission. The more international your server is, the larger you should chose this interval. R4bLinux联盟
R4bLinux联盟
Special laboratory environments working in LAN-only environments might be better off with 500 ms or even less. If you are doing measurements involving TCP (which is almost always a bad idea), you should consider lowering this parameter. R4bLinux联盟
R4bLinux联盟
Why do I consider TCP measurements a bad idea? If ad-hoc approaches are used, or there is no deeper knowledge of the mechanics of TCP, you are bound to arrive at wrong conclusions. Unless there are TCP dumps to document that indeed what you expect is actually happening, results may lead to wrong conclusions. If done properly, there is nothing wrong with TCP measurements. The same rules apply, if you are measuring protocols on top of TCP. R4bLinux联盟
R4bLinux联盟
There are lots of knobs and dials to be fiddled with - all of which need to be documented along with the results. Scientific experiments need to be repeatable by others in order to verify your findings. R4bLinux联盟
R4bLinux联盟
tcp_rexmit_interval_min  R4bLinux联盟
default 200, recommended >;= 1000 (200 for special purposes) R4bLinux联盟
Since 8: default 400 R4bLinux联盟
R4bLinux联盟
After the initial retransmission further retransmissions will start after the tcp_rexmit_interval_min interval. BSD usually specifies 1500 milliseconds. This interval should be tuned to the value of tcp_rexmit_interval_initial, e.g. some value between 50 % up to 200 %. The parameter has no effect on retransmissions during an active open, see my accompanying document on retransmissions. R4bLinux联盟
R4bLinux联盟
The tcp_rexmit_interval_min doesn't display any influence on connection establishment with Solaris 2.5.1. It does with 2.6, though. The influence on regular data retransmissions, or FIN retransmissions I have yet to research. R4bLinux联盟
R4bLinux联盟
tcp_ip_abort_interval  R4bLinux联盟
default 120000, since 2.5 480000, recommended 600000 R4bLinux联盟
This interval specifies how long retransmissions for a connection in the ESTABLISHED state should be tried before a RESET segment is sent. BSD systems default to 9 minutes. R4bLinux联盟
R4bLinux联盟
You don't want your connections to fail too quickly once they are in the ESTABLISHED state. A reader reported that Veritas backup clients might fail with "socket write failed". Veritas recommends not to set above parameter below 8 minutes. R4bLinux联盟
R4bLinux联盟
R4bLinux联盟
tcp_ip_abort_linterval  R4bLinux联盟
default ?, recommended ? R4bLinux联盟
R4bLinux联盟
According to an unconfirmed user report, the parameter is the abort interval for passive connections, i.e. those received on ports in the LISTEN state. Refer to the tcp_ip_abort_cinterval for details, as there is some confusion between what SunSolve says and what can be read in Stevens. R4bLinux联盟
R4bLinux联盟
tcp_ip_abort_cinterval  R4bLinux联盟
default 240000, since 2.5 180000, recommended ? R4bLinux联盟
R4bLinux联盟
This interval specifies how long retransmissions for a remote host are repeated until the RESET segment is sent. The difference to the tcp_ip_abort_interval parameter is that this connection is about to be established - it has not yet reached the state ESTABLISHED. This value is interesting considering SYN flood attacks on your server. Proxy server are doubly handicapped because of their Janus behavior (like a server towards the downstream cache, like a client towards the upstream server). R4bLinux联盟
R4bLinux联盟
According to Stevens this interval is connected to the active open, e.g. the connect(3N) call. But according to SunSolve the interval has an impetus on both directions. A remote client can refuse to acknowledge an opening connection up to this interval. After the interval a RESET is sent. The other way around works out, too. If the three-way handshake to open a connection is not finished within this interval, the RESET Segment will be sent. This can only happen, if the final ACK went astray, which is a difficult test case to simulate. R4bLinux联盟
R4bLinux联盟
To improve your SYN flood resistance, SUN suggests to use an interval as small as 10000 milliseconds. This value has only been tested for the "fast" networks of SUN. The more international your connection is, the slower it will be, and the more time you should grant in this interval. Proxy server should never lower this value (and should let Squid terminate the connection). Webservers are usually not affected, as they seldom actively open connections beyond the LAN. R4bLinux联盟
R4bLinux联盟
tcp_rexmit_interval_max  R4bLinux联盟
default 60000, RFC 1122 recommends 240000 (2MSL), recommended 1...2 * tcp_close_wait_interval or tcp_time_wait_interval R4bLinux联盟
Since 2.6: default 240000 R4bLinux联盟
Since 8: default 60000 R4bLinux联盟
R4bLinux联盟
All previously mentioned retransmissions related interval use an exponential backoff algorithm. The wait interval between two consecutive retransmissions for the same PDU is doubled starting with the minimum. R4bLinux联盟
R4bLinux联盟
The tcp_rexmit_interval_max interval specifies the maximum wait interval between two retransmissions. If changing this value, you should also give the abort interval an inspection. The maximum wait interval should only be reached shortly before the abort interval timer expires. Additionally, you should coordinate your interval with the value of tcp_close_wait_interval or tcp_time_wait_interval. R4bLinux联盟
R4bLinux联盟
tcp_deferred_ack_interval  R4bLinux联盟
default 50, BSD 200, recommended 200 (regular), 50 (benchmarking), or 500 (WAN server) R4bLinux联盟
Since 8: default 100 R4bLinux联盟
R4bLinux联盟
This parameter specifies the timeout before sending a delayed ACK. The value should not be increased above 500, as required by RFC 1122. This value is of great interest for interactive services. A small number will increase the "responsiveness" of a remote service (telnet, X11), while a larger value can decrease the number of segments exchanged. R4bLinux联盟
R4bLinux联盟
The parameter might also interest to HTTP servers which transmit small amounts of data after a very short retrieval time. With a heavy-duty servers or in laboratory banging environment, you might encounter service times answering a request which are well above 50 ms. An increase to 500 might lead to less PDUs transferred over the network, because TCP is able to merge the ACK with data. Increases beyond 500 should not be even considered. R4bLinux联盟
R4bLinux联盟
SUN claims that Solaris recognizes the initial data phase of a connection. An initial ACK (not SYN) is not delayed. As opposed to the simplistic approach mentioned in the SUN paper, a request for a webservice (both, server or proxy) which does not fit into a single PDU can be transmitted faster. Also check the tcp_slow_start_initial Parameter. R4bLinux联盟
R4bLinux联盟
The tcp_deferred_ack_interval also seems to be used to distinguish full-sized segments between interactive traffic and bulk data transfer. If a sender uses MSS sized segments, but sends each segment further apart than approximately 0.9 times the interval, the traffic will be rated interactive, and thus every segment seems to get ACKed. R4bLinux联盟
R4bLinux联盟
R4bLinux联盟
tcp_deferred_acks_max  R4bLinux联盟
Since 2.6: default 8, recommended ?, maximum 16 R4bLinux联盟
R4bLinux联盟
This parameter features the maximum number of segments received after which an ACK just has to be sent. Previously I thought this parameter solely related to interactive data transfer, but I was mistaken. This parameter specifies the number of outstanding ACKs. You can give it a look when tuning for high speed traffic and bulk transfer, but the parameter is controversial. For instance, unless you employ selective acknowledgments (SACK) like Solaris 7, you can only ACK the number of segments correctly received. With the parameter at a larger value, statistically the amount of data to retransmit is larger. R4bLinux联盟
R4bLinux联盟
Good values for retransmission tuning don't beam into existence from a white source. Rather you should carefully plan an experiment to get decent values. Intervals from another site can not be carried over to another Solaris system without change. But they might give you an idea where to start when choosing your own values. R4bLinux联盟
R4bLinux联盟
The next part looks at a few parameters having to do with retransmissions, as well. R4bLinux联盟
R4bLinux联盟
tcp_slow_start_initial  R4bLinux联盟
Since 2.5.1 with patch 103582-15 applied: default 1 R4bLinux联盟
Since 2.6: default 1, recommended 2 or 4 for servers R4bLinux联盟
Since 8: default 4, no recommendations R4bLinux联盟
R4bLinux联盟
This parameter provides the slow-start bug discovered in BSD and Windows TCP/IP implementations for Solaris. More information on the topic can be found on the servers of SUN and in Stevens [6]. To summarize the effect, a server starts sending two PDUs at once without waiting for an ACK due to wrong ACK counts. The ACK from connection initiation being counted as data ACK - compare with figure 2. Network congestion avoidance algorithms are being undermined. The slow start algorithm does not allow the buggy behavior, compare with RFC 2001. R4bLinux联盟
R4bLinux联盟
Setting the parameter to 2 allows a Solaris machine to behave like it has the slow start bug, too. Well, IETF is said to make amends to the slow start algorithm, and the bug is now actively turned into a feature. SUN also warns: R4bLinux联盟
R4bLinux联盟
It's still conceivable, although rare, that on a configuration that supports many clients on very slow-links, the change might induce more network congestions. Therefore the change of tcp_slow_start_initial should be made with caution. R4bLinux联盟
R4bLinux联盟
[...] R4bLinux联盟
R4bLinux联盟
Future Solaris releases are likely to default to 2. R4bLinux联盟
R4bLinux联盟
You can also gain performance, if many of your clients are running old BSD or derived TCP/IP stacks (like MS). I expect new BSD OS releases not to figure this bug, but then I am not familiar with the BSD OS family. A reader of this page told me about cutting the latency of his server in half, just by using the value of 2. R4bLinux联盟
R4bLinux联盟
If you want to know more about this feature and its behavior, you can have a look at some experiments I have conducted concerning that particular feature. The summary is that I agree with the reader: A BSDish client like Windows definitely profits from using a value of 2. R4bLinux联盟
R4bLinux联盟
tcp_slow_start_after_idle  R4bLinux联盟
Since 2.6: default 2, no recommendations R4bLinux联盟
Since 8: default 4, no recommendations R4bLinux联盟
R4bLinux联盟
I reckon that this parameter deals with the slow start for an already established connection which was idle for some time (however the term idle is defined here). R4bLinux联盟
R4bLinux联盟
tcp_dupack_fast_retransmit  R4bLinux联盟
default 3, no recommendations R4bLinux联盟
R4bLinux联盟
Something to do with the number of duplicates ACKs. If we do fast retransmit and fast recovery algorithms, this many ACKs must be retransmitted until we assume that a segment has really been lost. A simple reordering of segments usually causes no more than two duplicate ACKs. R4bLinux联盟
R4bLinux联盟
There are a couple of parameters which require some elementary familiarity with RFC 2001, which covers TCP Slow Start, Congestion Avoidance, Fast Retransmit, and Fast Recovery Algorithms, as well as ssthresh and cwnd. R4bLinux联盟
R4bLinux联盟
tcp_rtt_updates  R4bLinux联盟
default 0, BSD 16, recommended: (see text) R4bLinux联盟
Since 8: 20, no recommendations R4bLinux联盟
R4bLinux联盟
This parameter controls when things like rtt_sa (the smoothed RTT), rtt_sd (the smoothed mean deviation), and ssthresh (the slow start threshold) are cached in the routing table. By default, Solaris does not cache any of the parameters. It is claimed that you can set it to a value you like, but to be the same as BSD, use 16. R4bLinux联盟
R4bLinux联盟
The value to this parameter is the number of RTT samples that had to be sampled, so that an accurate enough value can be stored in the routing table. If you chose to use this feature, use a value of 16 or above. Using 16 allows the smoothed RTT filter to converge within 5 % of the correct value, compare Stevens [4], chapter 21.9. R4bLinux联盟
R4bLinux联盟
ip_ire_cleanup_interval  R4bLinux联盟
default 30000, no recommendatations R4bLinux联盟
Since 8: the parameter has a new name: ip_ire_arp_interval R4bLinux联盟
R4bLinux联盟
The parameters may do more than described here. If a routing table entry is not directly connected and not being used, the cache for things like rtt_sa, rtt_sd and ssthresh associated with the entry will be flushed after 30 seconds. The parameter tcp_rtt_updates must be greater than zero to enable the cache. R4bLinux联盟
R4bLinux联盟
I could imagine that external helper programs invoked by MRTG on a regular basis connecting to a far-away host might benefit from increasing this value slightly above the invocation interval. R4bLinux联盟
R4bLinux联盟
4. path MTU discovery R4bLinux联盟
Whenever a connection is about to be established, the three-way handshake open negotiation, the segment size used will be set to the minimum of (a) the smallest MTU of an outgoing interface, and (b) from MSS announced by the peer. If the remote peer does not announce a MSS, usually the value 536 will be assumed. If path MTU discovery is active, all outgoing PDUs have the IP option DF (don't fragment) set. R4bLinux联盟
R4bLinux联盟
If the ICMP error message fragmentation needed is received, a router on the way to the destination needed to fragment the PDU, but was not allowed to do so. Therefore the router discarded the PDU and did send back the ICMP error. Newer router implementations enclose the needed MSS in the error message. If the needed MSS is not included, the correct MSS must be determined by trial and error algorithm. R4bLinux联盟
R4bLinux联盟
Due to the internet being a packet switching network, the route a PDU travels along a TCP virtual circuit may change with time. For this reason RFC 1191 recommends to rediscover the path MTU of an active connection after 10 minutes. Improvements of the route can only be noticed by repeated rediscoveries. Unfortunately, Solaris aggressively tries to rediscover the path MTU every 30 seconds. While this is o.k. for LAN environments, it is a grossly impolite behavior in WANs. Since routes may not change that often, aggressive repetitions of path MTU discoveries leads to unnecessary consumption of channel capacity and elongated service times. R4bLinux联盟
R4bLinux联盟
Path MTU discovery is a far reaching and controversial topic when discussing it with local ISPs. Still, pMTU discovery is at the foundation of IPv6. The PSC tuning page argues pro path MTU discovery, especially if you maintain a high-speed or long-delay (e.g. satellite) link. R4bLinux联盟
R4bLinux联盟
The recommendation I can give you is not to use the defaults of Solaris < 2.5. Please use path MTU discovery, but tune your system RFC conformant. You may alternatively want to switch off the path MTU discovery all together, though there are few situations where this is necessary. R4bLinux联盟
R4bLinux联盟
I was made aware of the fact that in certain circumstances bridges connecting data link layers of differing MTU sizes defeat pMTU discovery. I have to put some more investigation into this matter. If a frame with maximum MTU size is to be transported into the network with the smaller MTU size, it is truncated silently. A bridge does not know anything about the upper protocol levels: A bridge neither fragments IP nor sends an ICMP error. R4bLinux联盟
R4bLinux联盟
There may be work-arounds, and the tcp_mss_def is one of them. Setting all interfaces to the minimum shared MTU might help, at the cost of losing performance on the larger MTU network. Using what RFC 1122 calls an IP gateway is a possible, yet expensive solution. R4bLinux联盟
R4bLinux联盟
ip_ire_pathmtu_interval  R4bLinux联盟
default 30000, recommended 600000 R4bLinux联盟
Since 2.5 600000, no recommendations R4bLinux联盟
R4bLinux联盟
This timer determines the interval Solaris rediscovers the path MTU. An extremely large value will only evaluate the path MTU once at connection establishment. R4bLinux联盟
R4bLinux联盟
ip_path_mtu_discovery  R4bLinux联盟
default 1, recommended 1 R4bLinux联盟
R4bLinux联盟
This parameter switches path MTU discovery on or off. If you enter a 0 here, Solaris will never try to set the DF bit in the IP option - unless your application explicitly requests it. R4bLinux联盟
R4bLinux联盟
tcp_ignore_path_mtu  R4bLinux联盟
default 0, recommended 0 R4bLinux联盟
R4bLinux联盟
This is a debug switch! When activated, this switch will have the IP or TCP layer ignore all ICMP error messages fragmentation needed. By this, you will achieve the opposite of what you intended. R4bLinux联盟
R4bLinux联盟
tcp_mss_def  R4bLinux联盟
default 536, recommended >;= 536 R4bLinux联盟
Since 8: split into tcp_mss_def_ipv4 and tcp_mss_def_ipv6 R4bLinux联盟
R4bLinux联盟
This parameter determines the default MSS (maximum segment size) for non-local destination. For path MTU discovery to work effectively, this value can be set to the MTU of the most-used outgoing interface descreased by 20 byte IP header and 20 byte TCP header - if and only if the value is bigger than 536. R4bLinux联盟
R4bLinux联盟
tcp_mss_def_ipv4  R4bLinux联盟
Since 8: default 536  R4bLinux联盟
tcp_mss_def_ipv6  R4bLinux联盟
Since 8: default 1460 R4bLinux联盟
R4bLinux联盟
Solaris 8 supports IPv6. Since IPv6 uses different defaults for the maximum segment size, one has to distinguish between IPv4 and IPv6. The default for IPv6 is close to what is said for tcp_mss_def. R4bLinux联盟
R4bLinux联盟
tcp_mss_min  R4bLinux联盟
default 1, see text, (88 in Linux 2.4 and Win2k) R4bLinux联盟
Since 8 with patch 108528-14 or above: 108 R4bLinux联盟
R4bLinux联盟
This parameter defines the minimum for the maximum segment size. While I still ponder the impl