UNIX 网络性能分析(2)

来源:developworks 作者:Martin C. Brown
  

在执行脚本时,指定源文件的名称和源目录以及可选的复制次数。然后执行脚本并得到一个时间值(见清单 6)。


清单 6. 执行 Perl 脚本
				
$ ./timexfer.pl 2gbfile /nfs/mysql-live/transient 20
Time is 28.45s

可以使用这种方法得到基线数据,也可以在正常操作期间检查传输性能。





回页首


诊断问题

通常,只有在与网络相关的应用程序由于某种原因失败时,您才会去寻找网络问题。但是,一定要确认问题是与网络相关的,而不是其他地方的问题。

首先,应该尝试使用 ping 连接机器。如果此机器对 ping 请求没有响应,其他网络通信机制也无效,那么首先应该检查物理线缆,确保所有设备仍然连接在一起。

如果仍然可以连接此机器,但是 ping 时间增加了,就需要判断出问题的位置。ping 时间增加有时候与机器上的负载相关,但更常见的原因是网络出了问题。

从一台机器得到比较长的 ping 时间之后,应该从网络上(最好在另一台网络交换机上)的另一台机器运行 ping,查明问题是与特定的机器相关,还是与网络相关。

检查网络统计数据

如果 ping 时间高于预期,那么应该开始收集关于正在使用的网络接口的一些基本统计数据,查明问题是与这个网络接口相关,还是与某种协议相关。

在 Linux 上,可以使用 ifconfig 工具获取一些基本网络统计信息(见清单 7)。


清单 7. 使用 ifconfig 工具获取基本网络统计信息
				
$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:1a:ee:01:01:c0  
          inet addr:192.168.0.2  Bcast:192.168.3.255  Mask:255.255.252.0
          inet6 addr: fe80::21a:eeff:fe01:1c0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7916836 errors:0 dropped:78489 overruns:0 frame:0
          TX packets:6285476 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:11675092739 (10.8 GiB)  TX bytes:581702020 (554.7 MiB)
          Interrupt:16 Base address:0x2000 

以 RX 和 TX 开头的行很重要,它们提供关于发送和接收的数据包的信息。packets 值是传输的数据包的数量。errors、dropped 和 overruns 值表示出现某种错误的数据包的数量。如果与发送的数据包相比丢失的数据包数量比较高,可能说明网络忙。

在所有平台上,还可以使用 netstat 工具获得更详细的统计信息。在 Linux 上,此工具提供与协议相关的统计数据,比如 TCP-IP 和 UDP 数据包的传输情况。其中也包含一些基本统计数据(见清单 8)。


清单 8. 使用 netstat
				
$ netstat -s
Ip:
    8437387 total packets received
    1 with invalid addresses
    0 forwarded
    0 incoming packets discarded
    8437383 incoming packets delivered
    6820934 requests sent out
    6 reassemblies required
    3 packets reassembled ok
Icmp:
    502 ICMP messages received
    3 input ICMP message failed.
    ICMP input histogram:
        destination unreachable: 410
        echo requests: 82
        echo replies: 10
    1406 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 1313
        echo request: 11
        echo replies: 82
IcmpMsg:
        InType0: 10
        InType3: 410
        InType8: 82
        OutType0: 82
        OutType3: 1313
        OutType8: 11
Tcp:
    8361 active connections openings
    6846 passive connection openings
    1 failed connection attempts
    164 connection resets received
    33 connections established
    8305361 segments received
    6688553 segments send out
    640 segments retransmitted
    0 bad segments received.
    676 resets sent
Udp:
    126083 packets received
    1294 packets to unknown port received.
    0 packet receive errors
    130335 packets sent
UdpLite:
TcpExt:
    5 packets pruned from receive queue because of socket buffer overrun
    6792 TCP sockets finished time wait in fast timer
    5681 delayed acks sent
    Quick ack mode was activated 11637 times
    150861 packets directly queued to recvmsg prequeue.
    74333 bytes directly in process context from backlog
    9141882 bytes directly received in process context from prequeue
    3608274 packet headers predicted
    42627 packets header predicted and directly queued to user
    77132 acknowledgments not containing data payload received
    374105 predicted acknowledgments
    2 times recovered from packet loss by selective acknowledgements
    77 congestion windows recovered without slow start after partial ack
    1 TCP data loss events
    17 timeouts after SACK recovery
    2 fast retransmits
    8 retransmits in slow start
    236 other TCP timeouts
    1453 packets collapsed in receive queue due to low socket buffer
    11634 DSACKs sent for old packets
    2 DSACKs sent for out of order packets
    2 DSACKs received
    77 connections reset due to unexpected data
    50 connections aborted due to timeout
    TCPDSACKIgnoredNoUndo: 1
    TCPSackShiftFallback: 23
IpExt:
    InBcastPkts: 4126

在 Solaris 和其他 UNIX 平台上,netstat 提供的信息因平台而异。例如,在 Solaris 上,会获得针对每个协议的详细统计数据,以及分别针对 IPv4 和 IPv6 连接的信息(见清单 9)。下面的清单给出一部分输出。


清单 9. 在 Solaris 上使用 netstat
				
$ netstat -s

RAWIP   rawipInDatagrams    =   440     rawipInErrors       =     0
        rawipInCksumErrs    =     0     rawipOutDatagrams   =    91
        rawipOutErrors      =     0

UDP     udpInDatagrams      = 15756     udpInErrors         =     0
        udpOutDatagrams     = 16515     udpOutErrors        =     0

TCP     tcpRtoAlgorithm     =     4     tcpRtoMin           =   400
        tcpRtoMax           = 60000     tcpMaxConn          =    -1
        tcpActiveOpens      =  1735     tcpPassiveOpens     =    54
        tcpAttemptFails     =     2     tcpEstabResets      =    35
        tcpCurrEstab        =     2     tcpOutSegs          =13771839
        tcpOutDataSegs      =13975728   tcpOutDataBytes     =1648876686
        tcpRetransSegs      = 90215     tcpRetransBytes     =130340273
        tcpOutAck           =151539     tcpOutAckDelayed    =  5570
        tcpOutUrg           =     0     tcpOutWinUpdate     =    31
        tcpOutWinProbe      =    86     tcpOutControl       =  3750
        tcpOutRsts          =    63     tcpOutFastRetrans   =     6
        tcpInSegs           =7548720
        tcpInAckSegs        =2882026    tcpInAckBytes       =1648874900
        tcpInDupAck         =4413016    tcpInAckUnsent      =     0
        tcpInInorderSegs    =415007     tcpInInorderBytes   =367832646
        tcpInUnorderSegs    =  7650     tcpInUnorderBytes   =10389516
        tcpInDupSegs        =   222     tcpInDupBytes       = 74649
        tcpInPartDupSegs    =     0     tcpInPartDupBytes   =     0
        tcpInPastWinSegs    =     0     tcpInPastWinBytes   =     0
        tcpInWinProbe       =     0     tcpInWinUpdate      =     2
        tcpInClosed         =    33     tcpRttNoUpdate      =   660
        tcpRttUpdate        =2880379    tcpTimRetrans       =  2262
        tcpTimRetransDrop   =    10     tcpTimKeepalive     =   630
        tcpTimKeepaliveProbe=   314     tcpTimKeepaliveDrop =    17
        tcpListenDrop       =     0     tcpListenDropQ0     =     0
        tcpHalfOpenDrop     =     0     tcpOutSackRetrans   = 69348
...

在所有情况下,都要寻找比较高的错误数据包、重新传输或丢失数据包传输数量,这些都说明网络忙。如果与传输或接收的数据包相比错误率很高,可能说明网络硬件有问题。

检查 NFS 统计数据

在检查与 NFS 连接和大多数其他网络应用程序相关的问题时,首先应该确定这个问题与机器上的问题无关,比如高负载(这会显著影响处理请求的速度)。使用 uptime 和 ps 检查进程,就可以查明机器是否很忙。


时间:2009-10-30 20:16 来源:developworks 作者:Martin C. Brown 原文链接

好文,顶一下
(8)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量