提高通过套接字发送多个文件的吞吐量

improve the throughput of sending multiple file via socket

首先,我没有任何错误或错误,我问这个问题是为了了解更多。 我想通过一个单独的连接从客户端同时发送多个文件到服务器。我使用线程使发送过程在客户端并发。听起来它确实提高了一点吞吐量。但我仍然很困惑。下面是我的服务器和客户端代码。我不知道使用线程如何使这个过程并发,因为服务器端的套接字有一个队列,队列中的所有数据无论是轮流发送还是并发发送。谁能给我解释一下?或者如果我错了或者我的代码不能同时发送,请告诉我!谢谢。

server.py

    def rcv_thread(self, conn):
        context = ''
        while True:
            try:
                recvfile = conn.recv(4096)
                context += recvfile.decode()
            except Exception:
                if context == '':
                    return
                break
        
      /////////
        conn.close()

    def receive(self):
        self.t = time.time()
        while True:
            c, addr = self.socket.accept()
            c.settimeout(2)
            start_new_thread(self.rcv_thread,(c,))


client.py

    def transfer_file(self, file_name):
        path = self.path + "/" + file_name
        sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sckt.connect((self.HOST, self.PORT))
        file = open(path, 'rb')
        context = file.read()
        sckt.sendall((file_name + "##" + context.decode()).encode())
        sckt.close()

    def run(self):
        self.start_time = time.time()
        files = os.listdir(self.path)
        num_of_iterates = int(len(files) / self.concurrency)
        for j in range(num_of_iterates + 1):
            min_iter = min(self.concurrency, len(files) - j * self.concurrency)
            for i in range(min_iter):
                th = threading.Thread(target=self.transfer_file, args={files[j * self.concurrency + i]})
                th.start()
                self.connection_threads.append(th)

            for i in range(min_iter):
                self.connection_threads[i].join()

the socket on the server-side has a queue, and all the data stash in the queue whether they were sent in turn or concurrently.

这里涉及多个套接字,而不是一个。在服务器端有一个侦听器套接字returns accept 上的新连接套接字。类似于在客户端使用多个套接字。这导致客户端和服务器之间存在多个 TCP 连接,每个连接都有自己的发送和接收缓冲区以及独立的流量控制。

鉴于 TCP 连接从少量 window 传输中的数据开始并缓慢增加 window 可以通过建立许多短暂的 TCP 连接来更好地利用可用带宽并行而不是有许多短暂的 TCP 连接。如果只使用几个长寿命的 TCP 连接并通过这些连接传输多个文件,效率会更高。

除了网络流量之外,还有其他因素可以在使用多线程时提高性能。其一,它在当今 CPU 中更好地利用了多个内核。然后对于每次传输,都会从磁盘读取一个文件,这也会增加延迟 - 慢速磁盘的延迟更多。并行打开和读取多个文件比按顺序执行此操作要快得多,因为底层 OS 能够并行 运行 多个磁盘操作并优化磁盘访问。

您可能希望确保在 Python 而不是用户 space 线程中创建不同的线程时获得单独的内核线程。您可以在传输过程中检查每个 CPU 的利用率,以确保没有人 CPU 饱和。正如其他地方所建议的那样,您可能还想检查两端存储子系统的利用率。

如果您一次创建许多连接,您还应该检查您的服务器系统以确保您没有溢出服务器侦听套接字的侦听队列。如果你有一个类似 *nix 的系统,你可以查看 netstat -s 的输出。

此外,除非这些是小文件,否则您可能会考虑接收大于 4096 字节的文件。