/openmdao.main/src/openmdao/main/test/netperf.py

https://github.com/thearn/OpenMDAO-Framework
Python | 132 lines | 91 code | 27 blank | 14 comment | 26 complexity | f1caa311ff0cf142abc71af512211b03 MD5 | raw file
  1. """
  2. Run latency & thruput tests on various server configurations.
  3. """
  4. import glob
  5. import os.path
  6. import shutil
  7. import time
  8. from openmdao.main.mp_util import read_server_config
  9. from openmdao.main.objserverfactory import connect, start_server
  10. from openmdao.util.fileutil import onerror
  11. MESSAGE_DATA = []
  12. def init_messages():
  13. """ Initialize message data for various sizes. """
  14. for i in range(21):
  15. MESSAGE_DATA.append(' ' * (1 << i))
  16. def run_test(name, server):
  17. """ Run latency & bandwidth test on `server`. """
  18. for i in range(10):
  19. server.echo(MESSAGE_DATA[0]) # 'prime' the connection.
  20. results = []
  21. reps = 1000
  22. for msg in MESSAGE_DATA:
  23. start = time.time()
  24. for i in range(reps):
  25. server.echo(msg)
  26. et = time.time() - start
  27. size = len(msg)
  28. latency = et / reps
  29. thruput = len(msg) / (et/reps)
  30. print '%d msgs of %d bytes, latency %g, thruput %g' \
  31. % (reps, size, latency, thruput)
  32. results.append((size, latency, thruput))
  33. if et > 2 and reps >= 20:
  34. reps /= int((et / 2) + 0.5)
  35. return results
  36. def main():
  37. """ Run latency & thruput tests on various server configurations. """
  38. init_messages()
  39. latency_results = {}
  40. thruput_results = {}
  41. # For each configuration...
  42. count = 0
  43. for authkey in ('PublicKey', 'UnEncrypted'):
  44. for ip_port in (-1, 0):
  45. for hops in (1, 2):
  46. # Start factory in unique directory.
  47. count += 1
  48. name = 'Echo_%d' % count
  49. if os.path.exists(name):
  50. shutil.rmtree(name, onerror=onerror)
  51. os.mkdir(name)
  52. os.chdir(name)
  53. try:
  54. server_proc, server_cfg = \
  55. start_server(authkey=authkey, port=ip_port)
  56. cfg = read_server_config(server_cfg)
  57. finally:
  58. os.chdir('..')
  59. # Connect to factory.
  60. address = cfg['address']
  61. port = cfg['port']
  62. key = cfg['key']
  63. print
  64. print '%s, %s %d, hops: %d' % (authkey, address, port, hops)
  65. factory = connect(address, port, authkey=authkey, pubkey=key)
  66. if hops == 1:
  67. server = factory
  68. else:
  69. # Create a server.
  70. server = factory.create('')
  71. # Run test.
  72. results = run_test(name, server)
  73. # Shutdown.
  74. if server is not factory:
  75. factory.release(server)
  76. factory.cleanup()
  77. server_proc.terminate(timeout=10)
  78. # Add results.
  79. for size, latency, thruput in results:
  80. if size not in latency_results:
  81. latency_results[size] = []
  82. latency_results[size].append(latency)
  83. if size not in thruput_results:
  84. thruput_results[size] = []
  85. thruput_results[size].append(thruput)
  86. # Write out results in X, Y1, Y2, ... format.
  87. header = 'Bytes,En-S-1,En-S-2,En-P-1,En-P-2,Un-S-1,Un-S-2,Un-P-1,Un-P-2\n'
  88. with open('latency.csv', 'w') as out:
  89. out.write(header)
  90. for size in sorted(latency_results.keys()):
  91. out.write('%d' % size)
  92. for value in latency_results[size]:
  93. out.write(', %g' % value)
  94. out.write('\n')
  95. with open('thruput.csv', 'w') as out:
  96. out.write(header)
  97. for size in sorted(thruput_results.keys()):
  98. out.write('%d' % size)
  99. for value in thruput_results[size]:
  100. out.write(', %g' % value)
  101. out.write('\n')
  102. for path in glob.glob('Echo_*'):
  103. shutil.rmtree(path, onerror=onerror)
  104. if __name__ == '__main__':
  105. main()