Я вижу повторные передачи / пакеты не в порядке при использовании интерфейса обратной связи и несколько дней гуглюл, пытаясь определить, должен ли я быть удивлен этим (что я есть) или кто-то еще видит это, но я не нашел никаких ответов. Извиняюсь, если я что-то упустил. Кто-то упомянул спецификацию обратной связи, но я не могу ее найти.
Вот одна вещь, которую я делаю (пробовал на нескольких современных Linux ядрах, включая 5.5.4):
sudo tcpdump -s78 -wt.tcpdump -ilo port 7001 & tcpdump_pid=$!; \
taskset -c 1 ./tcp_loopback.py -s -b1048576 & sleep .5; taskset -c 2 ./tcp_loopback.py -c -b1048576 --count=8192; \
sudo kill $tcpdump_pid; \
tshark -r t.tcpdump | egrep -i 'retrans|out.of.order' | tail
Сценарий tcp_loopback.py доступен по адресу home.fnal.gov/~ron/tcp_loopback.py
Сердце серверной части (-ов):
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
sock.bind( ('127.0.0.1', port) )
sock.listen( 4 )
sockconn,address = sock.accept()
while 1:
data = sockconn.recv(bs)
if opargs['-v']=='': print('received: '+str(len(data)))
if len(data) == 0:
if opargs['-v']=='': print('0 data, closing')
break
Сердце клиентской части (-ов):
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock.connect( ('127.0.0.1',port) )
for xx in range(cnt): sock.send( '*'*bs )
Вероятность повторной передачи увеличивается с увеличением (например, 2M, 4M) операций записи / чтения.
Я читал (например, Documentation / network / scaling.rst) о проблемах с неупорядоченностью, связанных с планированием на разных ядрах, поэтому использование "taskset" выше.
Is Есть ли способ предотвратить это (хотя по-прежнему использовать большие записи / чтения с высокой скоростью)?
С обратной связью, не знаю, смотрю ли я на обработку отправки, отправляющую вещи вне заказ или обработка получения, получение вещей не в порядке. Моя конечная цель - установить sh базовый уровень для межузловой передачи с малой задержкой в среде с высокой перегрузкой 100 Ги (много к одному). Я разработал приложение, которое использует «сокет отладки» для получения информации о повторной передаче, и я был удивлен, увидев повторные передачи на localhost.
Может кто-нибудь, пожалуйста, помогите мне понять, что происходит, и есть ли какие-либо ручки (например, sysctl) для Поворот для устранения повторной передачи при максимальной скорости передачи данных?
Спасибо, Рон
PS Я также в конечном итоге вижу проблему, когда я делаю это:
while true;do
sudo tcpdump -s78 -w/tmp/t.tcpdump -ilo port 7001 & tcpdump_pid=$!
ncat -4l localhost 7001 > /dev/null & ncat_pid=$!
sleep .5
dd if=/dev/zero bs=1048576 count=2048 | ncat localhost 7001
sudo kill $tcpdump_pid
tshark -r /tmp/t.tcpdump | egrep -i 'retrans|out.of.order' && break
done
Пример вывода:
/home/ron/notes
ron@ronlap77 :^) sudo tcpdump -s78 -wt.tcpdump -ilo port 7001 & tcpdump_pid=$!; \
> taskset -c 1 ./tcp_loopback.py -s -b1048576 & sleep .5; taskset -c 2 ./tcp_loopback.py -c -b1048576 --count=8192; \
> sudo kill $tcpdump_pid; \
> tshark -r t.tcpdump | egrep -i 'retrans|out.of.order' | tail
[1] 29066
[2] 29067
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 78 bytes
191379 packets captured
383230 packets received by filter
0 packets dropped by kernel
[2]+ Done taskset -c 1 ./tcp_loopback.py -s -b1048576
189947 1.092534 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4203412074 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
189948 1.092535 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4203477557 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
189949 1.092536 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4203543040 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
189950 1.092536 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4203608523 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
189951 1.092537 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4203674006 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
189962 1.092594 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Spurious Retransmission] 46988 → 7001 [ACK] Seq=4203674006 Ack=1 Win=65536 Len=65483 TSval=2693245609 TSecr=2693245609
190115 1.093456 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4211997131 Ack=1 Win=65536 Len=65483 TSval=2693245610 TSecr=2693245610
190116 1.093457 127.0.0.1 → 127.0.0.1 TCP 65549 [TCP Out-Of-Order] 46988 → 7001 [ACK] Seq=4212062614 Ack=1 Win=65536 Len=65483 TSval=2693245610 TSecr=2693245610
190117 1.093457 127.0.0.1 → 127.0.0.1 TCP 1762 [TCP Out-Of-Order] 46988 → 7001 [PSH, ACK] Seq=4212128097 Ack=1 Win=65536 Len=1696 TSval=2693245610 TSecr=2693245610
190138 1.093547 127.0.0.1 → 127.0.0.1 TCP 1762 [TCP Out-Of-Order] 46988 → 7001 [PSH, ACK] Seq=4212128097 Ack=1 Win=65536 Len=1696 TSval=2693245610 TSecr=2693245610
[1]+ Done sudo tcpdump -s78 -wt.tcpdump -ilo port 7001
--2020-02-25_11:27:17--