在执行脚本时,指定源文件的名称和源目录以及可选的复制次数。然后执行脚本并得到一个时间值(见清单 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 连接和大多数其他网络应用程序相关的问题时,首先应该确定这个问题与机器上的问题无关,比如高负载(这会显著影响处理请求的速度)。使用 uptime 和 ps 检查进程,就可以查明机器是否很忙。