By user12608726 on May 06, 2008
Today UPerf is being open sourced. Uperf is one of the key network performance measurement tools that we use at Performance Technologies (PT) at Sun. It is unique in its ability to simulate all kinds of network traffic, which may be easily specified in XML format, and its ability to gather comprehensive network performance data both from the System Under Test (SUT) and remote clients.
Let me give you an example. Suppose I wish to evaluate how my server responds to HTTP GET requests for medium sized files/ images. In this scenario, the server which is the SUT receives the GET requests, which are small (<64 byte) sized messages (We are excluding the network stack overhead here). In response it sends back a file/image of size 64 KBytes. Here is the Uperf XML profile corresponding to this network scenario. The profile mentions that the SUT receives requests from three clients, which will be specified by shell environmental variables: host1, host2, and host3. The number of connections is specified by the variable nth. The transaction defines the patterns of the network traffic, which is a 64 byte read followed by a 64 Kbytes write. This pattern continues for every connection for the specified duration: 120 seconds.
One of the best ways to use Uperf is to write a wraparound script that examines a workload under different scenarios and then parses through uperf outputs to generate a comprehensive report. Here is a bash script to do the same. This script has been designed to use the output of vmstat 1 in Solaris, an equivalent script may be written for Linux. I examine how my SUT performs with the HTTP Get workload for different number of connections.
My network comprises of my SUT connected to three clients with 10 Gig Ethernet Sun Neptune cards using a Cisco 6509 switch.
Now if I run my script as:
./runuperf.sh ~/ 18.104.22.168 22.214.171.124 126.96.36.199
I get the following neat output which reports throughput as well as CPU utilizations.
Section: uperf tests using the HTTP GET network profile
#Conn Wnd cpu(usr) cpu(sys) cpu(idle) Throughput (Mbps)
1 256k 0 11 89 1585.10
10 256k 0 27 73 3631.86
30 256k 1 78 21 5790.68
100 256k 1 98 1 6577.13
300 256k 1 99 0 6537.30
1000 256k 2 98 0 6629.40
2000 256k 2 98 0 6652.14
3000 256k 1 99 0 6673.01
So I can easily know that for the HTTP GET workload, my SUT will scale to about 100 simultaneous network connections for this desired workload and in terms of throughput to about 6.5 Gbps.
It is important to remember that UPerf is used in the above example to emulate network traffic for HTTP GET. The above does not mean that my SUT wull scale to only 100 HTTP
Note that I have parsed the uperf report to extract the bits that were most useful for me. Uperf reports are pretty comprehensive and I would refer you to the uperf documentation for the same.
Now if I were smart like Charles, I would draw a neat graph, and then show it to my manager :)
Have fun uperfing, and please do post your comments here.