![그리고 다음과 같은 큰 메시지를 첨부했습니다.](https://linux55.com/image/20693/%EA%B7%B8%EB%A6%AC%EA%B3%A0%20%EB%8B%A4%EC%9D%8C%EA%B3%BC%20%EA%B0%99%EC%9D%80%20%ED%81%B0%20%EB%A9%94%EC%8B%9C%EC%A7%80%EB%A5%BC%20%EC%B2%A8%EB%B6%80%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
REHL 서버에서 애플리케이션 전송과 tcpdump 로그 사이의 지연은 다음과 같습니다.언제나이는 큰 메시지의 경우 약 200밀리초(아래 697572-488690=208882마이크로초 참조)로 매우 큰 반면, 작은 메시지의 경우 지연은 몇 마이크로초로 매우 작습니다.
내 생각엔 하나도 없는 것 같아TCP 타이머이는 200ms 지연을 설명할 수 있습니다. 이 지연은 일반적으로 작은 메시지를 대상으로 하는 Nagle의 알고리즘으로 인해 발생하지만 높은 대기 시간은 큰 메시지에만 적용되므로 여기서는 그렇지 않습니다.
그리고 다음과 같은 큰 메시지를 첨부했습니다.
IBM MQ 추적 로그발췌:
12:13:12.488685 4172.1 RSESS:000001 ----{ ccxSend
12:13:12.488688 4172.1 RSESS:000001 -----{ cciTcpSend
12:13:12.488690 4172.1 RSESS:000001 ------{ send
12:13:12.488697 4172.1 RSESS:000001 ------} send rc=OK
12:13:12.488711 4172.1 RSESS:000001 Sending 1138 bytes
[large message]
12:13:12.488714 4172.1 RSESS:000001 RetCode (OK)
12:13:12.488716 4172.1 RSESS:000001 -----} cciTcpSend rc=OK
tcpdump 추출:
12:13:05.884715 IP (tos 0x0, ttl 49, id 60415, offset 0, flags [DF], proto: TCP (6), length: 68) otherHost.otherPort > ourHost.ourPort: P, cksum 0x7673 (correct), 2893948259:2893948287(28) ack 1576932354 win 1024 ....
12:13:05.884718 IP (tos 0x0, ttl 64, id 60352, offset 0, flags [DF], proto: TCP (6), length: 40) ourHost.ourPort > otherHost.otherPort: ., cksum 0xcd9c (correct), ack 2893948287 win 5768
12:13:12.697572 IP (tos 0x0, ttl 64, id 60353, offset 0, flags [DF], proto: TCP (6), length: 1064) ourHost.ourPort > otherHost.otherPort: P, cksum 0x0059 (incorrect (-> 0x6a5a), 1576932354:1576933378(1024) ack 2893948287 win 5768
[first packet of large message]
12:13:12.708367 IP (tos 0x0, ttl 49, id 61060, offset 0, flags [DF], proto: TCP (6), length: 40) otherHost.otherPort > ourHost.ourPort: ., cksum 0xe024 (correct), ack 1576933378 win 0
12:13:12.708865 IP (tos 0x0, ttl 49, id 61061, offset 0, flags [DF], proto: TCP (6), length: 40) otherHost.otherPort > ourHost.ourPort: ., cksum 0xdc24 (correct), ack 1576933378 win 1024
12:13:12.708869 IP (tos 0x0, ttl 64, id 60354, offset 0, flags [DF], proto: TCP (6), length: 154) ourHost.ourPort > otherHost.otherPort: P, cksum 0xfcca (incorrect (-> 0xa1fb), 1576933378:1576933492(114) ack 2893948287 win 5768
[second packet of large message]
12:13:12.716154 IP (tos 0x0, ttl 49, id 61062, offset 0, flags [DF], proto: TCP (6), length: 40) otherHost.otherPort > ourHost.ourPort: ., cksum 0xdc24 (correct), ack 1576933492 win 910
12:13:12.717202 IP (tos 0x0, ttl 49, id 61063, offset 0, flags [DF], proto: TCP (6), length: 68) otherHost.otherPort > ourHost.ourPort: P, cksum 0x71e5 (correct), 2893948287:2893948315(28) ack 1576933492 win 1024
12:13:12.717209 IP (tos 0x0, ttl 64, id 60355, offset 0, flags [DF], proto: TCP (6), length: 40) ourHost.ourPort > otherHost.otherPort: ., cksum 0xc90e (correct), ack 2893948315 win 5768
작은 메시지로(발췌문의 맥락이 적음):
15:15:33.133940 4215.1 RSESS:000001 ------{ send
15:15:33.133954 4215.1 RSESS:000001 ------} send rc=OK
...
15:15:33.133966 4215.1 RSESS:000001 Sending 512 bytes
[small message]
15:15:33.133969 4215.1 RSESS:000001 RetCode (OK)
TCP 덤프:
15:15:33.133949 IP (tos 0x0, ttl 64, id 37357, offset 0, flags [DF], proto: TCP (6), length: 552) ourHost.ourPort > otherHost.otherPort: P, cksum 0xfe58 (incorrect (-> 0x2dd8), 1566021015:1566021527(512) ack 2491002247 win 5768
[small message]
시스템 및 드라이버 버전:
Linux 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
Red Hat Enterprise Linux 서버 버전 5.3(Tikanga)
# /usr/sbin/ethtool -i bond0
driver: bonding
version: 3.2.4
firmware-version: 2
$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008)
Bonding Mode: fault-tolerance (active-backup)
Currently Active Slave: eth2
# /usr/sbin/ethtool -i eth2
driver: e1000e
version: 1.2.10-NAPI
firmware-version: 5.12-2
다음 단계?
이 문제의 근본 원인을 찾지 못한 채 다음과 같이 생각하고 있습니다.
- 그냥 업그레이드하고 싶어본딩또는e1000e운전사. 그런데 바인딩 오류가 있는지 확인하기 위해 바인딩 드라이버 버전과 릴리스 노트가 어디에 있는지 아는 사람이 있습니까?
- 메시지당 하나의 패킷만 전송해야 하는 경우에는 문제가 발생하지 않으므로 상대방에게 더 큰 TCP 창을 설정하도록 요청하세요. 또한 이는 큰 메시지의 첫 번째 패킷과 두 번째 패킷 사이의 시간인 10밀리초만큼 대기 시간을 줄여줍니다.
누구든지 다른 아이디어가 있나요? 본드나 e1000e 드라이버의 추적 로그를 얻을 수 있는 방법이 있나요?
답변1
send
또는 에 대한 각 호출에서 너무 적은 바이트를 전달하고 있습니다 write
. 호출당 최소 2KB 또는 호출당 4KB를 전달해야 합니다. 가능하다면 전체 논리 메시지를 모아서 즉시 보내십시오. 이렇게 하면 시스템 호출이 절약되고, 패킷이 더 효율적으로 압축되며, 지연된 ACK로 인해 대기 시간이 손상되는 것을 방지할 수 있습니다.
답변2
~에 따르면Linux 튜닝: 전문가 가이드ESnet 네트워크 성능 기술 자료에서:
참고: Redhat Enterprise Linux 5.3 - 5.5 및 해당 변형(Centos, Scientific Linux 등)에서 사용되는 2.6.18 커널의 여러 버전에서는 bic과 Cuban 모두 버그가 있는 것으로 보입니다. 2.6.18.x 커널에서는 htcp를 사용하는 것이 안전합니다.
bic 또는 큐빅 버그에 대한 세부정보를 찾을 수 없습니다.Red Hat 오류 데이터베이스또는 다른 곳에서는 이것이 실제 답변이라는 증거가 없습니다.