This document contains the analysis for the Deluge benchmarks.
library(tidyverse)
devtools::load_all()
Parse/Load Data
This is data that’s been pre-parsed from an experiment log source.
deluge <- read_all_experiments('./data/deluge')
Reading experiment e1
Reading experiment e10
Reading experiment e11
Reading experiment e12
Reading experiment e13
Reading experiment e14
Reading experiment e15
Reading experiment e16
Reading experiment e17
Reading experiment e18
Reading experiment e19
Reading experiment e2
Reading experiment e20
Reading experiment e21
Reading experiment e22
Reading experiment e23
Reading experiment e24
Reading experiment e25
Reading experiment e26
Reading experiment e3
Reading experiment e4
Reading experiment e5
Reading experiment e6
Reading experiment e7
Reading experiment e8
Reading experiment e9
Computes the benchmark statistics from raw download logs.
benchmarks <- lapply(deluge, function(experiment) {
print(glue::glue('Process {experiment$experiment_id}'))
download_time_stats <- tryCatch({
meta <- experiment$meta
completion <- experiment |>
download_times() |>
completion_time_stats()
if (is.null(completion)) {
NULL
} else {
completion |> mutate(
network_size = meta$nodes$network_size,
seeders = meta$seeders,
leechers = network_size - meta$seeders,
file_size = meta$file_size
)
}
}, error = function(e) { print(e); NULL })
}) |>
drop_nulls() |>
bind_rows() |>
arrange(file_size, network_size, seeders, leechers) |>
mutate(
file_size = as.character(rlang::parse_bytes(as.character(file_size))),
seeder_ratio = seeders/network_size
) |>
relocate(file_size, network_size, seeders, leechers)
Process e1
Process e10
Process e11
Process e12
Process e13
Process e14
Process e15
Process e16
Process e17
Process e18
Process e19
Process e2
Process e20
Process e21
Process e22
Process e23
Process e24
Process e25
Process e26
Process e3
Process e4
Process e5
Process e6
Process e7
Process e8
Process e9
Results
First, we present the raw data in tabular format:
benchmarks
We then plot the median by network size, and facet it by seeder ratio and file size to see if looks sane:
ggplot(benchmarks) +
geom_line(aes(x = network_size, y = median)) +
geom_point(aes(x = network_size, y = median)) +
ylab('median download time (seconds)') +
xlab('network size') +
theme_minimal(base_size=15) +
facet_grid(
file_size ~ seeder_ratio,
scales = 'free_y',
labeller = labeller(
file_size = as_labeller(function(x) x),
seeder_ratio = as_labeller(function(x) {
paste0("seeder ratio: ", scales::percent(as.numeric(x)))
}))
) +
ylim(c(0,NA))

The data looks largely sane: a larger seeder ratio makes performance somewhat better; though not nearly as consistently as one would hope, at least in this data, and there is a linear performance degradation trend as the network grows larger. Also, the \(100\text{MB}\) file seems to generate much better-behaved data than the \(1\text{GB}\) case with those trends; i.e., larger seeder ratio improving performance, and network size linearly degrading it, being more pronounced.
LS0tCnRpdGxlOiAiQW5hbHlzaXMgZm9yIERlbHVnZSBCZW5jaG1hcmtzIC0gU3RhdGljIE5ldHdvcmsgRGlzc2VtaW5hdGlvbiBFeHBlcmltZW50IgpvdXRwdXQ6IAogIGJvb2tkb3duOjpodG1sX25vdGVib29rMjoKICAgIG51bWJlcl9zZWN0aW9uczogVFJVRQogICAgdG9jOiBUUlVFCmRhdGU6ICIyMDI1LTAxLTE1IgotLS0KClRoaXMgZG9jdW1lbnQgY29udGFpbnMgdGhlIGFuYWx5c2lzIGZvciB0aGUgRGVsdWdlIGJlbmNobWFya3MuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmRldnRvb2xzOjpsb2FkX2FsbCgpCmBgYAoKIyBQYXJzZS9Mb2FkIERhdGEKClRoaXMgaXMgZGF0YSB0aGF0J3MgYmVlbiBwcmUtcGFyc2VkIGZyb20gYW4gZXhwZXJpbWVudCBbbG9nIHNvdXJjZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGV4LXN0b3JhZ2UvYml0dG9ycmVudC1iZW5jaG1hcmtzL2Jsb2IvMWVlOGVhOGEzNWEyYzBmY2NlYTZlN2M5NTUxODNjNGVkMDNlZWJiMy9iZW5jaG1hcmtzL2xvZ2dpbmcvc291cmNlcy5weSNMMjcpLgoKYGBge3J9CmRlbHVnZSA8LSByZWFkX2FsbF9leHBlcmltZW50cygnLi9kYXRhL2RlbHVnZScpCmBgYApDb21wdXRlcyB0aGUgYmVuY2htYXJrIHN0YXRpc3RpY3MgZnJvbSByYXcgZG93bmxvYWQgbG9ncy4KCmBgYHtyfQpiZW5jaG1hcmtzIDwtIGxhcHBseShkZWx1Z2UsIGZ1bmN0aW9uKGV4cGVyaW1lbnQpIHsKICBwcmludChnbHVlOjpnbHVlKCdQcm9jZXNzIHtleHBlcmltZW50JGV4cGVyaW1lbnRfaWR9JykpCiAgZG93bmxvYWRfdGltZV9zdGF0cyA8LSB0cnlDYXRjaCh7CiAgICBtZXRhIDwtIGV4cGVyaW1lbnQkbWV0YQogICAgY29tcGxldGlvbiA8LSBleHBlcmltZW50IHw+CiAgICAgIGRvd25sb2FkX3RpbWVzKCkgfD4KICAgICAgY29tcGxldGlvbl90aW1lX3N0YXRzKCkKICAgIAogICAgaWYgKGlzLm51bGwoY29tcGxldGlvbikpIHsKICAgICAgTlVMTAogICAgfSBlbHNlIHsKICAgICAgY29tcGxldGlvbiB8PiBtdXRhdGUoCiAgICAgICAgbmV0d29ya19zaXplID0gbWV0YSRub2RlcyRuZXR3b3JrX3NpemUsCiAgICAgICAgc2VlZGVycyA9IG1ldGEkc2VlZGVycywKICAgICAgICBsZWVjaGVycyA9IG5ldHdvcmtfc2l6ZSAtIG1ldGEkc2VlZGVycywKICAgICAgICBmaWxlX3NpemUgPSBtZXRhJGZpbGVfc2l6ZQogICAgICApCiAgICB9CiAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7IHByaW50KGUpOyBOVUxMIH0pCn0pIHw+IAogIGRyb3BfbnVsbHMoKSB8PgogIGJpbmRfcm93cygpIHw+CiAgYXJyYW5nZShmaWxlX3NpemUsIG5ldHdvcmtfc2l6ZSwgc2VlZGVycywgbGVlY2hlcnMpIHw+CiAgbXV0YXRlKAogICAgZmlsZV9zaXplID0gYXMuY2hhcmFjdGVyKHJsYW5nOjpwYXJzZV9ieXRlcyhhcy5jaGFyYWN0ZXIoZmlsZV9zaXplKSkpLAogICAgc2VlZGVyX3JhdGlvID0gc2VlZGVycy9uZXR3b3JrX3NpemUKICApIHw+CiAgcmVsb2NhdGUoZmlsZV9zaXplLCBuZXR3b3JrX3NpemUsIHNlZWRlcnMsIGxlZWNoZXJzKQpgYGAKCiMgUmVzdWx0cwoKRmlyc3QsIHdlIHByZXNlbnQgdGhlIHJhdyBkYXRhIGluIHRhYnVsYXIgZm9ybWF0OgoKYGBge3J9CmJlbmNobWFya3MKYGBgCgpXZSB0aGVuIHBsb3QgdGhlIG1lZGlhbiBieSBuZXR3b3JrIHNpemUsIGFuZCBmYWNldCBpdCBieSBzZWVkZXIgcmF0aW8gYW5kIGZpbGUgc2l6ZSB0byBzZWUgaWYgbG9va3Mgc2FuZToKCmBgYHtyIGZpZy53aWR0aCA9IDEwLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpnZ3Bsb3QoYmVuY2htYXJrcykgKwogIGdlb21fbGluZShhZXMoeCA9IG5ldHdvcmtfc2l6ZSwgeSA9IG1lZGlhbikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbmV0d29ya19zaXplLCB5ID0gbWVkaWFuKSkgKwogIHlsYWIoJ21lZGlhbiBkb3dubG9hZCB0aW1lIChzZWNvbmRzKScpICsKICB4bGFiKCduZXR3b3JrIHNpemUnKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTUpICsKICBmYWNldF9ncmlkKAogICAgZmlsZV9zaXplIH4gc2VlZGVyX3JhdGlvLCAKICAgIHNjYWxlcyA9ICdmcmVlX3knLAogICAgbGFiZWxsZXIgPSBsYWJlbGxlcigKICAgICAgZmlsZV9zaXplID0gYXNfbGFiZWxsZXIoZnVuY3Rpb24oeCkgeCksCiAgICAgIHNlZWRlcl9yYXRpbyA9IGFzX2xhYmVsbGVyKGZ1bmN0aW9uKHgpIHsKICAgICAgICBwYXN0ZTAoInNlZWRlciByYXRpbzogIiwgc2NhbGVzOjpwZXJjZW50KGFzLm51bWVyaWMoeCkpKQogICAgICB9KSkKICApICsKICB5bGltKGMoMCxOQSkpCmBgYApUaGUgZGF0YSBsb29rcyBsYXJnZWx5IHNhbmU6IGEgbGFyZ2VyIHNlZWRlciByYXRpbyBtYWtlcyBwZXJmb3JtYW5jZSBzb21ld2hhdCBiZXR0ZXI7IHRob3VnaCBub3QgbmVhcmx5IGFzIGNvbnNpc3RlbnRseSBhcyBvbmUgd291bGQgaG9wZSwgYXQgbGVhc3QgaW4gdGhpcyBkYXRhLCBhbmQgdGhlcmUgaXMgYSBsaW5lYXIgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gdHJlbmQgYXMgdGhlIG5ldHdvcmsgZ3Jvd3MgbGFyZ2VyLiBBbHNvLCB0aGUgJDEwMFx0ZXh0e01CfSQgZmlsZSBzZWVtcyB0byBnZW5lcmF0ZSBtdWNoIGJldHRlci1iZWhhdmVkIGRhdGEgdGhhbiB0aGUgJDFcdGV4dHtHQn0kIGNhc2Ugd2l0aCB0aG9zZSB0cmVuZHM7IGkuZS4sIGxhcmdlciBzZWVkZXIgcmF0aW8gaW1wcm92aW5nIHBlcmZvcm1hbmNlLCBhbmQgbmV0d29yayBzaXplIGxpbmVhcmx5IGRlZ3JhZGluZyBpdCwgYmVpbmcgbW9yZSBwcm9ub3VuY2VkLgo=