forked from onionhammer/onion-nimrod
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemtest.nim
94 lines (71 loc) · 2.37 KB
/
memtest.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import asyncio, sockets
import threadpool, locks
import os, terminal, strutils, times
const PASS_CONNECTIONS = 1_000_000
var glock: Lock
var numConnections {.guard: glock.} = 0
var srvChannel = TChannel[int]()
type WebSocket = ref object
socket: AsyncSocket
dispatcher: Dispatcher
proc open: WebSocket =
new(result)
# Bind socket
result.socket = asyncSocket()
setSockOpt(result.socket, OptReuseAddr, true)
bindAddr(result.socket, Port(8080), "")
var ws = result
result.socket.handleAccept = proc(server: AsyncSocket) =
var client: AsyncSocket
new(client)
accept(server, client)
client.handleRead = proc(socket: AsyncSocket) =
# TODO - Read some data
# Close the connection
socket.close()
ws.dispatcher.register(client)
# Start listening
listen(result.socket)
proc runClients =
var nConnect = 0
var maxMem = 0
var last = 0.0
while nConnect < PASS_CONNECTIONS:
var client = socket()
client.connect("", Port(8080))
client.send("hello world\r\L")
client.close()
inc nConnect
{.locks: [ glock ].}:
numConnections = nConnect
# Write output to screen
var next = cpuTime()
if next - last > 0.05 or nConnect == PASS_CONNECTIONS:
last = next
# Clear the screen
eraseScreen()
setCursorPos 0,0
# Read server memory
var serverMem = 0
while srvChannel.peek() > 0:
serverMem = srvChannel.recv()
let occupied = getOccupiedMem()
if occupied > maxMem: maxMem = occupied
echo "Client Memory: ", occupied.formatSize(),
" max: ", maxMem.formatSize()
echo "Server Memory: ", serverMem.formatSize()
echo "Clients: ", numConnections, " out of ", PASS_CONNECTIONS
when isMainModule:
srvChannel.open()
var ws = open()
ws.dispatcher = newDispatcher()
ws.dispatcher.register(ws.socket)
# Run tests
spawn runClients()
while ws.dispatcher.poll():
{.locks: [ glock ].}:
srvChannel.send(getOccupiedMem())
if numConnections == PASS_CONNECTIONS:
break
sync()
srvChannel.close()