ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Ρ€Π΅ΠΆΠΈΠΌΠ° TCP_NODELAY ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

ΠœΠ°Ρ€ΠΊ Π‘Ρ€ΡƒΠΊΠ΅Ρ€ (Marc Brooker), ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Amazon Web Services (AWS), Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π» заблуТдСния, связанныС с ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ΠΌ эффСктивности ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΌΠ΅Π»ΠΊΠΈΡ… сообщСний ΠΏΡ€ΠΈ использовании Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° НСйгла, примСняСмого ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² TCP/IP стСкС. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ сводятся ΠΊ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° НСйгла, Ρ‡Ρ‚ΠΎ Π² контСкстС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· выставлСниС ΠΎΠΏΡ†ΠΈΠΈ TCP_NODELAY для сСтСвых сокСтов ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° setsockopt, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ дСлаСтся Π² Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠ°ΠΊ Node.js ΠΈ curl.

Алгоритм НСйгла позволяСт Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π»ΠΊΠΈΠ΅ сообщСния для сниТСния Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° — приостанавливаСт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π½ΠΎΠ²Ρ‹Ρ… сСгмСнтов TCP Π΄ΠΎ получСния подтвСрТдСния ΠΎ ΠΏΡ€ΠΈΡ‘ΠΌΠ΅ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, Π±Π΅Π· примСнСния агрСгирования ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ 1 Π±Π°ΠΉΡ‚Π°, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отправляСтся 40 Π±Π°ΠΉΡ‚ΠΎΠ² с TCP ΠΈ IP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’ соврСмСнных условиях использованиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° НСйгла ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠΌΡƒ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ, Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹Ρ… для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈ распрСдСлённых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡΡ Ρ‚Ρ€ΠΈ основных Π΄ΠΎΠ²ΠΎΠ΄Π° Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ использования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΏΡ†ΠΈΠΈ TCP_NODELAY, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ НСйгла:

  • ΠΠ΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° НСйгла с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ «delayed ACK», ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ACK-ΠΎΡ‚Π²Π΅Ρ‚ направляСтся Π½Π΅ сразу, Π° послС получСния ΠΎΡ‚Π²Π΅Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ НСйгла поступлСниС ACK-ΠΏΠ°ΠΊΠ΅Ρ‚Π° являСтся сигналом для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ссли ACK-ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ поступил, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° выполняСтся ΠΏΡ€ΠΈ наступлСнии Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³ ΠΈ ACK-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠ°ΠΊ сигнал Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ другая сторона Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ·-Π·Π° ΠΈΡ… накоплСния Π½Π° сторонС отправитСля, Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ отправляСт ΠΈΡ… Π΄ΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ACK-ΠΏΠ°ΠΊΠ΅Ρ‚.
  • RFC для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° НСйгла принят Π² 1984 Π³ΠΎΠ΄Ρƒ ΠΈ ΠΎΠ½ Π½Π΅ рассчитан Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ соврСмСнных высокоскоростных сСтСй ΠΈ сСрвСров Π² Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ возникновСнию ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒΡŽ. Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ запроса ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π° (RTT) Π² соврСмСнных сСтях составляСт 0.5 мс + нСсколько миллисСкунд ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Π΅ + Π΄ΠΎ сотни миллисСкунд ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ. Π—Π° эти миллисСкунды соврСмСнный сСрвСр способСн Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΡ‘ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹.
  • Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ распрСдСлённыС прилоТСния Π΄Π°Π²Π½ΠΎ Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Π»ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСализуСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ прилоТСния. Π”Π°ΠΆΠ΅ Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… составляСт считанныС Π±Π°ΠΉΡ‚Ρ‹, Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, фактичСски Ρ€Π°Π·ΠΌΠ΅Ρ€ отправляСмой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ сущСствСнно возрастаСт послС примСнСния сСриализации, использования API-обвязок Π² JSON ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ с использованиСм TLS-ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Экономия 40 Π±Π°ΠΉΡ‚ΠΎΠ² становится Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru