OK 나는 "매우 큰 파이프"(10Gbe)를 가진 두 대의 컴퓨터에 대해이 질문에 대답하려고했습니다.
여기서 문제는 파이프가 너무 커서 대부분의 압축이 CPU에서 병목 현상을 일으키는 것입니다.
10GB 파일 전송 성능 (6Gb 네트워크 연결 [linode], 압축 할 수없는 데이터) :
$ time bbcp 10G root@$dest_ip:/dev/null
0m16.5s
iperf:
server: $ iperf3 -s -F /dev/null
client:
$ time iperf3 -c $dest_ip -F 10G -t 20 # -t needs to be greater than time to transfer complete file
0m13.44s
(30% cpu)
netcat (1.187 openbsd):
server: $ nc -l 1234 > /dev/null
client: $ time nc $dest_ip 1234 -q 0 < 10G
0m13.311s
(58% cpu)
scp:
$ time /usr/local/bin/scp 10G root@$dest_ip:/dev/null
1m31.616s
scp with hpn ssh patch (scp -- hpn patch on client only, so not a good test possibly):
1m32.707s
socat:
server:
$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:/dev/null,creat,trunc
client:
$ time socat -u FILE:10G TCP:$dest_ip:9876
0m15.989s
그리고 10Gbe의 두 개의 상자, 약간 오래된 버전의 netcat (CentOs 6.7), 10GB 파일 :
nc: 0m18.706s (100% cpu, v1.84, no -q option
iperf3: 0m10.013s (100% cpu, but can go up to at least 20Gbe with 100% cpu so not sure it matters)
socat: 0m10.293s (88% cpu, possibly maxed out)
따라서 하나의 인스턴스에서 netcat은 CPU를 덜 사용하고 다른 socat에서는 YMMV를 사용했습니다.
netcat을 사용하면 "-N -q 0"옵션이 없으면 잘린 파일을 전송할 수 있습니다. "-w 10"과 같은 다른 옵션도 잘린 파일을 생성 할 수 있습니다.
거의 모든 경우에 발생하는 일은 네트워크가 아니라 CPU가 최대치입니다. scp
약 230MB / s로 최대 한도에서 100 % 활용률로 한 코어를 페깅합니다.
불행히도 Iperf3는 손상된 파일을 만듭니다 . netcat의 일부 버전은 전체 파일을 전송하지 않는 것 같습니다. 특히 오래된 버전.
"netcat에 대한 파이프로서 gzip"또는 "mbuffer"의 다양한 주문도 gzip 또는 mbuffer를 사용하여 CPU를 최대로 사용하는 것처럼 보였으므로 이러한 큰 파이프로 더 빠른 전송을 수행하지 못했습니다. lz4가 도움이 될 수 있습니다. 또한 내가 시도한 gzip 파이프 항목 중 일부는 매우 큰 (> 4GB) 파일에 대한 전송이 손상되었으므로 조심하십시오. :)
특히 대기 시간이 길어질 수있는 또 다른 이유는 TCP 설정을 조정하는 것입니다. 제안 된 값을 언급하는 가이드는 다음과 같습니다.
http://pcbunn.cithep.caltech.edu/bbcp/using_bbcp.htm 및 https://fasterdata.es.net/host-tuning/linux/ (다른 답변에서) IRQ 설정 가능 : https://fasterdata.es .net / host-tuning / 100g-tuning /
linode의 제안은 /etc/sysctl.conf에 추가하십시오.
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_no_metrics_save = 1
net.core.default_qdisc = fq
또한, 그들은 당신이 실행하기를 원합니다 :
/sbin/ifconfig eth0 txqueuelen 10000
변경 후에도 해를 입히지 않도록 조정 한 후 다시 확인해야합니다.
창 크기를 조정할 가치가있을 수도 있습니다 : https://iperf.fr/iperf-doc.php#tuningtcp
느린 연결을 사용하면 압축이 확실히 도움이 될 수 있습니다. 파이프가 큰 경우 압축 속도 가 매우 빠르면 데이터를 쉽게 압축 할 수 있지만 시도하지 않았습니다.
"하드 드라이브 동기화"에 대한 표준 답변은 파일을 재 동기화하여 가능한 경우 전송을 피하는 것입니다.
또 다른 옵션 : "병렬 scp"(어떻게 든 또는 다른 방식)를 사용하면 더 많은 코어를 사용합니다 ...