UNIX 网络性能分析

来源:developworks 作者:Martin C. Brown
  
了解 UNIX® 网络布局会帮助您了解自己的网络及其运行方式。但是,当 UNIX 网络性能和传输文件或连接服务的速度突然下降时,究竟发生了什么?如何诊断网络问题并找到网络中出现问题的地方?本文介绍一些快速发现和识别性能问题的方法以及解决问题的步骤。

简介

网络的性能对于环境其余部分的性能和可靠性影响很大。如果应用程序和服务等待通过网络传输的数据,或者客户机无法连接它们或接收信息,就需要解决这些问题。

性能问题还会影响应用程序和环境的可靠性。性能问题可能由网络故障导致,在某些情况下性能问题甚至是网络故障的原因。要想了解和诊断网络问题,首先需要了解问题的性质;问题往往与延时或带宽相关。

在一般情况下,网络性能问题常常与底层硬件有关;无法突破网络环境的物理限制。所有性能问题还常常与某种协议或系统相关,比如 NFS 或 Web 访问。但是,可以在操作系统中诊断和识别问题,决定正确的纠正措施。

本文讨论识别性能问题涉及的几个步骤:

  • 确定基线性能水平
  • 判断发生问题的位置
  • 获得统计数据
  • 识别瓶颈



了解网络指标

要想了解和诊断性能问题,首先需要确定基线性能水平。首先介绍在判断基线性能时使用的两个重要概念:网络延时和网络带宽。

网络延时

网络延时是向目的地发送请求到目的地实际接收到数据包之间的时间间隔。作为网络性能指标,延时增加说明网络繁忙,这意味着要传输的数据包数量超过了传输能力,数据的发送者在传输或重新传输之前必须等待。

当网络的复杂性以及数据包要经过的主机或网关数量增加时,也会增加网络延时。点之间的线缆长度也会影响延时。对于长距离线路,传统的铜线总是比光纤连接慢。

网络延时与应用程序延时不同。网络延时只与通过网络传输数据包相关,而应用程序延时是指应用程序接收请求到它做出响应之间的时间间隔。

网络带宽

带宽表示在特定的一段时间内可以通过网络传输的数据包数量。带宽影响可以传输的数据量,它把向一个主机传输数据的速度限制为网络连接支持的最大速度,在使用多个并发连接时限制总传输速度。

从理论上说,网络带宽应该不会变,除非改变网络接口和硬件。影响网络带宽的主要因素是在给定时刻使用网络的主机数量。

例如,1GB 的以太网接口可以向另一个网络主机传输 1GB 数据,或向 10 个主机同时传输 100MB,或向 100 个主机同时传输 10MB。当然,实际上常常不需要稳定的带宽。在一段时间内会有来自大量主机的许多小请求,服务器的可用带宽看起来可以比客户机带宽的总和大得多。




获得统计数据

在判断网络中是否发生问题之前,需要先确定基线性能,然后据此做出假设。为此,必须通过检查各种网络参数(与网络应用程序环境相关的延时、性能和测试)判断性能,然后监视和对比性能随时间的变化。

应该在可控制的状况下执行基线网络测试。在理想情况下,应该在隔离(没有其他网络通信流)和有典型的网络通信流两种场景中执行测试,这会提供两个基线:

  • 对于隔离监视,应该在网络上没有其他通信流的情况下,检查服务器与一个或多个客户机之间的性能。这意味着要么关闭其他服务,要么把服务器和客户机放在一个隔离的网络环境中,这个环境与标准网络环境完全隔离(但是完全相同)。
  • 对于标准监视,应该把客户机和服务器连接到标准网络,网络上有正常的背景通信流,但是除了要测试的服务器之外,禁用所有与应用程序相关的通信流(比如电子邮件、文件服务、Web 服务)。

对于实际测试过程,可以使用许多标准工具和测试判断基线值。

测量延时

所有网络管理员都很熟悉 ping 工具,使用它作为检查网络设备的可用性和延时的基本工具。在大多数机器上都可以使用 ping,包括客户机和服务器,只要它们已经配置为对 ping 工具发送给设备的 ICMP 数据包做出响应。简单地说,ping 向设备发送一个 echo 数据包,期望设备把数据包的内容发送回来。

在这个过程中,ping 可以监视发送数据包和接收响应花费的时间,这是测量 echo 过程的响应时间的有效方法。按照最简单的形式,可以向一个主机发送 echo 请求并查明响应时间(见清单 1)。


清单 1. 使用 ping 判断延时
				
$ ping example

PING example.example.pri (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.169 ms
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.167 ms
^C
--- example.example.pri ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.167/0.168/0.169/0.001 ms

需要使用 Control-C 停止 ping 过程。在 Solaris 和 AIX® 上,需要使用 -s 选项发送多个 echo 数据包并获得计时信息。为了获得基线数据,可以使用 -c 选项(在 Linux® 上)指定数量。在 Solaris/AIX 上,可以指定数据包大小(默认大小为 56 字节)和要发送的数据包数量,这样就不必手工终止 ping 过程。然后可以自动地获得计时信息(见清单 2)。


清单 2. 在 Solaris/AIX 上使用 ping 时指定数据包大小
				
$ ping -s example 56 10
PING example: 56 data bytes
64 bytes from example.example.pri (192.168.0.2): icmp_seq=0. time=0.143 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=1. time=0.163 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=2. time=0.146 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=3. time=0.134 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=4. time=0.151 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=5. time=0.107 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=6. time=0.142 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=7. time=0.136 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=8. time=0.143 ms
64 bytes from example.example.pri (192.168.0.2): icmp_seq=9. time=0.103 ms

----example PING Statistics----
10 packets transmitted, 10 packets received, 0% packet loss
round-trip (ms)  min/avg/max/stddev = 0.103/0.137/0.163/0.019

清单 2 中的示例是在网络比较空闲的时候得到的结果。如果在测试期间检查的主机(或网络本身)比较忙,那么 ping 时间会显著增加。只使用 ping 不足以表明是否有问题,但是有时候 ping 可以快速地查明是否有问题需要进一步诊断。

对 ping 的支持可能会禁用,所以在使用 ping 检查主机是否可用之前应该确认能够访问此主机。

理想情况下,应该在一段时间内连续地跟踪特定主机之间的 ping 时间,这样就可以得到平均响应时间,然后识别要检查的位置。

使用 sprayd

sprayd 守护进程和相关联的 spray 工具向指定的主机发送一个大的数据包流,判断这些数据包中有多少得到了响应。它是一种测量网络性能的方法,不应该把它当作性能指标,因为它使用无连接的传输机制。根据定义,使用无连接传输机制发送的数据包并不保证能够到达目的地,在通信中允许丢失数据包。

使用 spray 可以查明网络上是否有很多通信流,因为如果无连接传输 (UDP) 丢失许多数据包,就说明网络(或主机)太忙了。

在 Solaris、AIX 和其他一些 UNIX 平台上可以使用 spray。可能需要启用 spray 守护进程(通常通过 inetd)。启动 sprayd 守护进程之后,可以运行 spray 并指定主机名(见清单 3)。


清单 3. 使用 spray
				
$ spray tiger
sending 1162 packets of length 86 to tiger ...
        101 packets (8.692%) dropped by tiger
        70 packets/sec, 6078 bytes/sec

正如前面提到的,不应该把速度作为可靠的性能指标,但是丢失的数据包数量是有意义的。




使用简单的网络传输测试

判断网络带宽性能的最佳方法是,在与机器收发数据时检查实际的速度。可以使用许多不同的工具执行跨许多应用程序和协议的测试,但是最简单的方法往往是最有效的。

例如,为了判断在使用 NFS 通过网络传输文件时的网络带宽,可以对一个简单的文件传输过程进行计时。为此,使用 mkfile 创建一个大文件(例如使用 $ mkfile 2g 2gbfile 创建一个 2GB 的文件),然后通过网络把它传输给另一台机器并计算花费的时间(见清单 4)。


清单 4. 计算通过网络把文件传输给另一台机器花费的时间
				
$ time cp /nfs/mysql-live/transient/2gbfile .

real	3m45.648s
user	0m0.010s
sys	0m9.840s

应该多次运行测试,然后求出传输过程的平均时间,从而比较准确地了解性能水平。

可以使用清单 5 这样的 Perl 脚本自动地执行复制和计时。


清单 5. 使用 Perl 脚本自动地执行复制和计时
				
#!/usr/bin/perl
               
use Benchmark; 
use File::Copy;
use Data::Dumper;
                 
my $file = shift or die "Need a file to copy from\n";
my $srcdir = shift or die "Need a source directory to copy from\n";
my $count = shift || 10;
                        
my $t = timeit($count,sub {copy(sprintf("%s/%s",$srcdir,$file),$file)}); 
                 
printf("Time is %.2fs\n",($t->[0]/$count)); 

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

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


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