파이썬 네트워킹 이 느림입니다.파이썬 네트워킹 속도를 높이려면 어떻게해야합니까?
나는 (C로 쓰여진) 서버가있다. 내 클라이언트 (파이썬)와 함께 그것을 테스트했다. 2MB/s
에 도달 할 수 있습니다. nc -l 0.0.0.0 9999 | pv > /dev/null
내가 1백20메가바이트/S (1GB)의 주위에 뭔가에 도달 :
host1의 (클라이언트) : cat some_big_file | nc host2 9999
호스트 2 (서버) 그것은 나를 내가이 체크 걱정.
서버가 병목 현상이 아니므로 프로덕션에서 사용하며 더 많은 것을 처리 할 수 있습니다. 그러나 나는 확실히 파이썬 gevent
서버를 테스트 용으로 복사했다. 그것은 다음과 같습니다
#!/usr/bin/env python
from gevent.server import StreamServer
from gevent.pool import Pool
def handle(socket, address):
while True:
print socket.recv(1024)
pool = Pool(20000)
server = StreamServer(('0.0.0.0', 9999), handle, spawn=pool)
server.serve_forever()
다음 조치는 nc (host1)
에서 gserver (host2)
에 보내는 것입니다.
이 host1 : cat some_big_file | nc host2 9999
호스트 2 : ./gserver.py | pv > /dev/null
host2
에 출력 : [ 101MB/s]
. 나쁘지 않다.
그러나 여전히 파이썬 클라이언트를 사용할 때 느립니다. 나는 클라이언트를 gevent
으로 바꿨다. 나는 몇 개의 그린렛을 시도했다. 1, 10, 100, 1000 - 그다지 도움이되지 못했지만 하나의 파이썬 프로세스로 20MB/s
에 도달하거나 2, 3, 4, 5 개의 개별 파이썬 프로세스에 대해 ~30MB/s
에 도달 할 수있었습니다. 여전히 느립니다. 나는 다음과 같이 클라이언트가 바보로 다시 작성했습니다
#!/usr/bin/env python
import sys
import socket
c = socket.create_connection((sys.argv[1], sys.argv[2]))
while 1:
c.send('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n')
을 내가 10MB/s
에 도달 할 수이 방법. 나는 또한 큰 전체 2GB
파일을 메모리로 읽어서 비슷한 결과를 보내 접근법을 시도했다.
또한 파이썬 스크립트를 별도의 프로세스 (tmux
사용)로 실행하려고했습니다. 1 프로세스를 사용하면 10MB/s
, 2 프로세스 20MB/s
, 3 prcesses 23MB/s
, 4, 5, 6 프로세스는 아무것도 변경하지 않았습니다 (gevent
버전 및 간단한 것으로 테스트 됨).
세부 : 파이썬 2.7.3 데비안 7 - 표준 설치가 기계는 AWS의 인스턴스, 클라이언트는 c1.medium이며, 서버는 c3.xlarge입니다. nc와 iperf는 기계간에 1Gb/s를 측정했습니다.
질문 :
- 이유는 파이썬 서버 (gevent 서버) 만 사용하여 데이터를 신속의 많은 같은 속도도 C 프로그램이 할 수있는 경우로 보낼 수 없습니다 를받을 수 있습니다.
- 왜 프로세스를 두 배로 늘리면 전송 속도가 한도로 증가하지 않고 어느 정도만 증가합니다.
- 소켓을 사용하여 Python으로 데이터를 빠르게 보낼 수있는 방법이 있습니까?
''나는 느린 파이썬 네트워킹을 찾고있다. 아니요, * 응용 프로그램 * (파이썬으로 작성되는 경우)이 느립니다. –
@JonathonReinhart 예, 당신 말이 맞아요.하지만 그 바로 가기가 다른 접근법을 시도했습니다. – spinus