PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/src/Test/BenchmarkSsl.py

https://gitlab.com/cyrixhero/ZeroNet
Python | 162 lines | 100 code | 23 blank | 39 comment | 19 complexity | 8e00fc628d21d6dba9be8ef431671b69 MD5 | raw file
  1. #!/usr/bin/python2
  2. from gevent import monkey
  3. monkey.patch_all()
  4. import os
  5. import time
  6. import sys
  7. import socket
  8. import ssl
  9. sys.path.append(os.path.abspath("..")) # Imports relative to src dir
  10. import cStringIO as StringIO
  11. import gevent
  12. from gevent.server import StreamServer
  13. from gevent.pool import Pool
  14. from Config import config
  15. config.parse()
  16. from util import SslPatch
  17. # Server
  18. socks = []
  19. data = os.urandom(1024 * 100)
  20. data += "\n"
  21. def handle(sock_raw, addr):
  22. socks.append(sock_raw)
  23. sock = sock_raw
  24. # sock = ctx.wrap_socket(sock, server_side=True)
  25. # if sock_raw.recv( 1, gevent.socket.MSG_PEEK ) == "\x16":
  26. # sock = gevent.ssl.wrap_socket(sock_raw, server_side=True, keyfile='key-cz.pem',
  27. # certfile='cert-cz.pem', ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1)
  28. # fp = os.fdopen(sock.fileno(), 'rb', 1024*512)
  29. try:
  30. while True:
  31. line = sock.recv(16 * 1024)
  32. if not line:
  33. break
  34. if line == "bye\n":
  35. break
  36. elif line == "gotssl\n":
  37. sock.sendall("yes\n")
  38. sock = gevent.ssl.wrap_socket(
  39. sock_raw, server_side=True, keyfile='../../data/key-rsa.pem', certfile='../../data/cert-rsa.pem',
  40. ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1
  41. )
  42. else:
  43. sock.sendall(data)
  44. except Exception, err:
  45. print err
  46. try:
  47. sock.shutdown(gevent.socket.SHUT_WR)
  48. sock.close()
  49. except:
  50. pass
  51. socks.remove(sock_raw)
  52. pool = Pool(1000) # do not accept more than 10000 connections
  53. server = StreamServer(('127.0.0.1', 1234), handle)
  54. server.start()
  55. # Client
  56. total_num = 0
  57. total_bytes = 0
  58. clipher = None
  59. ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDH+AES128:ECDHE-RSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:HIGH:" + \
  60. "!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK"
  61. # ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
  62. def getData():
  63. global total_num, total_bytes, clipher
  64. data = None
  65. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  66. # sock = socket.ssl(s)
  67. # sock = ssl.wrap_socket(sock)
  68. sock.connect(("127.0.0.1", 1234))
  69. # sock.do_handshake()
  70. # clipher = sock.cipher()
  71. sock.send("gotssl\n")
  72. if sock.recv(128) == "yes\n":
  73. sock = ssl.wrap_socket(sock, ciphers=ciphers, ssl_version=ssl.PROTOCOL_TLSv1)
  74. sock.do_handshake()
  75. clipher = sock.cipher()
  76. for req in range(20):
  77. sock.sendall("req\n")
  78. buff = StringIO.StringIO()
  79. data = sock.recv(16 * 1024)
  80. buff.write(data)
  81. if not data:
  82. break
  83. while not data.endswith("\n"):
  84. data = sock.recv(16 * 1024)
  85. if not data:
  86. break
  87. buff.write(data)
  88. total_num += 1
  89. total_bytes += buff.tell()
  90. if not data:
  91. print "No data"
  92. sock.shutdown(gevent.socket.SHUT_WR)
  93. sock.close()
  94. s = time.time()
  95. def info():
  96. import psutil
  97. import os
  98. process = psutil.Process(os.getpid())
  99. if "memory_info" in dir(process):
  100. memory_info = process.memory_info
  101. else:
  102. memory_info = process.get_memory_info
  103. while 1:
  104. print total_num, "req", (total_bytes / 1024), "kbytes", "transfered in", time.time() - s,
  105. print "using", clipher, "Mem:", memory_info()[0] / float(2 ** 20)
  106. time.sleep(1)
  107. gevent.spawn(info)
  108. for test in range(1):
  109. clients = []
  110. for i in range(500): # Thread
  111. clients.append(gevent.spawn(getData))
  112. gevent.joinall(clients)
  113. print total_num, "req", (total_bytes / 1024), "kbytes", "transfered in", time.time() - s
  114. # Separate client/server process:
  115. # 10*10*100:
  116. # Raw: 10000 req 1000009 kbytes transfered in 5.39999985695
  117. # RSA 2048: 10000 req 1000009 kbytes transfered in 27.7890000343 using ('ECDHE-RSA-AES256-SHA', 'TLSv1/SSLv3', 256)
  118. # ECC: 10000 req 1000009 kbytes transfered in 26.1959998608 using ('ECDHE-ECDSA-AES256-SHA', 'TLSv1/SSLv3', 256)
  119. # ECC: 10000 req 1000009 kbytes transfered in 28.2410001755 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 13.3828125
  120. #
  121. # 10*100*10:
  122. # Raw: 10000 req 1000009 kbytes transfered in 7.02700018883 Mem: 14.328125
  123. # RSA 2048: 10000 req 1000009 kbytes transfered in 44.8860001564 using ('ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 20.078125
  124. # ECC: 10000 req 1000009 kbytes transfered in 37.9430000782 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 20.0234375
  125. #
  126. # 1*100*100:
  127. # Raw: 10000 req 1000009 kbytes transfered in 4.64400005341 Mem: 14.06640625
  128. # RSA: 10000 req 1000009 kbytes transfered in 24.2300000191 using ('ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 19.7734375
  129. # ECC: 10000 req 1000009 kbytes transfered in 22.8849999905 using ('ECDHE-ECDSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256) Mem: 17.8125
  130. # AES128: 10000 req 1000009 kbytes transfered in 21.2839999199 using ('AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.1328125
  131. # ECC+128: 10000 req 1000009 kbytes transfered in 20.496999979 using ('ECDHE-ECDSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.40234375
  132. #
  133. #
  134. # Single process:
  135. # 1*100*100
  136. # RSA: 10000 req 1000009 kbytes transfered in 41.7899999619 using ('ECDHE-RSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 26.91015625
  137. #
  138. # 10*10*100
  139. # RSA: 10000 req 1000009 kbytes transfered in 40.1640000343 using ('ECDHE-RSA-AES128-GCM-SHA256', 'TLSv1/SSLv3', 128) Mem: 14.94921875