clientlaunch 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python3
  2. import argparse
  3. import os
  4. import shlex
  5. import subprocess
  6. import sys
  7. import threading
  8. import yaml
  9. sys.path.insert(0, os.getcwd())
  10. sys.path.insert(1, '../App/')
  11. import mkconfig
  12. # The default manifest file
  13. MANIFEST = "../App/manifest.yaml"
  14. # The default pubkeys file
  15. PUBKEYS = "../App/pubkeys.yaml"
  16. # The client binary
  17. CLIENTS = "./clients"
  18. def launch(config, cmd, threads, lgfile, corelist):
  19. cmdline = ''
  20. if corelist is not None:
  21. cmdline = "numactl -C %s " % corelist
  22. cmdline += CLIENTS + " -t " + str(threads) + ""
  23. stdout_file = subprocess.PIPE
  24. if lgfile:
  25. stdout_file = open(lgfile, "a+")
  26. proc = subprocess.Popen(shlex.split(cmdline) + cmd,
  27. stdin=subprocess.PIPE, stdout=stdout_file,
  28. stderr=subprocess.STDOUT, bufsize=0)
  29. print(cmdline)
  30. proc.stdin.write(config.encode('utf-8'))
  31. if lgfile:
  32. proc.wait()
  33. stdout_file.close()
  34. else:
  35. while True:
  36. line = proc.stdout.readline()
  37. if not line:
  38. break
  39. print(line.decode('utf-8'), end='', flush=True)
  40. if __name__ == "__main__":
  41. print("In clientlaunch")
  42. aparse = argparse.ArgumentParser(
  43. description='Launch CLIENTS'
  44. )
  45. aparse.add_argument('-m', default=MANIFEST,
  46. help='manifest.yaml file')
  47. aparse.add_argument('-p', default=PUBKEYS,
  48. help='pubkeys.yaml file')
  49. aparse.add_argument('-t', default=1,
  50. help='number of threads')
  51. aparse.add_argument('-T', default=None,
  52. help='CPU cores to use for clients')
  53. aparse.add_argument('-z', default=None,
  54. help='override message size')
  55. aparse.add_argument('-u', default=None,
  56. help='override max number of users')
  57. aparse.add_argument('-B', default=None,
  58. help='override max number of outgoing token channel messages per user per epoch')
  59. aparse.add_argument('-b', default=None,
  60. help='override max number of incoming token channel messages per user per epoch')
  61. aparse.add_argument('-C', default=None,
  62. help='override max number of outgoing ID channel messages per user per epoch')
  63. aparse.add_argument('-c', default=None,
  64. help='override max number of incoming ID channel messages per user per epoch')
  65. aparse.add_argument('-l', default=None,
  66. help='log file to store client simulator log for an experiment')
  67. aparse.add_argument('-n', nargs='*', help='nodes to include')
  68. aparse.add_argument('cmd', nargs='*', help='experiment to run')
  69. args = aparse.parse_args()
  70. with open(args.m) as mf:
  71. manifest = yaml.safe_load(mf)
  72. params_overrides = {
  73. 'msg_size': args.z,
  74. 'user_count': args.u,
  75. 'token_out': args.B,
  76. 'token_in': args.b,
  77. 'id_out': args.C,
  78. 'id_in': args.c,
  79. }
  80. config = mkconfig.create_json(args.m, args.p, args.n, params_overrides)
  81. # There must not be any newlines in the config json string
  82. if "\n" in config:
  83. print("Error: config.json must not contain embedded newlines")
  84. sys.exit(1)
  85. # Now add a trailing newline
  86. config += "\n"
  87. launch(config, args.cmd, args.t, args.l, args.T)