优化 AIX 7 网络性能: 第 3 部分,监视网络数据包并优化网络

这个关于 AIX® 7 网络的 3 部分系列文章主要关注优化网络性能的挑战。鉴于 AIX 7 在网络部署环境中使用得越来越频繁,且工作负载分区常用于帮助管理资源,您必须知道优化网络部署所需的所有不同应用程序和环境。第 1 部分 提供了有关网络的概述,并且还介绍了监视硬件所需的一些工具,包括 netstat、netpmon、entstat 和 nmon。第 2 部分 介绍了如何监视和优化 NFS 子系统。本文是第 3 部分,也是最后的一个部分,将向您介绍如何监视网络数据包。该系列文章还提供针对网络 I/O 性能调优的最佳实践。

Martin Brown, 自由撰稿人, Freelance Developer

Martin Brown 成为专业作家已有七年多的时间了。他是题材广泛的众多书籍和文章的作者。他的专业技术涉及各种开发语言和平台 —— Perl、Python、Java™、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、Shellscript、Windows、Solaris、Linux®、BeOS、Mac OS/X 等等,还涉及 Web 编程、系统管理和集成。Martin 是 Microsoft® 的主题专家(SME),并且是 ServerWatch.com、LinuxToday.com 和 IBM developerWorks 的定期投稿人,他还是 Computerworld、The Apple Blog 和其他站点的正式博客。您可以通过他的 Web 站点 : http://www.mcslp.com 与他联系。



Ken Milberg, 作家/网站专家, Future Tech

Ken Milberg 是 PMP,同时也是 techtarget.com 的撰稿人/站点专家,他还为 searchopensource.com 提供 Linux 技术信息和支持。Ken 是 IBM Systems Magazine,Open Edition 的撰稿人和技术编辑。Ken 拥有 University of Maryland University College 的计算机与信息科学学士学位和技术管理科学硕士学位。他是 Long Island POWER-AIX 用户组的创始人和负责人。这些年以来,他在各种规模的企业工作过,并且担任过各种职位,包括 CIO 和高级 AIX 工程师。他现在在 Future Tech 工作,这是一家总部设在长岛的 IBM 业务合作伙伴。Ken 不仅是已通过 PMI 认证的项目管理专业人员(PMP),还是通过 IBM 认证的高级技术专家(CATE,IBM System p5 2006)。



2011 年 4 月 13 日

简介

虽然运行 netstat 等命令可以提供有用的信息,但有时您仍然需要深入到数据包作进一步分析。在这种情况下,可以使用各种跟踪工具,比如 iptraceipreporttcpdump。本文还将向您介绍如何使用像 no 这样的工具来优化网络。虽然 no 命令与 vmoioo 很相似,但 no 更受到网络环境的青睐。本文重点关注于 tcp 工作负载优化、udp 工作负载优化,以及 no 实用工具所提供的一些其他值得关注的参数。本文还将讨论 ARP 缓存优化,以及如何监视和优化 ARP 统计信息。您还将了解名称解析,以及如何通过微调解析主机名的方式轻松提高性能。

监视网络数据包

在这个小节中,您将了解一些关于网络数据包监视工具的概述。这些工具允许您快速地对性能问题进行故障排除,并捕捉相关的数据以便进行历史趋势的研究和分析。

本系列的 第 1 部分 介绍了一些非常基本的标志,比如 -in,这是 netstat 的一个常用标志。使用 netstat 还可以监视有关数据包本身的、更为详细的信息。例如,-D 选项将显示您的通信子系统所接收的、传输的和丢弃的数据包的总数。下面按设备、驱动程序和协议对结果进行排序(请参见 清单 1)。

清单 1. 带 -D 选项的 netstat
l488pp065_pub[/tmp] > netstat -D
Source                         Ipkts                Opkts     Idrops     Odrops
-------------------------------------------------------------------------------
ent_dev1                    71306227               337207          0          0
ent_dev0                   203313084                82292          0          0
                ---------------------------------------------------------------
Devices Total              274619311               419499          0          0
-------------------------------------------------------------------------------
ent_dd1                     71306227               337207          0          0
ent_dd0                    203313084                82292          0          0
                ---------------------------------------------------------------
Drivers Total              274619311               419499          0          0
-------------------------------------------------------------------------------
ent_dmx1                    70327758                  N/A     978469        N/A
ent_dmx0                   202846759                  N/A     466325        N/A
                ---------------------------------------------------------------
Demuxer Total              273174517                  N/A    1444794        N/A
-------------------------------------------------------------------------------
IP                         204276236              1063977     899839     828213
IPv6                           70588                70588          0       6208
TCP                           714368               785630         72          0
UDP                        202697468               319900  202172157          0
                ---------------------------------------------------------------
Protocols Total            407688072              2169507  203072068     828213
-------------------------------------------------------------------------------
en_if1                      70327759               337207          0          0
en_if0                     202846780                82315          0          0
lo_if0                        780891               780890         12          0
                ---------------------------------------------------------------
Net IF Total               273955430              1200412         12          0
-------------------------------------------------------------------------------
NFS/RPC Client                    24                  N/A          0        N/A
NFS/RPC Server                     0                  N/A          0        N/A
NFS Client                       279                  N/A          0        N/A
NFS Server                         0                  N/A          0        N/A
                ---------------------------------------------------------------
NFS/RPC Total                    N/A                  303          0          0
-------------------------------------------------------------------------------
(Note:  N/A -> Not Applicable)

另一个有用的标志是 -s,它将显示所使用的全部协议的详细统计信息(包括发送的、接收的和丢弃的数据包)。如果您只希望查看 tcp 协议的相关信息,那么您还可以使用 -p 标志(请参见清单 2)。

清单 2. 带 -p 选项的 netstat
l488pp065_pub[/tmp] > netstat -p tcptcp:
        785684 packets sent
                227657 data packets (13800898 bytes)
                0 data packets (0 bytes) retransmitted
                279285 ack-only packets (509 delayed)
                0 URG only packets
                0 window probe packets
                69732 window update packets
                418020 control packets
                0 large sends
                0 bytes sent using largesend
                0 bytes is the biggest largesend
        714418 packets received
                360033 acks (for 14009902 bytes)
                69728 duplicate acks
                0 acks for unsent data
                217241 packets (1660096 bytes) received in-sequence
                72 completely duplicate packets (72 bytes)
                0 old duplicate packets
                0 packets with some dup. data (0 bytes duped)
                69632 out-of-order packets (0 bytes)
                0 packets (0 bytes) of data after window
                0 window probes
                69733 window update packets
                0 packets received after close
                0 packets with bad hardware assisted checksum
                0 discarded for bad checksums
                0 discarded for bad header offset fields
                0 discarded because packet too short
                0 discarded by listeners
                0 discarded due to listener's queue full
                5241 ack packet headers correctly predicted
                75327 data packet headers correctly predicted
        69655 connection requests
        69712 connection accepts
        139364 connections established (including accepts)
        139417 connections closed (including 12 drops)
        0 connections with ECN capability
        0 times responded to ECN
        2 embryonic connections dropped
        429685 segments updated rtt (of 429463 attempts)
        0 segments with congestion window reduced bit set
        0 segments with congestion experienced bit set
        0 resends due to path MTU discovery
        1 path MTU discovery termination due to retransmits
        3 retransmit timeouts
                0 connections dropped by rexmit timeout
        0 fast retransmits
                0 when congestion window less than 4 segments
        0 newreno retransmits
        0 times avoided false fast retransmits
        0 persist timeouts
                0 connections dropped due to persist timeout
        0 keepalive timeouts
                0 keepalive probes sent
                0 connections dropped by keepalive
        0 times SACK blocks array is extended
        0 times SACK holes array is extended
        0 packets dropped due to memory allocation failure
        0 connections in timewait reused
        0 delayed ACKs for SYN
        0 delayed ACKs for FIN
        0 send_and_disconnects
        0 spliced connections
        0 spliced connections closed
        0 spliced connections reset
        0 spliced connections timeout
        0 spliced connections persist timeout
        0 spliced connections keepalive timeout
        0 TCP checksum offload disabled during retransmit
        0 Connections dropped due to bad ACKs

实际上,有许多种不同的使用 netstat 的方式,而在刚开始学习的时候,最好是查看手册页,然后按照其中说明操作。不要害怕运行这些命令,因为它们并不会耗尽磁盘空间、或者影响性能。可以使用 AIX 7 中提供的各种跟踪工具来记录有关数据包的详细信息。在使用它们时请多加小心。当您尝试确定导致网络性能问题的根本原因时,这些工具将会非常有帮助。

首先介绍一下 iptraceipreportiptrace 命令记录从网络接口接收到的所有数据包。ipreport 命令将 iptrace 生成的数据格式化到一个可读的跟踪报告中。而且,您还可以使用 ipfilteripreport 所创建的输出文件进行排序。尝试启动跟踪,并让它工作一分钟(请参见 清单 3)。

清单 3. 启动跟踪
l488pp065_pub[/tmp] > /usr/sbin/iptrace -a -i en0 iptrace.out &
[1]     12845206
l488pp065_pub[/tmp] > [8126632]

[1] +  Done              /usr/sbin/iptrace -a -i en0 iptrace.out &
l488pp065_pub[/tmp] > ps -ef | grep iptrace    
root  8126632        1  15 05:54:55      -  0:00
 /usr/sbin/iptrace -a -i en0 iptrace.out 
 root 14221424  7012524   7 05:55:17  pts/1  0:00 grep iptrace

在跟踪结束之后,需要杀死跟踪进程(请参见 清单 4)。

清单 4. 杀死跟踪进程
l488pp065_pub[/tmp] > kill -1 8126632l488pp065_pub[/tmp] 
 > iptrace: unload success!
l488pp065_pub[/tmp] > ipreport -r -s iptrace.out >/ipreport.network

现在,检查输出结果(请参见 清单 5):

清单 5. 检查输出结果
l488pp065_pub[/tmp] > more /ipreport.network
IPTRACE version: 2.0

ETH: ====( 114 bytes transmitted on interface en0 )==== 05:54:55.151599119
ETH:    [ 66:da:93:d1:6b:17 -> 6e:87:70:00:40:03 ]  type 800  (IP)
IP:     < SRC =  172.29.148.225 >  (l488pp065_pub)
IP:     < DST =   172.29.131.16 >  
IP:     ip_v=4, ip_hl=20, ip_tos=16, ip_len=100, ip_id=49399, ip_off=0 DF
IP:     ip_ttl=60, ip_sum=d60, ip_p = 6 (TCP)
TCP:    <source port=22(ssh), destination port=54678 >
TCP:    th_seq=47587592, th_ack=3002348404
TCP:    th_off=8, flags<PUSH | ACK>
TCP:    th_win=65522, th_sum=0, th_urp=0
TCP:            nop
TCP:            nop
TCP:            timestamps TSVal: 0x4f486827  TSEcho: 0x4c8da569
TCP: 00000000     9fec0a46 c8dd1c9b 98ff0213 87c714c0     |...F............|
TCP: 00000010     0ec081aa 7c76335f 0bfd0d8f 63d0bf1a     |....|v3_....c...|
TCP: 00000020     808359b4 13e1a29d 4dacdd51 dad01053     |..Y.....M..Q...S|

清单 5 显示了捕捉到的关于每个数据包的信息,包括数据包的大小和 IP 地址信息。正如您想到的一样,这个跟踪文件可能会迅速地变得很大。示例文件在不到一分钟的时间内就增长到了 40 MB!在运行这些跟踪的时候,一定要非常小心,因为如果您没有足够的磁盘空间用于这些文件,那么将会迅速地耗尽磁盘空间。

您还可以使用系统资源控制器 (SRC) 来启动跟踪。请参见 清单 6

清单 6. 使用 SRC 启动跟踪
l488pp065_pub[/tmp] > startsrc -s iptrace -a "-i 
en1 /home/testing/iptrace/iptracelog"
0513-059 The iptrace Subsystem has been started. Subsystem PID is 12845270.

l488pp065_pub[/tmp] > stopsrc -s iptrace
0513-004 The Subsystem or Group, iptrace, is currently inoperative.

tcpdump 的情况又如何呢?tcpdump 可以输出为每个 NIC 捕获的数据包的 Header。tcpdumpiptrace 的一个重要区别是,它一次只能查看一个网络接口。而且,因为 iptrace 将检查来自内核空间的完整的数据包,所以其结果可能导致丢弃大量的数据包。使用 tcpdump,您还可以限制要跟踪的数据的总量。另外,您不需要使用 ipreport 类型的命令来格式化二进制的数据,因为 tcpdump 将进行跟踪并产生格式化的输出。清单 7 给出了一个示例。

清单 7. 使用 tcpdump
l488pp065_pub[/tmp] > tcpdump > tcp.outtcpdump: listening on 
en0, link-type 1, capture size 96 bytes

tcpdump 将持续地捕获数据包,直到您键入 Ctrl+C 为止。如果由于缓冲区空间不足而丢弃了任何数据包,那么它也会作出相应的报告。

清单 8 显示了当您结束示例跟踪时所看到的内容。

清单 8. 跟踪结束
28 packets received by filter0 packets dropped by kernel
l488pp065_pub[/tmp] > cat tcp.out

06:00:21.003328 IP l488pp065_pub.ssh > 172.29.131.16.54678: 
P 47609416:47609464(48) ack 3002357700 win 65522 <nop,nop,timestamp 133014597
1 1284351989>
06:00:21.003387 IP l488pp065_pub.ssh > 172.29.131.16.54678: P 48:208(160) 
ack 1 win 65522 <nop,nop,timestamp 1330145971 1284351989>
06:00:21.028081 IP 172.29.131.16.54678 > l488pp065_pub.ssh: . ack 208 win 
32761 <nop,nop,timestamp 1284351989 1330145971>
06:00:21.238937 ARP, Request who-has 172.29.173.186 tell 172.29.133.221, length 46
06:00:21.239110 ARP, Request who-has 172.29.173.236 tell 172.29.129.59, length 46
06:00:21.325060 ARP, Request who-has 172.29.175.252 tell 172.29.129.58, length 46
06:00:21.464383 IP6 fe80::4464:ceff:fe65:4f0c > ff02::1:ff41:34d0: ICMP6, 
neighbor solicitation, who has fe80::221:5eff:fe41:34d0, length
 32
06:00:21.505281 ARP, Request who-has 172.29.175.60 tell 172.29.133.223, length 46
06:00:22.013530 ARP, Request who-has 172.29.174.66 tell 172.29.133.222, length 46
06:00:22.054164 ARP, Request who-has 172.29.173.237 tell 172.29.129.59, length 46
06:00:22.076819 ARP, Request who-has 172.29.122.25 tell 172.29.122.2, length 46
06:00:22.393898 IP 172.29.148.116.32852 > 239.255.255.253.svrloc: UDP, length 56
06:00:22.464355 IP6 fe80::4464:ceff:fe65:4f0c > ff02::1:ff41:34d0: ICMP6, neighbor 
solicitation, who has fe80::221:5eff:fe41:34d0, length
 32
06:00:22.935140 802.1d config 8000.00:16:60:f9:a8:00.8011 root 8000.00:16:60:f9:a8:00 
pathcost 0 age 0 max 20 hello 2 fdelay 15 
06:00:23.186380 ARP, Request who-has 172.29.122.26 tell 172.29.122.2, length 46
06:00:24.520770 ARP, Request who-has 172.29.175.60 tell 172.29.133.223, length 46
06:00:24.558139 ARP, Request who-has 172.29.175.252 tell 172.29.129.58, length 46
06:00:24.573524 ARP, Request who-has 172.29.175.5 tell 172.29.129.57, length 46
06:00:24.736838 IP 172.29.148.116.32853 > 239.255.255.253.svrloc: UDP, length 56
06:00:24.931436 802.1d config 8000.00:16:60:f9:a8:00.8011 root 8000.00:16:60:f9:a8:00 
pathcost 0 age 0 max 20 hello 2 fdelay 15 
06:00:25.029112 IP 172.29.133.222.netbios-dgm > 
           172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.029965 IP 172.29.133.222.netbios-dgm > 
           172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.030751 IP 172.29.133.222.netbios-dgm > 
           172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.031674 IP 172.29.133.222.netbios-dgm > 
            172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.032636 IP 172.29.133.222.netbios-dgm > 
            172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.033647 IP 172.29.133.222.netbios-dgm > 
            172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.033732 CDP v2, ttl: 180s, Device-ID 'Switch'[|cdp]
06:00:25.034738 IP 172.29.133.222.netbios-dgm > 
            172.29.191.255.netbios-dgm: UDP, length 201
06:00:25.035741 IP 172.29.133.222.netbios-dgm > 
            172.29.191.255.netbios-dgm: UDP, length 201

tcpdump 的主要好处是可以指定过滤器,这样您就可以仅选择特定的协议、源、目标和端口等。这对诊断或确定 NFS 网络流量非常有用,例如主机间的网络流量。


优化网络性能

在这个部分中,您将了解如何使用 no 命令来优化您的网络子系统。您还将了解可能影响网络性能的一些其他方面,并且您将了解在适当情况下的建议优化方法。

no 命令是优化网络参数的最重要的命令。首先,使用 -a 标志查看所有的参数(请参见 清单 9)。需要注意的是,这个清单非常长。

清单 9. 查看参数
l488pp065_pub[/tmp] > no -a                 
                 arpqsize = 12
               arpt_killc = 20
              arptab_bsiz = 7
                arptab_nb = 149
                bcastping = 0
      clean_partial_conns = 0
                 delayack = 0
            delayackports = {}
         dgd_packets_lost = 3
            dgd_ping_time = 5
           dgd_retry_time = 5
       directed_broadcast = 0
                 fasttimo = 200
        icmp6_errmsg_rate = 10
          icmpaddressmask = 0
ie5_old_multicast_mapping = 0
                   ifsize = 256
               ip6_defttl = 64
                ip6_prune = 1
            ip6forwarding = 0
       ip6srcrouteforward = 1
       ip_ifdelete_notify = 0
                 ip_nfrag = 200
             ipforwarding = 0
                ipfragttl = 2
        ipignoreredirects = 0
                ipqmaxlen = 100
          ipsendredirects = 1
        ipsrcrouteforward = 1
           ipsrcrouterecv = 0
           ipsrcroutesend = 1
          llsleep_timeout = 3
                  lo_perf = 1
                lowthresh = 90
                 main_if6 = 0
               main_site6 = 0
                 maxnip6q = 20
                   maxttl = 255
                medthresh = 95
               mpr_policy = 1
              multi_homed = 1
                nbc_limit = 262144
            nbc_max_cache = 131072
            nbc_min_cache = 1
         nbc_ofile_hashsz = 12841
                 nbc_pseg = 0
           nbc_pseg_limit = 524288
           ndd_event_name = {all}
        ndd_event_tracing = 0
            ndp_mmaxtries = 3
            ndp_umaxtries = 3
                 ndpqsize = 50
                ndpt_down = 3
                ndpt_keep = 120
               ndpt_probe = 5
           ndpt_reachable = 30
             ndpt_retrans = 1
             net_buf_size = {all}
             net_buf_type = {all}
     net_malloc_frag_mask = {0}
        netm_page_promote = 1
           nonlocsrcroute = 0
                 nstrpush = 8
              passive_dgd = 0
         pmtu_default_age = 10
              pmtu_expire = 10
 pmtu_rediscover_interval = 30
              poolbuckets = 4
              psebufcalls = 20

或者,您还可以使用 -L 标志。它将提供更加详细的信息,包括当前值、默认值、启动值和设置范围。这大大方便了诊断给定值是不是最优值,以及改变当前值是否能够提升某些方面的性能。清单 10 仅给出了开头的几行。

清单 10. 使用 -L 标志
l488pp065_pub[/tmp] > no -L
General Network Parameters
--------------------------------------------------------------------------------
NAME                      CUR    DEF    BOOT   MIN    MAX    UNIT           TYPE
     DEPENDENCIES
--------------------------------------------------------------------------------
fasttimo                  200    200    200    50     200    millisecond       D
--------------------------------------------------------------------------------
nbc_limit                 256K   256K   256K   0      8E-1   kbyte             D
     thewall
--------------------------------------------------------------------------------
nbc_max_cache             128K   128K   128K   1      256M   byte              D
     nbc_min_cache
     nbc_limit
--------------------------------------------------------------------------------
nbc_min_cache             1      1      1      1      128K   byte              D
     nbc_max_cache
--------------------------------------------------------------------------------
nbc_ofile_hashsz          12841  12841  12841  1      999999 segment           D
--------------------------------------------------------------------------------
nbc_pseg                  0      0      0      0      2G-1   segment           D
--------------------------------------------------------------------------------
nbc_pseg_limit            512K   512K   512K   0      1M     kbyte             D
--------------------------------------------------------------------------------
ndd_event_name            {all}  {all}  {all}  0      128    string            D
... trimmed for clarity

这里给出了许多的参数。thewall 定义网络内核缓冲区的上限值。现在,根据 RAM 总量和内核类型,在安装时定义其大小。例如,如果您在 64 位内核中运行 AIX 5.3,那么将该参数设置为实际内存大小的一半。

清单 11. 设置 thewall 参数的大小
l488pp065_pub[/tmp] > no -a|grep thewall
thewall = 1048576

第 1 部分 介绍了 mbufs,但这里我们又要再次提到它,因为它与 thewall 相关。请记住,mbufs 用于在内核中为传入和传出流量存储数据。这正是为什么确定合适的 mbufs 总量极其重要的原因。maxmbuf 可调参数的值用于限制通信系统所使用的内存量。如果该值为 0,那么将使用 thewall 可调参数,并且不能修改其默认值。更改这个可调参数,是降低 thewall 限制的一种方法。作为默认值,如果 maxmbuf 为 0,那么无论 thewall 使用什么都将使用这个值。netstat -m 用于检测失败的网络内存请求(请参见 清单 12)。

清单 12. 带 -m 选项的 netstat
l488pp065_pub[/tmp] > netstat -m
Kernel malloc statistics:

******* CPU 0 *******
By size           inuse     calls failed   delayed    free   hiwat   freed
64                  558   2087455      0         7     274    5240       0
128                5884   1901723      0       175     164    2620       0
256                5780    653578      0       295    2876    5240     500
512                7970 182051630      0       972     102    6550       0
1024               3159   1960612      0       794      49    2620       0
2048               1069   3462138      0       520      25    3930       0
4096               2056      2794      0        83       3    1310       0
8192                  5       260      0         3     163     327       0
16384               256       413      0        62       0     163       0
32768                55       274      0        23       4      81       0
65536               117       175      0        76       0      81       0
131072                4         5      0         0     102     204       0
... other CPU stats trimmed

Streams mblk statistic failures:
0 high priority mblk failures
0 medium priority mblk failures
0 low priority mblk failures

在这个示例中,没有出现任何内存不足(失败)。

尽管您可以使用 no 实用工具更改许多参数,但大多数参数最好还是不要修改。最重要的参数是那些涉及到 TCP 流工作负载优化的参数。

  • tcp_sendspace — 控制内核中用于缓冲应用程序数据的缓冲区空间大小。您可能希望使其超过默认值,因为如果达到了限制值,发送应用程序则将挂起数据传输,直到 TCP 将数据发送到缓冲区为止。
  • tcp_receivespace — 除了控制接收缓冲区所消耗的缓冲区空间总量之外,AIX 7 还使用这个值来确定其传输窗口的大小。
  • udp_sendspace — 对于 UDP,您可以将这个参数设置为不超过 65536 的值,因为每个 IP 数据包的上限为 65536 个字节。
  • udp_resvspace — 这个值应该大于 udp_sendpsace,因为它需要处理每套接字的、尽可能多的同步 UDP 数据包。可以简单地将这个参数设置为 udp_sendpsace 值的 10 倍。

现在,进行一些更改。首先,增加 udp_sendspace 的大小(请参见 清单 13)。

清单 13. 增加 udp_sendspace 的大小
l488pp065_pub[/tmp] > no -p -o udp_sendspace=65536Setting udp_sendspace to 65536
Setting udp_sendspace to 65536 in nextboot file
Change to tunable udp_sendspace, will only be effective for future connections

接下来,将 udp_recsvspace 更改为建议的配置,即 udp_sendspace 的 10 倍。请参见 清单 14

清单 14. 更改 udp_recsvspace 的值
l488pp065_pub[/tmp] > no -p -o udp_recvspace=655360Setting udp_recvspace to 655360
Setting udp_recvspace to 655360 in nextboot file
Change to tunable udp_recvspace, will only be effective for future connections

请注意,-p 标志可以保存相关的条目,即使是在重新启动之后它也是生效的。它将在 /etc/tunables/nextboot 文件中追加相应的节,如 清单 15 所示。

清单 15. 查看 /etc/tunables/nextbook 文件
no:
        udp_recvspace = "655360"
        udp_sendspace = "65536"

对于速度更快的适配器的 tcp 参数,可以将 tcp_sendspace 设置为 tcp_recvspace 值的两倍。例如,您可以使用 清单 16 中的设置。

清单 16. tcp_sendspace 的示例设置
tcp_receivespace = 262144
tcp_sendspace= 524288

其他一些的重要工作负载参数包括 rfc1323sb_max

rfc1323 可调参数支持 TCP 窗口缩放选项,该选项允许 TCP 使用较大的窗口大小。开启这个选项,以支持最佳的 TCP 性能。sb_max 可调参数为排队等待单个套接字的套接字缓冲区数目设置上限,而这个上限可以控制缓冲区(排队等待发送者或者接收的套接字)所使用的缓冲区空间总量。这个总量通常应该小于 wall,并且近似于 tcp 或者 udp 发送和接收设置最大值的 4 倍。例如,如果您的 udp_recvspace 是 655360,那么将其加倍到 1310720 是没有问题的。

现在来了解一下 tcp_nodelayack。这个可调参数提示 TCP 发送一个立即确认信息,而不是延迟确认信息。尽管这样做可能在某些环境中增加更多的开销,但是可以在其他的环境中极大地提高网络性能。如果您更改了这个参数却没有提高性能,那么您可以迅速地将它还原为先前的值。

接下来了解一下 ipqmalen。这个可调参数用于控制 IP 输入队列的长度。如果您看到一个溢出计数器(通过使用 netstat -s),那么设置这个队列的最大长度可以帮助修复这种溢出情况。

ARP 的情况又如何呢?当有许多客户端连接到系统时,您可能希望优化 ARP 缓存。您可以使用 netstat 来查看相关的统计信息(请参见 清单 17)。

清单 17. 使用带有 -p arp 的 netstat
l488pp065_pub[/tmp] > netstat -p arparp:
        12 packets sent
        0 packets purged

如果您发现较高的清除计数,那么可以增大 ARP 表的大小。对于示例表来说,不需要这样做。

下面是与 ARP 相关的 no 参数(请参见 清单 18)。

清单 18. 使用 no 参数
l488pp065_pub[/tmp] > no -a | grep arp                 
                 arpqsize = 12
               arpt_killc = 20
              arptab_bsiz = 7
                arptab_nb = 149

您可以使用 ifconfiglsattr 来查看特定接口的设置。在 清单 19 中,使用 ifconfig 查看设置(查看最后一行内容,它引用了先前提到过的一些可调参数)。

清单 19. 使用 ifconfig 查看特定接口的设置
l488pp065_pub[/tmp] > ifconfig en0en0: flags=1e080863,480<P,BROADCAST,NOTRAILERS,
RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),CHAIN>
        inet 172.29.148.225 netmask 0xffffc000 broadcast 172.29.191.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1

您可以通过使用 SMITchdev 或者 ifconfig 来更改这些选项(针对接口)。请注意,ifconfig 将不会更新对象数据管理器 (ODM),因此在重新启动后,它将还原为先前的值。正因为如此,您应该使用 SMIT 的快速路径 smit tcpip>further configuration>Network interfaces>Change/Show characteristics(请参见 图 1)。

图 1. 使用 SMIT 更改接口设置
使用 SMIT 更改接口设置

您可能会感到奇怪,为什么 no 参数不能应用于某些接口。域名解析是可能影响性能的另一个方面。如果您知道希望怎样进行解析(使用 DNS 或者 hosts 文件),那么请确保在 /etc/netsvc.conf 文件中正确地设置了域名解析。查看 清单 20 中的文件片段。

清单 20. /etc/netsvc.conf 文件片段
# Example:
# aliases = nis, files
#
hosts=local,bind4

如果您正使用 DNS,并且不使用任何 hosts 文件,那么请删除 local;或者如果希望使用它作为 DNS 的后备(但将其作为第二个条目),那么也可以保留它。或者,如果您不使用 DNS,那么可以删除 bind,因为只有在使用不存在的名称服务器进行首次解析尝试(如果它是记录中的第一个条目)时,才会降低性能。


结束语

本文讨论了如何监视网络中的网络数据包。在本文中,您使用了 netstat,并且使用 iptracetcpdump 等跟踪工具深入到了数据包级别。而且,您了解了如何使用 no 实用工具来优化网络。您使用这个实用工具研究了 tcpudp 工作负载优化,同时还了解了一些其他值得关注的参数。您进行了一些优化更改,并了解到如何优化某些设置。您还研究了 ARP 缓存优化,并且看到了如何监视和优化 ARP 统计。您查看了 ISNO,并了解了如何针对接口来优化特定的 no 可调参数。您还了解了名称解析,以及如何通过微调解析主机名的方式轻松提高性能。

参考资料

学习

获得产品和技术

  • Microcode 下载:访问该站点,获取您的适配器的当前发布信息。
  • IBM 试用软件:使用可以直接从 developerWorks 下载的软件构建您的下一个开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=647042
ArticleTitle=优化 AIX 7 网络性能: 第 3 部分,监视网络数据包并优化网络
publish-date=04132011