mirror of
https://github.com/arvidn/libtorrent.git
synced 2026-05-06 15:59:38 -04:00
130 lines
3.7 KiB
Python
130 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|
|
|
|
import argparse
|
|
import os
|
|
import platform
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
|
|
from vmstat import capture_sample
|
|
from vmstat import plot_output
|
|
from vmstat import print_output_to_file
|
|
|
|
|
|
def main():
|
|
args = parse_args()
|
|
|
|
ret = os.system(f"cd ../examples && b2 release {args.toolset} stage_client_test stage_connection_tester")
|
|
save_dir = args.directory
|
|
print(f"save dir: {save_dir}")
|
|
|
|
if ret != 0:
|
|
print('ERROR: build failed: %d' % ret)
|
|
sys.exit(1)
|
|
|
|
rm_file_or_dir(".ses_state")
|
|
rm_file_or_dir(".resume")
|
|
|
|
if not os.path.exists('checking_benchmark.torrent'):
|
|
ret = os.system('../examples/connection_tester gen-torrent -s 10000 -n 15 -t checking_benchmark.torrent')
|
|
if ret != 0:
|
|
print('ERROR: connection_tester failed: %d' % ret)
|
|
sys.exit(1)
|
|
|
|
if not os.path.exists(f"{save_dir}/checking_benchmark"):
|
|
cmd_line = f'../examples/connection_tester gen-data -t checking_benchmark.torrent -P {save_dir}'
|
|
print(cmd_line)
|
|
ret = os.system(cmd_line)
|
|
if ret != 0:
|
|
print('ERROR: connection_tester failed: %d' % ret)
|
|
sys.exit(1)
|
|
|
|
for threads in [1, 2, 4, 8, 16, 32, 64]:
|
|
print("drop caches now. e.g. \"echo 1 | sudo tee /proc/sys/vm/drop_caches\"")
|
|
input("Press Enter to continue...")
|
|
run_test(f"{threads}", f"--hashing_threads={threads}", save_dir)
|
|
|
|
|
|
def run_test(name, client_arg, save_dir: str):
|
|
output_dir = 'logs_checking_%s' % name
|
|
|
|
timing_path = os.path.join(output_dir, 'timing.txt')
|
|
if os.path.exists(timing_path):
|
|
print('file "{path}" exists, skipping test "{name}"'.format(path=timing_path, name=name))
|
|
return
|
|
|
|
rm_file_or_dir(output_dir)
|
|
try:
|
|
os.mkdir(output_dir)
|
|
except Exception:
|
|
pass
|
|
|
|
rm_file_or_dir(f"{save_dir}/.resume")
|
|
|
|
client_cmd = ('../examples/client_test checking_benchmark.torrent '
|
|
'--enable_dht=0 --enable_lsd=0 --enable_upnp=0 --enable_natpmp=0 '
|
|
f'-1 {client_arg} -s {save_dir} -f {output_dir}/events.log --alert_mask=all')
|
|
|
|
client_out = open('%s/client.out' % output_dir, 'w+')
|
|
print('client_cmd: "{cmd}"'.format(cmd=client_cmd))
|
|
c = subprocess.Popen(client_cmd.split(' '), stdout=client_out, stderr=client_out, stdin=subprocess.PIPE)
|
|
|
|
start = time.monotonic()
|
|
if platform.system() == "Linux":
|
|
out = {}
|
|
while c.returncode is None:
|
|
capture_sample(c.pid, start, out)
|
|
time.sleep(0.1)
|
|
c.poll()
|
|
|
|
stats_filename = f"{output_dir}/memory_stats.log"
|
|
keys = print_output_to_file(out, stats_filename)
|
|
plot_output(stats_filename, keys)
|
|
else:
|
|
c.wait()
|
|
|
|
client_out.close()
|
|
|
|
start_time = 0
|
|
end_time = 0
|
|
for l in open('%s/events.log' % output_dir, 'r'):
|
|
if 'checking_benchmark: start_checking, m_checking_piece: ' in l \
|
|
and start_time == 0:
|
|
start_time = int(l.split(' ')[0][1:-1])
|
|
if 'state changed to: finished' in l \
|
|
and start_time != 0:
|
|
end_time = int(l.split(' ')[0][1:-1])
|
|
|
|
print('%s: %d' % (name, end_time - start_time))
|
|
with open('%s/timing.txt' % output_dir, 'w+') as f:
|
|
f.write('%s: %d\n' % (name, end_time - start_time))
|
|
|
|
|
|
def rm_file_or_dir(path):
|
|
""" Attempt to remove file or directory at path
|
|
"""
|
|
try:
|
|
shutil.rmtree(path)
|
|
except Exception:
|
|
pass
|
|
|
|
try:
|
|
os.remove(path)
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
def parse_args():
|
|
p = argparse.ArgumentParser()
|
|
p.add_argument('--toolset', default="")
|
|
p.add_argument('--directory', default=".")
|
|
|
|
return p.parse_args()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|