我正在研究在带有4G内存的Ubuntu机器上运行的Python应用程序的问题。该工具将用于审核服务器(我们更喜欢使用自己的工具)。它使用线程连接到许多服务器,并且许多TCP连接失败。但是,如果我在开始每个线程之间添加1秒的延迟,那么大多数连接都会成功。我用这个简单的脚本来调查可能发生的事情:
#!/usr/bin/python
import sys
import socket
import threading
import time
class Scanner(threading.Thread):
def __init__(self, host, port):
threading.Thread.__init__(self)
self.host = host
self.port = port
self.status = ""
def run(self):
self.sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sk.settimeout(20)
try:
self.sk.connect((self.host, self.port))
except Exception, err:
self.status = str(err)
else:
self.status = "connected"
finally:
self.sk.close()
def get_hostnames_list(filename):
return open(filename).read().splitlines()
if (__name__ == "__main__"):
hostnames_file = sys.argv[1]
hosts_list = get_hostnames_list(hostnames_file)
threads = []
for host in hosts_list:
#time.sleep(1)
thread = Scanner(host, 443)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print "Host: ", thread.host, " : ", thread.status
如果我在time.sleep(1)注释掉的情况下执行此操作,比方说,300个主机中的许多连接都会因超时错误而失败,而如果我将延迟时间设置为1秒,它们就不会超时。我确实试过了另一个在更强大的机器上运行的Linux发行版上的应用程序并没有那么多的连接错误?是由于内核限制吗?有没有什么可以让连接工作而不会延迟?
UPDATE
我还尝试了一个限制池中可用线程数的程序。通过将其减少到20,我可以使所有连接工作,但它只检查大约1个主机每秒。所以无论我尝试什么(放入睡眠(1)或限制并发线程的数量),我似乎无法每秒检查多于1个主机。
相关分类