You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.7 KiB
Python
105 lines
2.7 KiB
Python
'''
|
|
Measure file service throughput over local, sudo, and (un)compressed SSH.
|
|
'''
|
|
|
|
import getpass
|
|
import os
|
|
import tempfile
|
|
|
|
import mitogen
|
|
import mitogen.core
|
|
import mitogen.service
|
|
import ansible_mitogen.affinity
|
|
|
|
|
|
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 = mitogen.core.now()
|
|
context.call(transfer, router.myself(), fp.name)
|
|
t1 = mitogen.core.now()
|
|
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):
|
|
import optparse
|
|
parser = optparse.OptionParser(description=__doc__)
|
|
|
|
parser.add_option(
|
|
'--ssh-python', metavar='CMD', default='python3',
|
|
help='Remote python path (default %default)')
|
|
parser.add_option(
|
|
'--ssh-user', metavar='S', default=getpass.getuser(),
|
|
help='Remote username (default %default)')
|
|
|
|
parser.add_option(
|
|
'--sudo-user', metavar='S', default='root',
|
|
help='Sudo username (default %default)')
|
|
|
|
parser.add_option('--debug', action='store_true')
|
|
opts, args = parser.parse_args()
|
|
|
|
ansible_mitogen.affinity.policy.assign_muxprocess()
|
|
|
|
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(debug=opts.debug)
|
|
run_test(router, bigfile, 'local()', context)
|
|
context.shutdown(wait=True)
|
|
|
|
context = router.sudo(username=opts.sudo_user, debug=opts.debug)
|
|
run_test(router, bigfile, 'sudo()', context)
|
|
context.shutdown(wait=True)
|
|
|
|
context = router.ssh(
|
|
hostname=args[0],
|
|
python_path=opts.ssh_python,
|
|
username=opts.ssh_user,
|
|
compression=False, debug=opts.debug,
|
|
)
|
|
run_test(router, bigfile, 'ssh(compression=False)', context)
|
|
context.shutdown(wait=True)
|
|
|
|
context = router.ssh(
|
|
hostname=args[0],
|
|
python_path=opts.ssh_python,
|
|
username=opts.ssh_user,
|
|
compression=True, debug=opts.debug,
|
|
)
|
|
run_test(router, bigfile, 'ssh(compression=True)', context)
|
|
context.shutdown(wait=True)
|
|
finally:
|
|
pool.stop()
|
|
bigfile.close()
|
|
|