Hi List, I am trying to write a simple threaded application which will simulate 1000 connections to a remote service in order to "stress test" that the remote service can handle that many connections.
However, I have encountered the following error after I have started my 381st thread: --------------------------------------------------------------------------- Traceback (most recent call last): File "./test.py", line 39, in ? current.start() File "/usr/lib/python2.4/threading.py", line 416, in start _start_new_thread(self.__bootstrap, ()) thread.error: can't start new thread --------------------------------------------------------------------------- The command 'ps -eo pid,%cpu,%mem,rss,sz,vsz' gives at the point of error, the following information: --------------------- pid: 5448 %cpu: 33.5 %mem: 0.6 rss: 9492 sz: 782729 vsz: 3130916 --------------------- I have 1.5GB of total ram in my computer, as evident by the command 'free': --------------------- total used free shared buffers cached Mem: 1553128 1314152 238976 0 0 357392 -/+ buffers/cache: 956760 596368 Swap: 977248 7964 969284 --------------------- An 'strace' of the script reveals the following: NOTE the line that reads 'ENOMEM (Cannot allocate memory). -------------------------------------------------------- futex(0x80b2b08, FUTEX_WAKE, 1) = 1 select(0, NULL, NULL, NULL, {0, 0}) = 0 (Timeout) write(1, "381\n", 4381 ) = 4 futex(0x80b2b08, FUTEX_WAKE, 1) = 0 futex(0x80b2b08, FUTEX_WAKE, 1) = 0 futex(0x80581f8, FUTEX_WAKE, 1) = 0 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory) write(2, "Traceback (most recent call last"..., 35Traceback (most recent call last): ) = 35 open("./test.py", O_RDONLY|O_LARGEFILE) = 383 write(2, " File \"./test.py\", line 40, in "..., 34 File "./test.py", line 40, in ? ) = 34 fstat64(383, {st_mode=S_IFREG|0755, st_size=1037, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f65000 read(383, "#!/usr/bin/python\n\nimport time\nf"..., 4096) = 1037 write(2, " ", 4 ) = 4 write(2, "current.start()\n", 16current.start() -------------------------------------------------------- Is there a way to accomplish what I am trying to do, perhaps in a more memory-friendly way? My source code is attached. Please advise. Thanks! -- Lee Leahu RICIS, Inc. Internet Technology Specialist 866-RICIS-77 Toll Free Voice (US) [EMAIL PROTECTED] 708-444-2690 Voice (International) http://www.ricis.com/ 866-99-RICIS Toll Free Fax (US) 708-444-2697 Fax (International) RICIS, Inc. is a member of the Public Safety Alliance Group This email and any attachments that are included in it have been scanned for malicious or inappropriate content and are believed to be safe.
#!/usr/bin/python import time from threading import Thread import telnetlib import resource class testit(Thread): def __init__ (self,count): Thread.__init__(self) self.count = count self.status = -1 def run(self): try: tn = telnetlib.Telnet("10.80.252.64", "22") time.sleep(5) output = tn.read_eager() output = output.replace("\n", "") output = output.replace("\r", "") if output == "SSH-2.0-OpenSSH_3.8p1": self.status = 0 else: self.status = 1 tn.close() except Exception, error: if error.__class__ is EOFError: self.status = 2 resultlist = ['Succcessfull', 'Unknown SSH String', 'Error'] print time.ctime() sshlist = [] errorat = -1 for count in range(0,500): print count current = testit(count) sshlist.append(current) current.start() totalsuccess = 0 totalerror = 0 for pingle in sshlist: pingle.join() if pingle.status == 0: totalsuccess += 1 else: totalerror += 1 print "Total Successfulls:",totalsuccess print "Total Errors:",totalerror print time.ctime()
-- http://mail.python.org/mailman/listinfo/python-list