We recently ran some tests that we thought would be interesting to
share. We used the following setup:
- single client
- 16 servers
- gigabit ethernet
- read/write tests, with 40 GB files
- using reads and writes of 100 MB each in size
- varying number of processes running concurrently on the client
This test application can be configured to be run with multiple
processes and/or multiple client nodes. In this case we kept everything
on a single client to focus on bottlenecks on that side.
What we were looking at was the kernel buffer settings controlled in
pint-dev-shared.h. By default PVFS2 uses 5 buffers of 4 MB each. After
experimenting for a while, we made a few observations:
- increasing the buffer size helped performance
- using only 2 buffers (rather than 5) was sufficient to saturate the
client when we were running multiple processes; adding more made only a
marginal difference
We found good results using 2 32MB buffers. Here are some comparisons
between the standard settings and the 2 x 32MB configuration:
results for RHEL4 (2.6 kernel):
------------------------------
5 x 4MB, 1 process: 83.6 MB/s
2 x 32MB, 1 process: 95.5 MB/s
5 x 4MB, 5 processes: 107.4 MB/s
2 x 32MB, 5 processes: 111.2 MB/s
results for RHEL3 (2.4 kernel):
-------------------------------
5 x 4MB, 1 process: 80.5 MB/s
2 x 32MB, 1 process: 90.7 MB/s
5 x 4MB, 5 processes: 91 MB/s
2 x 32MB, 5 processes: 103.5 MB/s
A few comments based on those numbers:
- on 3 out of 4 tests, we saw a 13-15% performance improvement by going
to 2 32 MB buffers
- the remaining test (5 process RHEL4) probably did not see as much
improvement because we maxed out the network. In the past, netpipe has
shown that we can get around 112 MB/s out of these nodes.
- the RHEL3 nodes are on a different switch, so it is hard to say how
much of the difference from RHEL3 to RHEL4 is due to network topology
and how much is due to the kernel version
It is also worth noting that even with this tuning, the single process
tests are about 14% slower than the 5 process tests. I am guessing that
this is due to a lack of pipelining, probably caused by two things:
- the application only submitting one read/write at a time
- the kernel module itself serializing when it breaks reads/writes into
buffer sized chunks
The latter could be addressed by either pipelining the I/O through the
bufmap interface (so that a single read or write could keep multiple
buffers busy) or by going to a system like Murali came up with for
memory transfers a while back that isn't limited by buffer size.
It would also be nice to have a way to set these buffer settings without
recompiling- either via module options or via pvfs2-client-core command
line options. For the time being we are going to hard code our tree to
run with the 32 MB buffers. The 64 MB of RAM that this uses up (vs. 20
MB with the old settings) doesn't really matter for our standard node
footprint.
-Phil
_______________________________________________
Pvfs2-developers mailing list
Pvfs2-developers@beowulf-underground.org
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers