| | 1 | |
| | 2 | == The atlasperf1 grid == |
| | 3 | |
| | 4 | All these performance tests are run on a four-machine grid, using hardware |
| | 5 | generously provided by Atlas Networks. Each machine is a dual-core 3GHz P4, |
| | 6 | connected with gigabit(?) ethernet links. Three machines are servers, running |
| | 7 | two servers each (six storage servers in all), each on a separate disk. The |
| | 8 | fourth machine is a client. The storage servers are running a variety of |
| | 9 | versions. |
| | 10 | |
| | 11 | == Versions == |
| | 12 | |
| | 13 | These tests were conducted from 19-Sep-2011 to 22-Sep-2011, against Tahoe |
| | 14 | versions 1.7.1, 1.8.2, and trunk (circa 19-Sep-2011, about [changeset:8e69b94588c1c0e7]). |
| | 15 | |
| | 16 | == Overall Speed == |
| | 17 | |
| | 18 | With the default encoding (k=3), trunk MDMF downloads on this grid run at |
| | 19 | 4.0MBps. Trunk CHK downloads run at 2.6MBps. (For historical comparison, the |
| | 20 | old CHK downloader from 1.7.1 runs at 4.4MBps). CHK performance drops |
| | 21 | significantly with larger k. |
| | 22 | |
| | 23 | == MDMF (trunk) == |
| | 24 | |
| | 25 | MDMF is fast! Trunk downloads 1MB/10MB/100MB MDMF files at around 4MBps. The |
| | 26 | download speed seems unaffected by k (from 1 to 60). Partial reads take the |
| | 27 | expected amount of time: O(data_read), slightly quantized near the 128KiB |
| | 28 | segment size. |
| | 29 | |
| | 30 | * MDMF read versus k, 100MB attachment:MDMF-100MB-vs-k.png (timing5.out) |
| | 31 | * MDMF partial reads, 100MB attachment:MDMF-100MB-partial.png (timing6.out) |
| | 32 | * MDMF partial reads, 1MB attachment:MDMF-1MB-partial.png (timing6.out) |
| | 33 | |
| | 34 | |
| | 35 | == CHK (trunk) == |
| | 36 | |
| | 37 | The new-downloader (introduced in 1.8.0) does not saturate these fast |
| | 38 | connections. Compared to the old-downloader (in 1.7.1), downloads tend to be |
| | 39 | about 3x slower. (note that this delay is probably completely hidden on slow |
| | 40 | WAN links, and it's only the fast LAN connections of the atlasperf1 grid that |
| | 41 | exposes the delay). In addition, both old and new downloaders suffer from a |
| | 42 | linear slowdown as k increases. On the new-downloader, k=60 takes roughly 3x |
| | 43 | more time than k=15. Trunk contains a fix for #1268 that might improve speeds |
| | 44 | by 5% compared to 1.8.2. Partial reads take the expected amount of time, |
| | 45 | although the segsize-quantization was nowhere nearly as clear as with MDMF. |
| | 46 | |
| | 47 | |
| | 48 | * CHK (1.7.1/1.8.2/trunk) read versus k, 1MB attachment:CHK-1MB-vs-k.png (t4/t/t3) |
| | 49 | * CHK (1.7.1/1.8.2/trunk) read versus k, 100MB attachment:CHK-100MB-vs-k.png (t4/t/t3) |
| | 50 | |
| | 51 | * CHK (1.8.2) read versus segsize, 1MB attachment:CHK-1MB-vs-segsize.png (t2) |
| | 52 | * CHK (1.8.2) read versus segsize, 100MB attachment:CHK-100MB-vs-segsize.png (t2) |
| | 53 | |
| | 54 | * CHK (trunk) partial reads, 1MB attachment:CHK-1MB-partial.png (t7) |
| | 55 | * CHK (trunk) partial reads, k=3, 1MB attachment:CHK-1MB-k3-partial.png (t7) |
| | 56 | * CHK (trunk) partial reads, 100MB attachment:CHK-100MB-partial.png (t7) |
| | 57 | |
| | 58 | |
| | 59 | Likely problems include: |
| | 60 | |
| | 61 | * high k and default segsize=128KiB means tiny segments, like 2KB when k=60. |
| | 62 | * lots of reads, lots of foolscap messages, and marshalling is probably slow |
| | 63 | * disk seeks to gather hash nodes from all over the share |
| | 64 | |
| | 65 | Likely fixes include: |
| | 66 | |
| | 67 | * add a readv() API, to reduce the number of Foolscap messages in flight |
| | 68 | * prefetch hash-tree nodes, by reading larger chunks of the tree at once. |
| | 69 | old-downloader cheated by reading the whole hash tree at once, violating |
| | 70 | the memory footprint goals (requires O(numsegments) memory), but probably |
| | 71 | tolerable unless the filesize is really large. |
| | 72 | * encourage use of larger segsize for large files (at the expense of |
| | 73 | alacrity) |
| | 74 | * use unencrypted HTTP for share reads |
| | 75 | |
| | 76 | readv() is the least-work/most-promising, since MDMF has readv() and achieves |
| | 77 | high speeds. First step is to do whatever MDMF is doing |
| | 78 | |
| | 79 | == Future Tests == |
| | 80 | |
| | 81 | * measure alacrity: ask for random single byte, measure elapsed time |
| | 82 | * measure partial-read speeds for CHK |
| | 83 | * measure SDMF/MDMF modification times |
| | 84 | * measure upload times |
| | 85 | * using existing data as a baseline, detect outliers in real-time during the |
| | 86 | benchmark run, and capture more information about them (their "Recent |
| | 87 | Uploads And Downloads" event timeline, for starters) |
| | 88 | |
| | 89 | == Additional Notes == |
| | 90 | |
| | 91 | Some graphs were added to |
| | 92 | http://tahoe-lafs.org/trac/tahoe-lafs/ticket/1264#comment:17 . |
| | 93 | |
| | 94 | Complete benchmark toolchain and data included in |
| | 95 | attachment:benchmark.git.tar.gz |