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ドライバー。しかし、バインディングエラーがあるかどうかを確認するために、バインディングドライバのバージョンとリリースノートがどこにあるかを知っている人はいますか?
- メッセージごとに1つのパケットのみを送信する必要がある場合は問題が発生しませんので、相手に大きなTCPウィンドウを設定するように依頼してください。これはまた、大きなメッセージの最初のパケットと2番目のパケットの間の10ミリ秒の待機時間を短縮します。
誰にも異なるアイデアがありますか?ボンドまたはe1000eドライバのトレースログを取得する方法はありますか?
答え1
send
または、各呼び出しで少なすぎるバイトを渡していますwrite
。呼び出しごとに少なくとも2 KBまたは呼び出しごとに4 KBを渡す必要があります。可能であれば、論理メッセージ全体を集めてすぐに送信してください。これにより、システムコールが節約され、パケットがより効率的に圧縮され、遅延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 エラーデータベースあるいは、他の場所では、これが実際の答えであるという証拠はありません。