FINALLY add the rest of the graphs with this hellish code
i will be repenting to the DRY gods for the rest of eternity
This commit is contained in:
parent
92ce85cf59
commit
4e20db145e
8 changed files with 663 additions and 26 deletions
4
assets/benchmarking-dwarfs/js/declare_vars.js
Normal file
4
assets/benchmarking-dwarfs/js/declare_vars.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
let labels;
|
||||||
|
let config;
|
||||||
|
let data;
|
||||||
|
let ctx;
|
46
assets/benchmarking-dwarfs/js/rand_latency.js
Normal file
46
assets/benchmarking-dwarfs/js/rand_latency.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
labels = ['Null 25 GiB file', 'Random 25 GiB file', '100 million-sided polygon data', 'Linux LTS kernel', '1024 null files (avg)', '1024 random files (avg)']
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
label: 'DwarFS',
|
||||||
|
data: [351.30788, 3513.96, 480.97789, 0.882576, 0.000811, 0.000661],
|
||||||
|
backgroundColor: 'rgb(255, 99, 132)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'fuse-archive (tar)',
|
||||||
|
data: [0.0, 0.0, 0.0, 0.0, 0.000652, 0.000772],
|
||||||
|
backgroundColor: 'rgb(75, 192, 192)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'Btrfs',
|
||||||
|
data: [5.51523, 91.13626, 94.05722, 0.949771, 0.000741, 0.0007509999999999999],
|
||||||
|
backgroundColor: 'rgb(54, 162, 235)',
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Random Read Latency - in ms'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.defaults.borderColor = "#eee"
|
||||||
|
Chart.defaults.color = "#eee";
|
||||||
|
ctx = document.getElementById("rand_read_latency_chart");
|
||||||
|
new Chart(ctx, config);
|
46
assets/benchmarking-dwarfs/js/rand_read.js
Normal file
46
assets/benchmarking-dwarfs/js/rand_read.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
labels = ['Null 25 GiB file', 'Random 25 GiB file', '100 million-sided polygon data', 'Linux LTS kernel']
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
label: 'DwarFS',
|
||||||
|
data: [0.37114600000000003, 14.15143, 2.95083, 0.001523],
|
||||||
|
backgroundColor: 'rgb(255, 99, 132)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'fuse-archive (tar)',
|
||||||
|
data: [0.393568, 0.397626, 0.07750499999999999, 0.0012230000000000001],
|
||||||
|
backgroundColor: 'rgb(75, 192, 192)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'Btrfs',
|
||||||
|
data: [0.027922000000000002, 0.290906, 0.14088399999999998, 0.0013930000000000001],
|
||||||
|
backgroundColor: 'rgb(54, 162, 235)',
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Random Read Times - in ms'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.defaults.borderColor = "#eee"
|
||||||
|
Chart.defaults.color = "#eee";
|
||||||
|
ctx = document.getElementById("rand_read_chart");
|
||||||
|
new Chart(ctx, config);
|
|
@ -1,26 +1,26 @@
|
||||||
const labels = ['Null 25 GiB file', 'Random 25 GiB file', '100 million-sided polygon data', 'Linux LTS kernel', '1024 null files', '1024 random files']
|
labels = ['Null 25 GiB file', 'Random 25 GiB file', '100 million-sided polygon data', 'Linux LTS kernel', '1024 null files (avg)', '1024 random files (avg)']
|
||||||
let data = [
|
data = [
|
||||||
{
|
{
|
||||||
label: 'DwarFS',
|
label: 'DwarFS',
|
||||||
data: [0.37114600000000003, 14.15143, 2.95083, 0.001523, 0.014287000000000001, 0.013595000000000001],
|
data: [96.32895, 109.78266, 96.3926, 94.55468, 0.014287000000000001, 0.013595000000000001],
|
||||||
backgroundColor: 'rgb(255, 99, 132)',
|
backgroundColor: 'rgb(255, 99, 132)',
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label: 'fuse-archive (tar)',
|
label: 'fuse-archive (tar)',
|
||||||
data: [0.393568, 0.397626, 0.07750499999999999, 0.0012230000000000001, 0.013405, 0.013465],
|
data: [98.66828, 94.52984, 96.61561, 93.25915, 0.013405, 0.013465],
|
||||||
backgroundColor: 'rgb(75, 192, 192)',
|
backgroundColor: 'rgb(75, 192, 192)',
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
label: 'Btrfs',
|
label: 'Btrfs',
|
||||||
data: [0.027922000000000002, 0.290906, 0.14088399999999998, 0.0013930000000000001, 0.0032860000000000003, 0.003326],
|
data: [96.79632, 97.642, 98.92292, 91.41823, 0.0032860000000000003, 0.003326],
|
||||||
backgroundColor: 'rgb(54, 162, 235)',
|
backgroundColor: 'rgb(54, 162, 235)',
|
||||||
},
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
let config = {
|
config = {
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
data: {
|
data: {
|
||||||
datasets: data,
|
datasets: data,
|
||||||
|
@ -42,5 +42,5 @@ let data = [
|
||||||
|
|
||||||
Chart.defaults.borderColor = "#eee"
|
Chart.defaults.borderColor = "#eee"
|
||||||
Chart.defaults.color = "#eee";
|
Chart.defaults.color = "#eee";
|
||||||
let ctx = document.getElementById("seq_read_latency_chart");
|
ctx = document.getElementById("seq_read_latency_chart");
|
||||||
new Chart(ctx, config);
|
new Chart(ctx, config);
|
||||||
|
|
46
assets/benchmarking-dwarfs/js/seq_read.js
Normal file
46
assets/benchmarking-dwarfs/js/seq_read.js
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
labels = ['Null 25 GiB file', 'Random 25 GiB file', '100 million-sided polygon data', 'Linux LTS kernel', '1024 null files (avg)', '1024 random files (avg)']
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
label: 'DwarFS',
|
||||||
|
data: [12.8049, 40.71916, 19.11096, 0.16075466, 0.000945113, 3.6729e-05],
|
||||||
|
backgroundColor: 'rgb(255, 99, 132)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'fuse-archive (tar)',
|
||||||
|
data: [24.88932, 24.84052, 26.63768, 0.121502, 4.131799999999999e-05, 1.6571e-05],
|
||||||
|
backgroundColor: 'rgb(75, 192, 192)',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
label: 'Btrfs',
|
||||||
|
data: [25.5482, 16.91976, 17.98264, 0.08859571, 6.873e-06, 6.432e-06],
|
||||||
|
backgroundColor: 'rgb(54, 162, 235)',
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Sequential Read Times - in s'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Chart.defaults.borderColor = "#eee"
|
||||||
|
Chart.defaults.color = "#eee";
|
||||||
|
ctx = document.getElementById("seq_read_chart");
|
||||||
|
new Chart(ctx, config);
|
|
@ -25,9 +25,9 @@ class HelperFunctions:
|
||||||
elif filename.startswith('kernel'):
|
elif filename.startswith('kernel'):
|
||||||
return 'Linux LTS kernel'
|
return 'Linux LTS kernel'
|
||||||
elif filename == 'small-files/random':
|
elif filename == 'small-files/random':
|
||||||
return '1024 random files'
|
return '1024 random files (avg)'
|
||||||
elif filename == 'small-files/null':
|
elif filename == 'small-files/null':
|
||||||
return '1024 null files'
|
return '1024 null files (avg)'
|
||||||
|
|
||||||
def convert_time(time: str, unit: str) -> int:
|
def convert_time(time: str, unit: str) -> int:
|
||||||
unit_exponents = ['ns', 'µs', 'ms', 's']
|
unit_exponents = ['ns', 'µs', 'ms', 's']
|
||||||
|
@ -62,10 +62,10 @@ def get_seq_latency_data() -> tuple:
|
||||||
'labels'
|
'labels'
|
||||||
] else False
|
] else False
|
||||||
try:
|
try:
|
||||||
datasets[fs].append(line[3])
|
datasets[fs].append(line[4])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
datasets[fs] = []
|
datasets[fs] = []
|
||||||
datasets[fs].append(line[3])
|
datasets[fs].append(line[4])
|
||||||
|
|
||||||
# NOTE: this will break if the bulk data contains a larger unit than the single file data, but that's unlikely to happen so I'm not gonna deal with it
|
# NOTE: this will break if the bulk data contains a larger unit than the single file data, but that's unlikely to happen so I'm not gonna deal with it
|
||||||
largest_time_unit = 'ns'
|
largest_time_unit = 'ns'
|
||||||
|
@ -73,6 +73,8 @@ def get_seq_latency_data() -> tuple:
|
||||||
if key == 'labels':
|
if key == 'labels':
|
||||||
continue
|
continue
|
||||||
for item in datasets[key]:
|
for item in datasets[key]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
if item.endswith('ms'):
|
if item.endswith('ms'):
|
||||||
largest_time_unit = 'ms'
|
largest_time_unit = 'ms'
|
||||||
elif item.endswith('µs') and largest_time_unit != 'ms':
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
@ -83,7 +85,7 @@ def get_seq_latency_data() -> tuple:
|
||||||
and largest_time_unit != 'µs'
|
and largest_time_unit != 'µs'
|
||||||
):
|
):
|
||||||
largest_time_unit = 'ns'
|
largest_time_unit = 'ns'
|
||||||
elif re.sub('[0-9]', '', item) == 's':
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
largest_time_unit = 's'
|
largest_time_unit = 's'
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -106,6 +108,8 @@ def get_seq_latency_data() -> tuple:
|
||||||
] else False
|
] else False
|
||||||
|
|
||||||
for item in line[3:]:
|
for item in line[3:]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
if item.endswith('ms'):
|
if item.endswith('ms'):
|
||||||
largest_time_unit = 'ms'
|
largest_time_unit = 'ms'
|
||||||
elif item.endswith('µs') and largest_time_unit != 'ms':
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
@ -116,7 +120,7 @@ def get_seq_latency_data() -> tuple:
|
||||||
and largest_time_unit != 'µs'
|
and largest_time_unit != 'µs'
|
||||||
):
|
):
|
||||||
largest_time_unit = 'ns'
|
largest_time_unit = 'ns'
|
||||||
elif re.sub('[0-9]', '', item) == 's':
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
largest_time_unit = 's'
|
largest_time_unit = 's'
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -127,6 +131,7 @@ def get_seq_latency_data() -> tuple:
|
||||||
|
|
||||||
return (datasets, largest_time_unit)
|
return (datasets, largest_time_unit)
|
||||||
|
|
||||||
|
|
||||||
def seq_latency():
|
def seq_latency():
|
||||||
with open('assets/benchmarking-dwarfs/js/seq_latency.js', 'wt') as f:
|
with open('assets/benchmarking-dwarfs/js/seq_latency.js', 'wt') as f:
|
||||||
# from https://github.com/chartjs/Chart.js/blob/master/docs/scripts/utils.js (CHART_COLORS)
|
# from https://github.com/chartjs/Chart.js/blob/master/docs/scripts/utils.js (CHART_COLORS)
|
||||||
|
@ -141,8 +146,7 @@ def seq_latency():
|
||||||
"'rgb(201, 203, 207)'", # grey
|
"'rgb(201, 203, 207)'", # grey
|
||||||
]
|
]
|
||||||
|
|
||||||
#print('Sequential latency:')
|
labels_code = 'labels = $labels$'
|
||||||
labels_code = 'const labels = $labels$'
|
|
||||||
dataset_code = '''
|
dataset_code = '''
|
||||||
{
|
{
|
||||||
label: '$label$',
|
label: '$label$',
|
||||||
|
@ -152,7 +156,7 @@ def seq_latency():
|
||||||
'''
|
'''
|
||||||
|
|
||||||
config_code = '''
|
config_code = '''
|
||||||
let config = {
|
config = {
|
||||||
type: 'bar',
|
type: 'bar',
|
||||||
data: {
|
data: {
|
||||||
datasets: data,
|
datasets: data,
|
||||||
|
@ -177,7 +181,7 @@ def seq_latency():
|
||||||
labels_code = labels_code.replace('$labels$', format(data['labels']))
|
labels_code = labels_code.replace('$labels$', format(data['labels']))
|
||||||
f.write(labels_code)
|
f.write(labels_code)
|
||||||
data.pop('labels')
|
data.pop('labels')
|
||||||
f.write('\nlet data = [')
|
f.write('\ndata = [')
|
||||||
for fs in data.keys():
|
for fs in data.keys():
|
||||||
f.write(
|
f.write(
|
||||||
dataset_code.replace('$label$', fs)
|
dataset_code.replace('$label$', fs)
|
||||||
|
@ -188,22 +192,479 @@ def seq_latency():
|
||||||
|
|
||||||
title = 'Sequential Read Latency'
|
title = 'Sequential Read Latency'
|
||||||
f.write(
|
f.write(
|
||||||
config_code.replace('$title$', title).replace('$timeunit$', largest_time_unit)
|
config_code.replace('$title$', title).replace(
|
||||||
|
'$timeunit$', largest_time_unit
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
f.write('\nChart.defaults.borderColor = "#eee"\n')
|
f.write('\nChart.defaults.borderColor = "#eee"\n')
|
||||||
f.write('Chart.defaults.color = "#eee";\n')
|
f.write('Chart.defaults.color = "#eee";\n')
|
||||||
f.write('let ctx = document.getElementById("seq_read_latency_chart");\n')
|
f.write('ctx = document.getElementById("seq_read_latency_chart");\n')
|
||||||
f.write('new Chart(ctx, config);\n')
|
f.write('new Chart(ctx, config);\n')
|
||||||
|
|
||||||
|
|
||||||
def singles():
|
def get_rand_latency_data() -> tuple:
|
||||||
pass
|
# format: { 'labels': ['btrfs'], 'btrfs': [9, 8, 4, 6]}
|
||||||
|
datasets = {'labels': []}
|
||||||
|
with open('assets/benchmarking-dwarfs/data/benchmark-data.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
try:
|
||||||
|
datasets[fs].append(line[5])
|
||||||
|
except KeyError:
|
||||||
|
datasets[fs] = []
|
||||||
|
datasets[fs].append(line[5])
|
||||||
|
|
||||||
|
# NOTE: this will break if the bulk data contains a larger unit than the single file data, but that's unlikely to happen so I'm not gonna deal with it
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for item in datasets[key]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for i in range(len(datasets[key])):
|
||||||
|
datasets[key][i] = HelperFunctions.convert_time(
|
||||||
|
datasets[key][i], largest_time_unit
|
||||||
|
)
|
||||||
|
|
||||||
|
with open('assets/benchmarking-dwarfs/data/bulk.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
if line[2] != 'bulk_random_read_latency':
|
||||||
|
continue
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
|
||||||
|
for item in line[3:]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for i in range(len(line[3:])):
|
||||||
|
line[i + 3] = HelperFunctions.convert_time(item, largest_time_unit)
|
||||||
|
|
||||||
|
datasets[fs].append(sum(line[3:]) / len(line[3:]))
|
||||||
|
|
||||||
|
return (datasets, largest_time_unit)
|
||||||
|
|
||||||
|
|
||||||
def bulk():
|
def rand_latency():
|
||||||
pass
|
with open('assets/benchmarking-dwarfs/js/rand_latency.js', 'wt') as f:
|
||||||
|
# from https://github.com/chartjs/Chart.js/blob/master/docs/scripts/utils.js (CHART_COLORS)
|
||||||
|
# modified so similar color aren't adjacent
|
||||||
|
chart_colors = [
|
||||||
|
"'rgb(255, 99, 132)'", # red
|
||||||
|
"'rgb(75, 192, 192)'", # green
|
||||||
|
"'rgb(54, 162, 235)'", # blue
|
||||||
|
"'rgb(255, 159, 64)'", # orange
|
||||||
|
"'rgb(153, 102, 255)'", # purple
|
||||||
|
"'rgb(255, 205, 86)'", # yellow
|
||||||
|
"'rgb(201, 203, 207)'", # grey
|
||||||
|
]
|
||||||
|
|
||||||
|
labels_code = 'labels = $labels$'
|
||||||
|
dataset_code = '''
|
||||||
|
{
|
||||||
|
label: '$label$',
|
||||||
|
data: $data$,
|
||||||
|
backgroundColor: $color$,
|
||||||
|
},
|
||||||
|
'''
|
||||||
|
|
||||||
|
config_code = '''
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: '$title$ - in $timeunit$'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
'''
|
||||||
|
|
||||||
|
data, largest_time_unit = get_rand_latency_data()
|
||||||
|
labels_code = labels_code.replace('$labels$', format(data['labels']))
|
||||||
|
f.write(labels_code)
|
||||||
|
data.pop('labels')
|
||||||
|
f.write('\ndata = [')
|
||||||
|
for fs in data.keys():
|
||||||
|
f.write(
|
||||||
|
dataset_code.replace('$label$', fs)
|
||||||
|
.replace('$data$', format(data[fs]))
|
||||||
|
.replace('$color$', format(chart_colors[list(data.keys()).index(fs)]))
|
||||||
|
)
|
||||||
|
f.write('\n]\n')
|
||||||
|
|
||||||
|
title = 'Random Read Latency'
|
||||||
|
f.write(
|
||||||
|
config_code.replace('$title$', title).replace(
|
||||||
|
'$timeunit$', largest_time_unit
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
f.write('\nChart.defaults.borderColor = "#eee"\n')
|
||||||
|
f.write('Chart.defaults.color = "#eee";\n')
|
||||||
|
f.write('ctx = document.getElementById("rand_read_latency_chart");\n')
|
||||||
|
f.write('new Chart(ctx, config);\n')
|
||||||
|
|
||||||
|
|
||||||
|
def get_seq_read_data() -> tuple:
|
||||||
|
# format: { 'labels': ['btrfs'], 'btrfs': [9, 8, 4, 6]}
|
||||||
|
datasets = {'labels': []}
|
||||||
|
with open('assets/benchmarking-dwarfs/data/benchmark-data.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
try:
|
||||||
|
datasets[fs].append(line[2])
|
||||||
|
except KeyError:
|
||||||
|
datasets[fs] = []
|
||||||
|
datasets[fs].append(line[2])
|
||||||
|
|
||||||
|
# NOTE: this will break if the bulk data contains a larger unit than the single file data, but that's unlikely to happen so I'm not gonna deal with it
|
||||||
|
# and it's a bit broken regardless but whatever
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for item in datasets[key]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9\\.]', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for i in range(len(datasets[key])):
|
||||||
|
datasets[key][i] = HelperFunctions.convert_time(
|
||||||
|
datasets[key][i], largest_time_unit
|
||||||
|
)
|
||||||
|
|
||||||
|
with open('assets/benchmarking-dwarfs/data/bulk.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
if line[2] != 'bulk_sequential_read':
|
||||||
|
continue
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
|
||||||
|
for item in line[3:]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for i in range(len(line[3:])):
|
||||||
|
line[i + 3] = HelperFunctions.convert_time(item, largest_time_unit)
|
||||||
|
|
||||||
|
datasets[fs].append(sum(line[3:]) / len(line[3:]))
|
||||||
|
|
||||||
|
return (datasets, largest_time_unit)
|
||||||
|
|
||||||
|
|
||||||
|
def seq_read():
|
||||||
|
with open('assets/benchmarking-dwarfs/js/seq_read.js', 'wt') as f:
|
||||||
|
# from https://github.com/chartjs/Chart.js/blob/master/docs/scripts/utils.js (CHART_COLORS)
|
||||||
|
# modified so similar color aren't adjacent
|
||||||
|
chart_colors = [
|
||||||
|
"'rgb(255, 99, 132)'", # red
|
||||||
|
"'rgb(75, 192, 192)'", # green
|
||||||
|
"'rgb(54, 162, 235)'", # blue
|
||||||
|
"'rgb(255, 159, 64)'", # orange
|
||||||
|
"'rgb(153, 102, 255)'", # purple
|
||||||
|
"'rgb(255, 205, 86)'", # yellow
|
||||||
|
"'rgb(201, 203, 207)'", # grey
|
||||||
|
]
|
||||||
|
|
||||||
|
labels_code = 'labels = $labels$'
|
||||||
|
dataset_code = '''
|
||||||
|
{
|
||||||
|
label: '$label$',
|
||||||
|
data: $data$,
|
||||||
|
backgroundColor: $color$,
|
||||||
|
},
|
||||||
|
'''
|
||||||
|
|
||||||
|
config_code = '''
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: '$title$ - in $timeunit$'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
'''
|
||||||
|
|
||||||
|
data, largest_time_unit = get_seq_read_data()
|
||||||
|
labels_code = labels_code.replace('$labels$', format(data['labels']))
|
||||||
|
f.write(labels_code)
|
||||||
|
data.pop('labels')
|
||||||
|
f.write('\ndata = [')
|
||||||
|
for fs in data.keys():
|
||||||
|
f.write(
|
||||||
|
dataset_code.replace('$label$', fs)
|
||||||
|
.replace('$data$', format(data[fs]))
|
||||||
|
.replace('$color$', format(chart_colors[list(data.keys()).index(fs)]))
|
||||||
|
)
|
||||||
|
f.write('\n]\n')
|
||||||
|
|
||||||
|
title = 'Sequential Read Times'
|
||||||
|
f.write(
|
||||||
|
config_code.replace('$title$', title).replace(
|
||||||
|
'$timeunit$', largest_time_unit
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
f.write('\nChart.defaults.borderColor = "#eee"\n')
|
||||||
|
f.write('Chart.defaults.color = "#eee";\n')
|
||||||
|
f.write('ctx = document.getElementById("seq_read_chart");\n')
|
||||||
|
f.write('new Chart(ctx, config);\n')
|
||||||
|
|
||||||
|
|
||||||
|
def get_rand_read_data() -> tuple:
|
||||||
|
# format: { 'labels': ['btrfs'], 'btrfs': [9, 8, 4, 6]}
|
||||||
|
datasets = {'labels': []}
|
||||||
|
with open('assets/benchmarking-dwarfs/data/benchmark-data.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
try:
|
||||||
|
datasets[fs].append(line[3])
|
||||||
|
except KeyError:
|
||||||
|
datasets[fs] = []
|
||||||
|
datasets[fs].append(line[3])
|
||||||
|
|
||||||
|
# NOTE: this will break if the bulk data contains a larger unit than the single file data, but that's unlikely to happen so I'm not gonna deal with it
|
||||||
|
# and it's a bit broken regardless but whatever
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for item in datasets[key]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9\\.]', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for key in datasets.keys():
|
||||||
|
if key == 'labels':
|
||||||
|
continue
|
||||||
|
for i in range(len(datasets[key])):
|
||||||
|
datasets[key][i] = HelperFunctions.convert_time(
|
||||||
|
datasets[key][i], largest_time_unit
|
||||||
|
)
|
||||||
|
|
||||||
|
with open('assets/benchmarking-dwarfs/data/bulk.csv', 'rt') as f:
|
||||||
|
for line in csv.reader(f):
|
||||||
|
if line[2] != 'bulk_random_read':
|
||||||
|
continue
|
||||||
|
fs = HelperFunctions.get_fs(line[0])
|
||||||
|
label = HelperFunctions.get_label(line[1])
|
||||||
|
datasets['labels'].append(label) if label not in datasets[
|
||||||
|
'labels'
|
||||||
|
] else False
|
||||||
|
|
||||||
|
for item in line[3:]:
|
||||||
|
if largest_time_unit == 's':
|
||||||
|
break
|
||||||
|
if item.endswith('ms'):
|
||||||
|
largest_time_unit = 'ms'
|
||||||
|
elif item.endswith('µs') and largest_time_unit != 'ms':
|
||||||
|
largest_time_unit = 'µs'
|
||||||
|
elif (
|
||||||
|
item.endswith('ns')
|
||||||
|
and largest_time_unit != 'ms'
|
||||||
|
and largest_time_unit != 'µs'
|
||||||
|
):
|
||||||
|
largest_time_unit = 'ns'
|
||||||
|
elif re.sub('[0-9]\\.', '', item) == 's':
|
||||||
|
largest_time_unit = 's'
|
||||||
|
break
|
||||||
|
|
||||||
|
for i in range(len(line[3:])):
|
||||||
|
line[i + 3] = HelperFunctions.convert_time(item, largest_time_unit)
|
||||||
|
|
||||||
|
datasets[fs].append(sum(line[3:]) / len(line[3:]))
|
||||||
|
|
||||||
|
return (datasets, largest_time_unit)
|
||||||
|
|
||||||
|
|
||||||
|
def rand_read():
|
||||||
|
with open('assets/benchmarking-dwarfs/js/rand_read.js', 'wt') as f:
|
||||||
|
# from https://github.com/chartjs/Chart.js/blob/master/docs/scripts/utils.js (CHART_COLORS)
|
||||||
|
# modified so similar color aren't adjacent
|
||||||
|
chart_colors = [
|
||||||
|
"'rgb(255, 99, 132)'", # red
|
||||||
|
"'rgb(75, 192, 192)'", # green
|
||||||
|
"'rgb(54, 162, 235)'", # blue
|
||||||
|
"'rgb(255, 159, 64)'", # orange
|
||||||
|
"'rgb(153, 102, 255)'", # purple
|
||||||
|
"'rgb(255, 205, 86)'", # yellow
|
||||||
|
"'rgb(201, 203, 207)'", # grey
|
||||||
|
]
|
||||||
|
|
||||||
|
labels_code = 'labels = $labels$'
|
||||||
|
dataset_code = '''
|
||||||
|
{
|
||||||
|
label: '$label$',
|
||||||
|
data: $data$,
|
||||||
|
backgroundColor: $color$,
|
||||||
|
},
|
||||||
|
'''
|
||||||
|
|
||||||
|
config_code = '''
|
||||||
|
config = {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
datasets: data,
|
||||||
|
labels
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: '$title$ - in $timeunit$'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responsive: true,
|
||||||
|
interaction: {
|
||||||
|
intersect: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
'''
|
||||||
|
|
||||||
|
data, largest_time_unit = get_rand_read_data()
|
||||||
|
labels_code = labels_code.replace('$labels$', format(data['labels']))
|
||||||
|
f.write(labels_code)
|
||||||
|
data.pop('labels')
|
||||||
|
f.write('\ndata = [')
|
||||||
|
for fs in data.keys():
|
||||||
|
f.write(
|
||||||
|
dataset_code.replace('$label$', fs)
|
||||||
|
.replace('$data$', format(data[fs]))
|
||||||
|
.replace('$color$', format(chart_colors[list(data.keys()).index(fs)]))
|
||||||
|
)
|
||||||
|
f.write('\n]\n')
|
||||||
|
|
||||||
|
title = 'Random Read Times'
|
||||||
|
f.write(
|
||||||
|
config_code.replace('$title$', title).replace(
|
||||||
|
'$timeunit$', largest_time_unit
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
f.write('\nChart.defaults.borderColor = "#eee"\n')
|
||||||
|
f.write('Chart.defaults.color = "#eee";\n')
|
||||||
|
f.write('ctx = document.getElementById("rand_read_chart");\n')
|
||||||
|
f.write('new Chart(ctx, config);\n')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
seq_latency()
|
# NOTE: this code is absolutely horrible and all these functions (except declare_vars) should be one function that just takes the title, chart canvas id, filename, test name in bulk, and index in singles
|
||||||
|
# i will repent to the DRY gods someday
|
||||||
|
seq_read()
|
||||||
|
rand_read()
|
||||||
|
seq_latency()
|
||||||
|
rand_latency()
|
||||||
|
|
|
@ -93,13 +93,25 @@
|
||||||
script</a> to make it a bit easier, I put the resulting graphs
|
script</a> to make it a bit easier, I put the resulting graphs
|
||||||
in here ↓</p>
|
in here ↓</p>
|
||||||
<h3 id="sequential-read">Sequential read</h3>
|
<h3 id="sequential-read">Sequential read</h3>
|
||||||
|
<div>
|
||||||
|
<canvas id="seq_read_chart" class="chart">
|
||||||
|
</canvas>
|
||||||
|
</div>
|
||||||
<h3 id="random-read">Random read</h3>
|
<h3 id="random-read">Random read</h3>
|
||||||
|
<div>
|
||||||
|
<canvas id="rand_read_chart" class="chart">
|
||||||
|
</canvas>
|
||||||
|
</div>
|
||||||
<h3 id="sequential-read-latency">Sequential read latency</h3>
|
<h3 id="sequential-read-latency">Sequential read latency</h3>
|
||||||
<div>
|
<div>
|
||||||
<canvas id="seq_read_latency_chart" class="chart">
|
<canvas id="seq_read_latency_chart" class="chart">
|
||||||
</canvas>
|
</canvas>
|
||||||
</div>
|
</div>
|
||||||
<h3 id="random-read-latency">Random read latency</h3>
|
<h3 id="random-read-latency">Random read latency</h3>
|
||||||
|
<div>
|
||||||
|
<canvas id="rand_read_latency_chart" class="chart">
|
||||||
|
</canvas>
|
||||||
|
</div>
|
||||||
<p>The FUSE-based filesystems run into a bit of trouble here -
|
<p>The FUSE-based filesystems run into a bit of trouble here -
|
||||||
with incompressible data, DwarFS has a hard time keeping up for
|
with incompressible data, DwarFS has a hard time keeping up for
|
||||||
some reason, despite keeping up just fine with larger random
|
some reason, despite keeping up just fine with larger random
|
||||||
|
@ -127,7 +139,11 @@
|
||||||
<h2 id="footnotes">Footnotes</h2>
|
<h2 id="footnotes">Footnotes</h2>
|
||||||
<!-- JavaScript for graphs goes hereeeeeee -->
|
<!-- JavaScript for graphs goes hereeeeeee -->
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/declare_vars.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/seq_read.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/rand_read.js"></script>
|
||||||
<script src="/assets/benchmarking-dwarfs/js/seq_latency.js"></script>
|
<script src="/assets/benchmarking-dwarfs/js/seq_latency.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/rand_latency.js"></script>
|
||||||
<section id="footnotes"
|
<section id="footnotes"
|
||||||
class="footnotes footnotes-end-of-document" role="doc-endnotes">
|
class="footnotes footnotes-end-of-document" role="doc-endnotes">
|
||||||
<hr />
|
<hr />
|
||||||
|
@ -144,8 +160,7 @@
|
||||||
generates regular polygons and writes their data to a file. I
|
generates regular polygons and writes their data to a file. I
|
||||||
chose this because it was an artificial and reproducible yet
|
chose this because it was an artificial and reproducible yet
|
||||||
fairly compressible dataset (without being extremely
|
fairly compressible dataset (without being extremely
|
||||||
compressible like null data).<br />
|
compressible like null data).
|
||||||
|
|
||||||
<details open>
|
<details open>
|
||||||
<summary>
|
<summary>
|
||||||
3-sided regular polygon data
|
3-sided regular polygon data
|
||||||
|
|
|
@ -59,8 +59,18 @@ After processing [the data](/assets/benchmarking-dwarfs/data/) with [this script
|
||||||
|
|
||||||
### Sequential read
|
### Sequential read
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<canvas id="seq_read_chart" class="chart"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Random read
|
### Random read
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<canvas id="rand_read_chart" class="chart"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Sequential read latency
|
### Sequential read latency
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
@ -69,6 +79,11 @@ After processing [the data](/assets/benchmarking-dwarfs/data/) with [this script
|
||||||
|
|
||||||
### Random read latency
|
### Random read latency
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<canvas id="rand_read_latency_chart" class="chart"></canvas>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
The FUSE-based filesystems run into a bit of trouble here - with incompressible data, DwarFS has a hard time keeping up for some reason, despite keeping up just fine with larger random reads on the same data, and so it takes 3 to 4 seconds to run random read latency testing on the 25 GiB random file. Meanwhile, when testing random read latency in `fuse-archive` pretty much just dies, becoming ridiculously slow (even compared to DwarFS), so I didn't test its random read latency at all and just had its results put as 0 milliseconds.
|
The FUSE-based filesystems run into a bit of trouble here - with incompressible data, DwarFS has a hard time keeping up for some reason, despite keeping up just fine with larger random reads on the same data, and so it takes 3 to 4 seconds to run random read latency testing on the 25 GiB random file. Meanwhile, when testing random read latency in `fuse-archive` pretty much just dies, becoming ridiculously slow (even compared to DwarFS), so I didn't test its random read latency at all and just had its results put as 0 milliseconds.
|
||||||
|
|
||||||
### Summary and notes
|
### Summary and notes
|
||||||
|
@ -98,4 +113,8 @@ The FUSE-based filesystems run into a bit of trouble here - with incompressible
|
||||||
|
|
||||||
<!-- JavaScript for graphs goes hereeeeeee -->
|
<!-- JavaScript for graphs goes hereeeeeee -->
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/declare_vars.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/seq_read.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/rand_read.js"></script>
|
||||||
<script src="/assets/benchmarking-dwarfs/js/seq_latency.js"></script>
|
<script src="/assets/benchmarking-dwarfs/js/seq_latency.js"></script>
|
||||||
|
<script src="/assets/benchmarking-dwarfs/js/rand_latency.js"></script>
|
||||||
|
|
Loading…
Reference in a new issue