我正在模拟计算机网络的流量生成器(对于我的测试,每台计算机都是一个linux命名空间)。每台计算机都有一个运行和监听命令的服务器(用python编写)。它可以产生TCP发送器(使用套接字)或TCP接收器(使用netcat)。在启动每个发送方之前,我向接收方的服务器发送命令,以便在发送方开始发送数据之前生成TCP接收方。
为了处理进程并在必要时终止它们,我每次需要TCP侦听器时都使用Popen
来生成netcat进程。我这样做:
process = subprocess.Popen(["nc", "-l", port], stdout=open(os.devnull, "w"))
processes_TCPServers.append(process)
首先我创建流程,然后将所有这些存储在一个列表中,以便在需要时清理所有内容。
问题
我们说我只有16个主机。当我在几秒钟内启动大量流量时,某些主机服务器在Popen
呼叫时被阻止,而其他服务器则没有。
但是,如果我改为使用os.system()
:
os.system("nc -l -p {0} >/dev/null 2>&1 &".format(port))
所有TCP侦听器都会生成,并且不会阻止任何内容。即使我在几秒钟内启动6K流量。
观察
我尝试使用选项shell=True
,问题仍然存在。
有些人告诉我,我可能会达到每个进程的最大文件描述符限制。但我不这么认为,我只是开始(如果没有被阻止)每个进程20个进程。我的限制为50K fd
。
我还能尝试什么?我想使用Popen
,因为我可以优雅地终止这个过程,这是os.system()
无法做到的。