diff --git a/tests/bench/throughput.py b/tests/bench/throughput.py new file mode 100644 index 00000000..896ee9ac --- /dev/null +++ b/tests/bench/throughput.py @@ -0,0 +1,74 @@ +# Verify throughput over sudo and SSH at various compression levels. + +import os +import random +import socket +import subprocess +import tempfile +import time + +import mitogen +import mitogen.service + + +def prepare(): + pass + + +def transfer(context, path): + fp = open('/dev/null', 'wb') + mitogen.service.FileService.get(context, path, fp) + fp.close() + + +def fill_with_random(fp, size): + n = 0 + s = os.urandom(1048576*16) + while n < size: + fp.write(s) + n += len(s) + + +def run_test(router, fp, s, context): + fp.seek(0, 2) + size = fp.tell() + print('Testing %s...' % (s,)) + context.call(prepare) + t0 = time.time() + context.call(transfer, router.myself(), fp.name) + t1 = time.time() + print('%s took %.2f ms to transfer %.2f MiB, %.2f MiB/s' % ( + s, 1000 * (t1 - t0), size / 1048576.0, + (size / (t1 - t0) / 1048576.0), + )) + + +@mitogen.main() +def main(router): + bigfile = tempfile.NamedTemporaryFile() + fill_with_random(bigfile, 1048576*512) + + file_service = mitogen.service.FileService(router) + pool = mitogen.service.Pool(router, ()) + file_service.register(bigfile.name) + pool.add(file_service) + try: + context = router.local() + run_test(router, bigfile, 'local()', context) + context.shutdown(wait=True) + + context = router.sudo() + run_test(router, bigfile, 'sudo()', context) + context.shutdown(wait=True) + + context = router.ssh(hostname='localhost', compression=False) + run_test(router, bigfile, 'ssh(compression=False)', context) + context.shutdown(wait=True) + + context = router.ssh(hostname='localhost', compression=True) + run_test(router, bigfile, 'ssh(compression=True)', context) + context.shutdown(wait=True) + finally: + pool.stop() + bigfile.close() +