Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

πŸ’‘ Как ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ WebSockets ΠΈ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ $1 ΠΌΠ»Π½ Π² Π³ΠΎΠ΄: Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ простой Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΌΠΎΠ³ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ WebSocket ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» взят ΠΈΠ· нашСй СТСнСдСльной email-рассылки, посвящСнной бэкСнду. ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² числС ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ дайдТСст. πŸ“§ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ (function () { let link = document .getElementById ("d67f3832-ce99-42df-bbe1-cd8c56f727da-https://proglib.io/w/a358ac8b-2"); if (! link) return; let href = link .getAttribute ("href"); if (! href) return; let prefix = link .dataset .prefix; let action = link .dataset .action; link .addEventListener ("click", function (e) { let data = new FormData (); data .append ("url", href); apiFetch (action, { method: "POST", body: data }) .then (function (
ОглавлСниС

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ простой Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΌΠΎΠ³ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ WebSocket ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ….

Π­Ρ‚ΠΎΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» взят ΠΈΠ· нашСй СТСнСдСльной email-рассылки, посвящСнной бэкСнду. ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² числС ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ дайдТСст.

πŸ“§ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ

(function () { let link = document .getElementById ("d67f3832-ce99-42df-bbe1-cd8c56f727da-https://proglib.io/w/a358ac8b-2"); if (! link) return; let href = link .getAttribute ("href"); if (! href) return; let prefix = link .dataset .prefix; let action = link .dataset .action; link .addEventListener ("click", function (e) { let data = new FormData (); data .append ("url", href); apiFetch (action, { method: "POST", body: data }) .then (function (res) {}) .catch (function (err) { console .error (err); }); }) })();

IPC (мСТпроцСссноС взаимодСйствиС) часто Π½Π΅ учитываСтся ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π² ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… срСдах. Но оказываСтся, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ 1 Π’Π± Π²ΠΈΠ΄Π΅ΠΎ Π² сСкунду Π½Π° ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΌ сСрвисС Ρ‚ΠΈΠΏΠ° AWS, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ счСтам: компания Recall.ai ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π°, Ρ‡Ρ‚ΠΎ использованиС WebSockets Ρ‡Π΅Ρ€Π΅Π· loopback-интСрфСйс ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ $1 ΠΌΠ»Π½ Π² Π³ΠΎΠ΄. Для сниТСния расходов Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ срочно Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ эффСктивный способ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ – с максимально высокой пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ.

КСйс

Компания Recall.ai прСдоставляСт услуги Π²ΠΈΠ΄Π΅ΠΎΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ записи встрСч. Нагрузка огромная: Π±ΠΎΡ‚Π°ΠΌΠΈ Recall.ai ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сотни ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ, инфраструктура ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ Π²ΠΈΠ΄Π΅ΠΎΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΉ Π² мСсяц. Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ компания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ CPU, Π° Π½Π΅ GPU, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ (Π΄Π°ΠΆΠ΅ AWS) Π½Π΅ всСгда ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ GPU Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°Ρ…. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всС Π·Π°Π΄Π°Ρ‡ΠΈ – ΠΎΡ‚ запуска Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π΄ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ – Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° CPU. ΠŸΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ поставили Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ†Π΅Π»ΡŒ – ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΎΡ‚Π° с 4 ядСр CPU Π΄ΠΎ 2, Ρ‚Π΅ΠΌ самым ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² счСта Π½Π° ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ вычислСния Π²Π΄Π²ΠΎΠ΅. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой Ρ†Π΅Π»ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ:

  • Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±ΠΎΡ‚Ρ‹, ΠΈ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ самыС рСсурсоСмкиС процСссы.
  • Π‘Π½ΠΈΠ·ΠΈΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° CPU Π±Π΅Π· ΡƒΡ‰Π΅Ρ€Π±Π° для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

НСоТиданныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ профилирования

Π”ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΠΎΡ‚ΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ основная Ρ‡Π°ΡΡ‚ΡŒ рСсурсов процСссора тратится Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ: ΠΊΠ°ΠΊ извСстно, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎ – ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΉ процСсс. Однако ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅: большая Ρ‡Π°ΡΡ‚ΡŒ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Ρ€Π°Ρ‚ΠΈΠ»oсь Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ __memmove_avx_unaligned_erms ΠΈ __memcpy_avx_unaligned_erms. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ C (glibc) ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° быстроС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ Π²ΠΈΠ½ΠΎΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π±Ρ‹Π»ΠΈ:

  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ WebSocket Π½Π° Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» Π΄Π°Π½Π½Ρ‹Π΅.
  • РСализация WebSocket Π² Chromium, которая отправляла Π΄Π°Π½Π½Ρ‹Π΅.

Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· WebSocket ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΌΡƒ числу ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ копирования Π² памяти.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ WebSocket оказался ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ WebSocket ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов CPU, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π°Ρ‡Π°Π»ΠΈ с Π°Π½Π°Π»ΠΈΠ·Π° своСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. Π˜Ρ… систСма взаимодСйствуСт с Π±Π΅Π·Π³ΠΎΠ»ΠΎΠ²Ρ‹ΠΌ Chromium, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт интСрфСйс для Π²ΠΈΠ΄Π΅ΠΎΠ·Π²ΠΎΠ½ΠΊΠΎΠ². Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ WebSocket Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ· Javascript-срСды Π² энкодСр ΠΏΠΎ нСскольким ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

  • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ – WebSocket быстрСС Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅Π±-API.
  • Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ – Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² срСдС Javascript.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… – WebSocket ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСкст, Π½ΠΎ ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² Chromium, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй.

Однако Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ ΡƒΡ‡Π»ΠΈ ΠΎΠ΄ΠΈΠ½ нюанс – ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ объСм Π΄Π°Π½Π½Ρ‹Ρ…. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ° Π² 1080p с частотой 30 ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² сСкунду объСм составлял 1080 Γ— 1920 Γ— 1,5 Γ—30 = 93,312 Мб/с. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ систСмы (p99 Π±ΠΎΡ‚, Ρ‚. Π΅. 99-ΠΉ ΠΏΠ΅Ρ€Ρ†Π΅Π½Ρ‚ΠΈΠ»ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ), ΠΏΠΎΡ‚ΠΎΠΊ достигал 150 Мб/с – ΠΈ вСсь этот объСм постоянно пСрСдавался ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

πŸ”€ ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ – Π½Π΅ Π±Π°Π³, Π° Ρ„ΠΈΡ‡Π°: 4 ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спасут ваш распрСдСлСнный сСрвис

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ высокой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° WebSocket

ПослС изучСния стандартов WebSocket (RFC) ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Chromium, ΠΊΠΎΠΌΠ°Π½Π΄Π° нашла Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Ρ„Π°ΠΊΡ‚ΠΎΡ€Π°, Π·Π°ΠΌΠ΅Π΄Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… – ΠΈΠΌΠΈ оказались фрагмСнтация ΠΈ маскированиС.

ЀрагмСнтация

Π­Ρ‚ΠΎ процСсс Ρ€Π°Π·Π±ΠΈΠ²ΠΊΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… сообщСний Π½Π° нСсколько частСй (Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² WebSocket). ЀрагмСнтация позволяСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ частями, Π΄Π°ΠΆΠ΅ Ссли ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстСн, ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ большоС сообщСниС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» связи. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ WebSocket Π² Chromium любоС сообщСниС большС 131 Кб разбиваСтся Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹:

1080 Γ— 1920 Γ— 1,5 = 3110,4 Кб / 131 = 24 WebSocket-Ρ„Ρ€Π΅ΠΉΠΌΠ°.

Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ Π²ΠΈΠ΄Π΅ΠΎ разбиваСтся Π½Π° 24 Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°, ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… выполняСтся ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ – созданиС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ соСдинСниСм.

ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

По спСцификации WebSocket, всС Π΄Π°Π½Π½Ρ‹Π΅, отправляСмыС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ замаскированы. Π­Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΎ для бСзопасности ΠΈ для прСдотвращСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с сСтСвыми посрСдниками (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, прокси-сСрвСрами). ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ случайный 32-Π±ΠΈΡ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ маскирования.
  • Π—Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ исходных Π΄Π°Π½Π½Ρ‹Ρ… XOR-ится с этим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ:
  • Π”Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ (4 Π±Π°ΠΉΡ‚Π°).
  • ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ обрабатываСтся с использованиСм ΠΊΠ»ΡŽΡ‡Π°.
  • Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ отправляСтся Π½Π° сСрвСр.

Π₯отя маскированиС Π²Π°ΠΆΠ½ΠΎ для бСзопасности, ΠΎΠ½ΠΎ создаСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° CPU – XOR-ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΊΠ° ΠΏΠΎ всСм Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π° для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ объСм Π΄Π°Π½Π½Ρ‹Ρ… ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшой, Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 100+ Мб/с, ΠΊΠ°ΠΊ Π² случаС с Π²ΠΈΠ΄Π΅ΠΎ) Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ становятся Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±ΠΎΠ»Π΅Π΅ эффСктивного способа ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ стало ясно, Ρ‡Ρ‚ΠΎ WebSocket для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… слишком рСсурсоСмок, ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π΅ΡˆΠΈΠ»Π° ΠΈΡΠΊΠ°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ для извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Chromium. Однако стандартныС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Π΅ API оказались слишком ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ WebSocket. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±Ρ‹Π»ΠΎ принято Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΊΠ½ΡƒΡ‚ΡŒ Chromium ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’ качСствС Π±Π°Π·Ρ‹ для этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° рассмотрСла Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: TCP/IP, сокСты Π΄ΠΎΠΌΠ΅Π½Π° Unix ΠΈ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

TCP/IP

ΠŸΠ»ΡŽΡΡ‹:

  • ΠžΠ±Ρ…ΠΎΠ΄ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ WebSocket – Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».
  • Низкая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° – использованиС loopback (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСтСвого интСрфСйса) ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ врСмя оТидания.

ΠœΠΈΠ½ΡƒΡΡ‹:

  • ЀрагмСнтация ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° TCP/IP (MSS) Π½Π° стандартной сСти Ethernet – 1448 Π±Π°ΠΉΡ‚. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π° Π²ΠΈΠ΄Π΅ΠΎ Π² 3 Мб. Π”Π°ΠΆΠ΅ тСорСтичСский максимум TCP/IP – Ρ†Π΅Π»Ρ‹Ρ… 64 Кб – всС Ρ€Π°Π²Π½ΠΎ нСдостаточСн, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.
  • ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· сСтСвой стСк Linux, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² kernel-space. Π”Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· user-space Π² kernel-space, Ρ‡Ρ‚ΠΎ добавляСт Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, особСнно ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ….

Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ Π΄ΠΎΠΌΠ΅Π½Π° Unix

ΠŸΠ»ΡŽΡΡ‹:

  • НизкиС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы – IPC-сокСты быстрСС TCP/IP, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ обходят сСтСвой стСк.
  • Нативная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² Linux. Π­Ρ‚ΠΎ стандартная тСхнология для IPC (взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами), поддСрТиваСмая Linux, с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ функциями для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

ΠœΠΈΠ½ΡƒΡ:

  • ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Как ΠΈ Π² случаС с TCP/IP, Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· user-space Π² kernel-space ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Для объСмов Π² 100+ Мб/с это всС Π΅Ρ‰Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°.

ΠžΠ±Ρ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ (Shared Memory)

ΠŸΠ»ΡŽΡΡ‹:

  • Максимальная ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠžΠ±Ρ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ позволяСт нСскольким процСссам ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π±Π»ΠΎΠΊΡƒ памяти. Chromium ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠΎΠ΄Π΅Ρ€ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· копирования.
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов kernel-space. ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ происходят Π² user-space, Ρ‡Ρ‚ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ.

ΠœΠΈΠ½ΡƒΡΡ‹:

НСт стандартного интСрфСйса. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ TCP/IP ΠΈΠ»ΠΈ IPC-сокСтов, Ρƒ ΠΎΠ±Ρ‰Π΅ΠΉ памяти Π½Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ стандарта для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ:

  • НуТно Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС с нуля.
  • Π•ΡΡ‚ΡŒ риск Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ошибки Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  • ВрСбуСтся большС усилий Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ.

ВзвСсив всС ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΈΡˆΠ»Π° ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΡ… Π·Π°Π΄Π°Ρ‡ΠΈ общая ΠΏΠ°ΠΌΡΡ‚ΡŒ станСт Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. Π₯отя рСализация этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π° ΠΌΠ½ΠΎΠ³ΠΎ усилий, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ сниТСния расходов стала ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ.

πŸ’» Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста»

ИспользованиС ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Для эффСктивного чтСния ΠΈ записи Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π΅ΡˆΠΈΠ»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΊΠ°ΠΊ основу транспортного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°. ВрСбования Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΈΠΌΠΈ:

  • Π‘Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ – для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π›ΡŽΠ±Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ потрСбитСля (MPSC). НСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Chromium Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π°ΡƒΠ΄ΠΈΠΎ- ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠ΄Π°Π½Π½Ρ‹Π΅ Π² Π±ΡƒΡ„Π΅Ρ€, Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ эти Π΄Π°Π½Π½Ρ‹Π΅.
  • ДинамичСскиС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠ°Π΄Ρ€ΠΎΠ². Π‘ΡƒΡ„Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Π΄Ρ€ΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ.
  • Π§Ρ‚Π΅Π½ΠΈΠ΅ Π±Π΅Π· копирования (zero-copy). МСдиа-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ прямо ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°, избСгая лишнСго копирования.
  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с пСсочницСй. ΠŸΠΎΡ‚ΠΎΠΊΠΈ Chromium, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² пСсочницС, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΈΠΉ доступ ΠΊ Π±ΡƒΡ„Π΅Ρ€Ρƒ.
  • Π‘ΠΈΠ³Π½Π°Π»Ρ‹ с Π½ΠΈΠ·ΠΊΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. Π‘ΡƒΡ„Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Chromium, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ свободноС мСсто, ΠΈ ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° появились Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Однако ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ спСцифичСскиС трСбования ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, – ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ собствСнный Π±ΡƒΡ„Π΅Ρ€.

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π²Π° указатСля:

  • write pointer (aдрСс, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅)
  • read pointer (aдрСс, Π³Π΄Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ).

Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ чтСния Π±Π΅Π· копирования Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ – peek pointer. Π­Ρ‚ΠΎ адрСс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ°Π΄Ρ€Ρ‹.

   Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ кастомного ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°
Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ кастомного ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ кастомной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π°:

  • Π§Ρ‚Π΅Π½ΠΈΠ΅ Π±Π΅Π· копирования:
  • МСдиа-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ считываСт Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ peek pointer.
  • Π”Π°Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹.
  • Волько послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ read pointer продвигаСтся Π²ΠΏΠ΅Ρ€Π΅Π΄, Ρ‡Ρ‚ΠΎ освобоТдаСт мСсто Π² Π±ΡƒΡ„Π΅Ρ€Π΅.
  • ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ – для обновлСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
  • Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ – для сигнализации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сСмафор – Chromium увСдомляСт, ΠΊΠΎΠ³Π΄Π° записаны Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π° ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ сигнализируСт, ΠΊΠΎΠ³Π΄Π° освободилось мСсто Π² Π±ΡƒΡ„Π΅Ρ€Π΅.

Π˜Ρ‚ΠΎΠ³ΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° собствСнного ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚:

  • ИспользованиС CPU ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π½Π° 50%.
  • Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΠ»Π°ΡΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΠΎΡ‚ΠΎΠ².

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ сниТСнию Π³ΠΎΠ΄ΠΎΠ²Ρ‹Ρ… расходов Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° $1 ΠΌΠ»Π½.

***

Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ вас ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…? ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своими Π½Π°Ρ…ΠΎΠ΄ΠΊΠ°ΠΌΠΈ Π² коммСнтариях!