Hello there,
I’ve been trying to make a stress test generator in ruby for a New IO
echo server initially.
Mainly, the idea is try to generate as many connections as possible to
the echo server, and from time to time, send a string to the server and
receive it back.
I don’t really have much experience in threads programming, and that’s
the main reason to try it out.
For this script, I thought to open threads, and in each thread, do a
loop and open connections for each thread. I tried to use 100
threads and in each thread, open 100 connections. It runs fine, no
errors reported to me at all, but the echo server shows only ~1200
connections.
I’ve set up the OS settings with ulimit already (open files).
What do you guys think ? Any suggestions?
Here it goes:
– code
#!/usr/bin/ruby
require ‘socket’
if ARGV.length < 3
puts "Use: $0 "
exit 1
else
thrds=ARGV[0].to_i
conec=ARGV[1].to_i
tmout=ARGV[2].to_i
end
DEBUG=1
teststring=“denao.”
host=“192.168.0.100”
port=50000
threads=[]
for num in (1 … thrds)
threads << Thread.new(num) { |loT|
printf “Thread (%.0f) opening %.0f connections\n”, loT.to_s,
conec.to_s
sock = []
conec.times do |i|
if DEBUG==1
printf "%.0f) Opening socket %.0f… ",loT.to_s,i
end
sock[i] = TCPsocket::open(host,port)
if DEBUG==1
print “done\n”
end
end
while (1)
conec.times do |j|
if DEBUG==1
printf "%.0f) Sending string on socket
%.0f…",loT.to_s,j
end
sock[j].send teststring, 128
if DEBUG==1
printf "done.\n%.0f) Waiting answer on socket
%.0f…",loT.to_s,j
end
tmp=sock[j].recv(128)
if DEBUG==1
if teststring == tmp
print "matched!\n"
else
print "error!\n"
end
end
if DEBUG==2
printf "%.0f) Sleeping %.0fs\n",loT.to_s,tmout.to_s
end
sleep(tmout)
end
end
}
end
threads.each { |aThread| aThread.join }
– /code