Sse что это такое
Sse что это такое
Технология SSE позволяла преодолеть 2 основные проблемы MMX — при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры были общими с регистрами MMX, и возможность MMX работать только с целыми числами.
SSE включает в архитектуру процессора восемь 128-битных регистров и набор инструкций, работающих со скалярными и упакованными типами данных.
Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над разными данными. В таком случае блоком SSE осуществляется распараллеливание вычислительного процесса между данными.
Содержание
Особенности
Регистры
В SSE добавлены восемь (шестнадцать) 128-битных регистров, которые называются xmm0 — xmm7 (-xmm15).
Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.
SSE-команды
Команды для чисел с плавающей точкой
Команды для целых чисел
Пример
Следующий пример демонстрирует перемножение четырёх пар чисел с плавающей точкой одной инструкцией mulps: (Программа написана на языке ANSI C++ с использованием ассемблерной вставки __asm и инструкций ассемблера для работы с SSE, аргументы записаны согласно стандарту Intel, а не AT&T)
Тот же пример, но ассемблерная вставка asm выполнена в стандарте AT&T (GNU Assembler)
См. также
Ссылки
Наборы расширения базовых инструкций процессоров семейства x86 |
---|
MMX | MMXEXT | SSE | SSE2 | SSE3 | SSSE3 | SSE4 | ATA | 3DNow! | 3DNowExt | SSE5 | AVX | AES |
Полезное
Смотреть что такое «SSE» в других словарях:
SSE 50 — SSE Composite Index Le SSE Composite Index est l indice boursier le plus utilisé pour refléter la performance du marché de la bourse de Shanghai. Les indices les plus connus sont les SSE 50 et SSE 180, regroupant respectivement les 50 et 180 plus … Wikipédia en Français
SSE — (Streaming SIMD Extensions) es una extensión al grupo de instrucciones MMX para procesadores Pentium III, introducida por Intel en febrero de 1999. Las instrucciones SSE son especialmente adecuadas para decodificación de MPEG2, que es el códec… … Wikipedia Español
SSE — [Abk. für Streaming SIMD Extensions, dt. »vorausschauend arbeitende SIMD Erweiterungen«] die, Befehlssatzerweiterung für Pentium Prozessoren, die Intel 1999 mit dem Katmai Modell des Pentium III einführte (SIMD). Es handelt sich um 70… … Universal-Lexikon
SSE — may refer to:In computing: *Senior Software Engineer (UK) *Server Sent Events, a technology to push content to web clients *Simple Sharing Extensions, a specification that extends RSS from unidirectional to bidirectional information flows… … Wikipedia
SSE — (Streaming SIMD Extensions) es una extensión al grupo de instrucciones MMX para procesadores Pentium III, introducida por Intel en febrero de 1999. Las instrucciones SSE son especialmente adecuadas para decodificación de MPEG2, que es el códec… … Enciclopedia Universal
Sse-ki — Sse ki, die chinesischen Reichsannalen … Pierer’s Universal-Lexikon
SSE — See substantial shareholding exemption. Practical Law Dictionary. Glossary of UK, US and international legal terms. www.practicallaw.com. 2010 … Law dictionary
SSE — simb. TS geogr. Sud Sud Est … Dizionario italiano
SSE — (south southeast) n. compass direction between south and southeast … English contemporary dictionary
SSE — ► ABBREVIATION ▪ south south east … English terms dictionary
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
SSE (Streaming SIMD Extensions)
SSE изначально называлась новой инструкцией Katmai (KNI), katmai являлся кодовым названием для Pentium III. В ходе проекта Katmai корпорация Intel стремилась отделить от своей предыдущей линейки продуктов, в частности их флагманский Процессор Pentium. Позднее он был переименован в расширение Intel потокового SIMD (ISSE),а потом в SSE. Компания AMD в конце концов добавила поддержку инструкций SSE, начиная с процессоров Athlon XP и Duron (Morgan core) процессоров.
Содержание
Особенности
Регистры
В SSE добавлены восемь (шестнадцать для x64) 128-битных регистров, которые называются xmm0 — xmm7 (-xmm15). Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.
SSE-команды
Команды для чисел с плавающей точкой
Скалярные типы – MOVSS Упакованные типы – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
Скалярные типы – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS Упакованные типы – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
Скалярные типы – CMPSS, COMISS, UCOMISS Упакованные типы – CMPPS
Упакованные типы – SHUFPS, UNPCKHPS, UNPCKLPS
Скалярные типы – CVTSI2SS, CVTSS2SI, CVTTSS2SI Упакованные типы – CVTPI2PS, CVTPS2PI, CVTTPS2PI
Упакованные типы – ANDPS, ORPS, XORPS, ANDNPS
Команды для целых чисел
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
Примеры
Пример использования встроенных функций SSE в программе на Си [4] :
SSE (Streaming SIMD Extensions)
Впервые SSE была использована в 1999 году в процессорах Pentium ІІІ с ядром Katmai. Изначально она называлась KNI (Katmai New Instructions).
SSE стала своеобразным ответом Intel на разработанную годом ранее компанией AMD технологию 3DNow!. Так же, как и 3DNow!, SSE применяется процессором, когда нужно совершить одни и те же действия над разными данными и обеспечивает осуществление до 4 таких вычислений за 1 такт. Этим достигается существенный прирост быстродействия. При этом, данные могут быть как целочисленными, так и вещественными.
Преимуществом SSE по сравнению с 3DNow! является использование собственных регистров, благодаря чему вместе с инструкциями SSE процессор может задействовать инструкции математического сопроцессора (регистры 3DNow! являются общими с сопроцессором и использовать их одновременно процессор не может).
SSE реализована в виде:
• 70 новых инструкций;
Каждый 128-битный регистр SSE может одновременно хранить не только 4 32-битных числа. За один такт процесор может обрабатывать любые данные, помещающиеся в 128 бит (при условии использования оптимизированного программного обеспечения).
Люди обычно оценивают процессор по количеству ядер, тактовой частоте, объему кэша и других показателях, редко обращая внимание на поддерживаемые им технологии.
Отдельные из этих технологий нужны только для решения специфических заданий и в «домашнем» компьютере вряд ли когда-нибудь понадобятся. Наличие же других является непременным условием работы программ, необходимых для повседневного использования.
Так, полюбившийся многим браузер Google Chrome не работает без поддержки процессором SSE2. Инструкции AVX могут в разы ускорить обработку фото- и видеоконтента. А недавно один мой знакомый на достаточно быстром Phenom II (6 ядер) не смог запустить игру Mafia 3, поскольку его процессор не поддерживает инструкции SSE4.2.
Если аббревиатуры SSE, MMX, AVX, SIMD вам ни о чем не говорят и вы хотели бы разобраться в этом вопросе, изложенная здесь информация станет неплохим подспорьем.
Одной из особенностей компьютеров на базе процессоров AMD, которой они выгодно отличаются от платформ Intel, является высокий уровень совместимости процессоров и материнских плат. У владельцев относительно не старых настольных систем на базе AMD есть высокие шансы безболезненно «прокачать» компьютер путем простой замены процессора на «камень» из более новой линейки или же флагман из предыдущей.
Если вы принадлежите к их числу и задались вопросом «апгрейда», эта небольшая табличка вам в помощь.
В таблицу можно одновременно добавить до 6 процессоров, выбрав их из списка (кнопка «Добавить процессор»). Всего доступно больше 2,5 тыс. процессоров Intel и AMD.
Пользователю предоставляется возможность в удобной форме сравнивать производительность процессоров в синтетических тестах, количество ядер, частоту, структуру и объем кэша, поддерживаемые типы оперативной памяти, скорость шины, а также другие их характеристики.
Дополнительные рекомендации по использованию таблицы можно найти внизу страницы.
В этой базе собраны подробные характеристики процессоров Intel и AMD. Она содержит спецификации около 2,7 тысяч десктопных, мобильных и серверных процессоров, начиная с первых Пентиумов и Атлонов и заканчивая последними моделями.
Информация систематизирована в алфавитном порядке и будет полезна всем, кто интересуется компьютерной техникой.
Таблица содержит информацию о почти 2 тыс. процессоров и будет весьма полезной людям, интересующимся компьютерным «железом». Положение каждого процессора в таблице определяется уровнем его быстродействия в синтетических тестах (расположены по убыванию).
Есть фильтр, отбирающий процессоры по производителю, модели, сокету, количеству ядер, наличию встроенного видеоядра и другим параметрам.
Для получения подробной информации о любом процессоре достаточно нажать на его название.
Проверка стабильности работы центрального процессора требуется не часто. Как правило, такая необходимость возникает при приобретении компьютера, разгоне процессора (оверлокинге), при возникновении сбоев в работе компьютера, а также в некоторых других случаях.
В статье описан порядок проверки процессора при помощи программы Prime95, которая, по мнению многих экспертов и оверлокеров, является лучшим средством для этих целей.
ПОКАЗАТЬ ЕЩЕ
Расширенные инструкции процессора: Разбираемся с SIMD (MMX,SSEx,3DNow!)
Перед тем, как процессор сгорит, в его памяти проносятся
все операции, которые он совершал в своей жизни (c)
Как известно одним из основных требований к компьютеру вообще и к процессору в частности является высокая производительность независимо от решаемой задачи. При обработке относительно больших объемов информации, показателем производительности процессора является количество информации, которую он может обработать за некоторый промежуток времени. При этом требуется минимизировать суммарное время, потраченное на обработку всего объема данных.
все операции, которые он совершал в своей жизни (c)
Как известно одним из основных требований к компьютеру вообще и к процессору в частности является высокая производительность независимо от решаемой задачи. При обработке относительно больших объемов информации, показателем производительности процессора является количество информации, которую он может обработать за некоторый промежуток времени. При этом требуется минимизировать суммарное время, потраченное на обработку всего объема данных.
За один такт процессор выполняет несколько инструкций над некоторым количеством исходных данных. Число тактов в единицу времени прямо пропорционально тактовой частоте, на которой работает процессор. Отсюда видно, что уменьшить время, требуемое на решение задачи можно несколькими способами: увеличив тактовую частоту, увеличив число исполняемых за такт команд или увеличить количество данных обрабатываемых каждой командой. Для реализации последнего способа необходимо чтобы единицы данных располагались последовательно и имели один и тот же тип (соответственно одинаковый размер). Именно это и наблюдается в мультимедиа контенте.
Мультимедийный файл представляет собой массив однородных элементов. Этому массиву предшествует некоторая описательная информация (заголовок), в котором содержится общая информация о файле. Так как в подобных массивах размер обычно одинаков, то их удобно обрабатывать группами, что ускоряет процесс решения задачи и уменьшает затраченное на него время. Аналогично и в области 3D-графики, где требуется рассчитать координаты вершин огромного количества полигонов, что также можно подвергнуть групповым вычислениям.
Для организации групповой обработки данных в процессорах используется SIMD расширения к х86 инструкциям. Аббревиатура SIMD расшифровывается как Single Instruction Multiple Data (одна инструкция – множество данных). Под SIMD расширением понимается программно-аппартное решение, представляющее собой совокупность дополнительных регистров и наборов инструкций процессора, предназначенных для групповой обработки данных. Также необходимо наличие соответствующих компиляторов, ”знающих” SIMD инструкции и способных оптимизировать под них код.
Поскольку каждый производитель процессоров по-своему улучшал архитекутуру, развитие микропроцессоров сопровождалось появлением нескольких вариантов SIMD расширений. Основные из них мы рассмотрим ниже.
MMX-расширение появилось в Pentium MMX (P55, январь 1997) и включало в себя 57 новых команд, предназначенных для обработки звуковых и видеосигналов. Позднее их поддержка появилась в K6 (Little Foot) от AMD и в 6х86MX от Cyrix.
MMX-расширение микропроцессора Pentium предназначено для поддержки приложений, ориентированных на работу с большими массивами данных целого типа, над которыми выполняются одинаковые операции. С данными такого типа обычно работают мультимедийные, графические, коммуникационные программы. По этой причине данное расширение архитектуры микропроцессоров Intel и названо MultiMedia eXtensions (MMX), что переводится как мультимедиа расширения.
Основа программной компоненты – система команд MMX-расширения (те самые 57 новых команд) и четыре новых типа данных. MMX-команды являются естественным дополнением основной системы команд микропроцессора. Основным принципом их работы является одновременная обработка нескольких единиц однотипных данных одной командой. Основа аппаратной компоненты – 8 MMX регистров, каждый размером в 64 бит = 8 байт. MMX работает только с целыми числами; поддерживаются данные размером в 1, 2, 4 или 8 байт. То есть, один MMX регистр может содержать 8, 4, 2 или 1 операнд соответственно.
Данные, содержащиеся в MMX-регистрах, можно покомпонентно складывать, умножать, вычитать, выполнять разнообразные специфические, необходимые для мультимедиа приложений, операции, вроде сложения без переполнения, вычисления среднего арифметического и производить логические операции с битами (побитовый and, or, xor). Делить, правда, нельзя, есть ещё ограничения. Но многие операции можно делать на порядок быстрее, даже больше. Однако, применение MMX в особенности требует специальной ручной оптимизации, никакой компилятор тут существенно не поможет. Под MMX, например, оптимизируются разнообразные кодеки аудио файлов, алгоритмы работы которых хорошо сочетаются с MMX. Причём, не вся программа целиком, а небольшая часть, выполняющая основную работу, и это обстоятельство упрощает оптимизацию.
Данное расширение появилось в Pentium III (ядро Katmai, сентябрь 1999) и насчитывало 70 новых команд. Позднее в Athlon XP (начиная с Palomino) его стали поддерживать и процессоры AMD. Аббревиатура SSE расшифровывается как Streaming SIMD Extensions (потоковые SIMD расширения).
SSE интересно прежде всего тем, что оперирует с данными вещественного типа, которые используются в геометрических расчётах, то есть, приложениях трёхмерной графики, компьютерных играх, редакторах вроде 3DStudioMax, и многих других. С тех пор как в компьютерных играх вроде Quake текстурирование треугольников стало производиться при помощи видеоускорителей, большая надобность в целочисленных вычислениях отпала. На первое место вышла скорость операций с плавающей точкой, вроде перемножения вещественного вектора на вещественную матрицу.
При внедрении SSE процессор получил в дополнение к стандартным регистрам архитектуры x87 8 новых больших регистров размером по 128 бит, в каждом из которых содержится 4 32-битных вещественных числа. С четвёрками операндов можно покомпонентно производить следующие операции: сложить две четвёрки чисел, вычесть, перемножить, разделить. Вычислить одновременно 4 (обратных) квадратных корня, точно или приближённо. Ещё можно тасовать содержимое регистров, перекладывать данные из одних частей регистра в другие и производить некоторые другие аналогичные операции. Однако перемещение данных происходит не быстрее их сложения, так что эффективное использование SSE возможно только на подготовленных правильно упакованных данных.
Если посчитать, что SSE-операция заменяет 4 аналогичных обыкновенных, то при оптимизации можно получить прирост производительности в 4 раза. Если быть более точным, то даже несколько больше, за счёт использования новых больших регистров. Однако, далеко не все вычисления можно эффективно оптимизировать под SSE. Как пример «хорошей» задачи следует привести умножение четырёхмерной матрицы на четырёхмерный вектор. Ускорение четырёхкратное без особых затрат.
В первую очередь использование SSE позволяет современным процессорам при выполнении трансформации вершин треугольников, составляющих трёхмерную сцену, успешно соревноваться с видеоускорителями. Другое дело, что у процессора много других задач, и лучше его по возможности разгрузить, чтобы он работал параллельно с видеоускорителем, и каждый выполнял свою задачу.
SSE2
Следующее расширение, являющееся логическим продолжением MMX и SSE появилось в Pentium 4 (начиная с Willamette). В Athlon 64 появилось начиная с Clawhammer.
В данное расширение включены 144 команды SSE2, ориентированные, в первую очередь, на работу с потоковыми данными. Подобно Pentium III, они также оперируют со 128-битными регистрами, но уже не только с четверками чисел одинарной точности, но и с любыми другими типами данных, которые умещаются в 128 бит. Это пары вещественных чисел двойной точности, шестнадцать однобайтовых целых, восьмерки двухбайтовых целых, пары восьмибайтовых целых etc. В результате получился некий симбиоз MMX и SSE.
Теперь те же 8 больших 128-битных регистров уже можно интерпретировать как содержащие не четыре 32-битных вещественных числа, а два 64-битных вещественных числа повышенной точности. Числа с повышенной точностью используются в тех случаях, когда вычисления с обычной точностью приводят к большим погрешностям. Все операции перенеслись с SSE, только работают не с четвёркой пар операндов, а с двойкой пар операндов.
В SSE2 регистры по сравнению с MMX удвоились, то есть, там стало помещаться не, например, 8 чисел, а 16. Поскольку скорость выполнения инструкций не изменилась, при оптимизации под SSE2 программа запросто получала двукратный прирост производительности. Надо отметить ещё следующее обстоятельство. Если программа уже была оптимизирована под MMX, то оптимизация под SSE2 даётся сравнительно легко в силу сходности системы команд.
Следующий набор появился в Pentium 4 начиная с Prescott и Athlon 64 начиная с Venice. Это расширение, имевшее поначалу имело рабочее название Prescott New Instruction, но получившее в итоге не совсем верное с технической точки зрения название SSE3, призвано облегчить оптимизацию программ под SSE и SSE2. Причём, в первую очередь, сделать более легкой полностью автоматическую оптимизацию программ средствами компилятора. То есть, для оптимизации необходимо будет просто перекомпилировать программу.
Некорректность названия SSE3 объясняется тем, что в отличие от других SIMD инструкций, где операции (например сложение) выполняются вертикально, здесь появилась возможность горизонтального выполнения операций.
Данный набор появился в новейших процессорах Intel Core 2. Конкретная информация по этим инструкциям пока отсутствует.
Кстати стоит отметить, что в новых интеловских процессорах появилась технология Intel Advanced Digital Media Boost, суть которой в ускорении выполнения SIMD инструкций. Если раньше каждая инструкция выполнялась за два такта (один такт для обработки старших 64 бит, а второй такт для младших), то теперь выполнение этой инструкции занимает один такт. Налицо двукратное ускорение, что должно сказываться на работе программ, оптимизированных под этот набор инструкций.
*Обновлено: информация о наборе инструкций SSE4 оказалась преждевременной, на самом деле SSE4 появится в процессорах поколения Penryn, которые предположительно должны появиться в четвертом квартале 2007 года.
Различают три поколения этого расширения инструкций: 3DNow!, Enhanced 3DNow! и 3DNow! Professional, однако очень часто их все называют просто 3DNow!
Набор инструкций 3DNow! появился в AMD K6-2 (Chomper). Данный набор, состоящий из 21 команды, был оптимизирован для еще более узкой области, нежели «универсально-мультимедийный» Intel MMX, а именно: для наиболее ресурсоемких расчетов, связанных с 3D-графикой. Даже в самом названии этого набора (3DNow!) отразилась область его применения. Это расширение во многом сходно с SSE, но так же имеет и значительные отличия. Регистров так же 8, но они размером не 128 бит, а 64. Соответственно, в них помещается не 4 числа, а только 2. Имеется аналогичный SSE набор арифметических операций с регистрами. Сложить-умножить-разделить две пары операндов и т.п. Есть и операции нахождения (обратного) квадратного корня, точные и более быстрые приближённые. Однако, есть ещё одно важное отличие расширения 3DNow! Можно складывать между собой содержимое одного регистра. То есть, так же как и в SSE3, производить не только вертикальные операции, но и горизонтальные.
В дальнейшем изменения блока 3DNow! произошли в К7. Он, как и раньше, работал с 64-битными регистрами, в которых находились пары вещественных чисел одинарной точности, зато его набор команд расширился еще на 24 инструкции (Enhanced 3DNow!). Последнее расширение этого набора до 3DNow! Professional появилось в ядре Thoroughbred.
На развитие набора 3DNow! негативно повлияло то, что у AMD первое время отсутствовал оптимизирующий компилятор, к тому же разработчики программ не торопились оптимизировать свои программы под эти инструкции.
Оценка прироста производительности.
После продолжительного поиска необходимые бенчмарки были найдены. Все они имеют возможность включать/отключать оптимизацию под определнные виды инструкций. Итак, тесты условно были поделены на четыре группы:
Материнская плата: Gigabyte GA-8I945P-G, BIOS v.F10
Процессор: Intel Pentium 4 630@3.600 MHz
Система охлаждения: TT Big Typhoon
Оперативная память: 512 Mb DDR2–667@638 Samsung Original (5-5-4-14), 512 Mb DDR2–667@638 Hynix (5-5-4-14)
Видеокарта: PCI-E Palit GeForce 6600GT@585/551 MHz
Дисковая подсистема: 160Gb SATA-II SAMSUNG HD160JJ, 40Gb Ultra-ATA/100 Seagate Barracuda ST340014A
Software: Windows XP SP2, ForceWare 91.28
Тест CPU RightMark достаточно редко встречается в обзорах, и я не удивлюсь если о нем слышали немногие (я сам только недавно его ”выловил”). Тест моделирует поведение притягивающихся и отталкивающих шаров в пространстве. Сам он представляет собой, по сути, два теста, объединенных в один. Модуль решателя (solver) рассчитывает физику взаимодействия тел, а модуль рендеринга (render) отображает это взаимодействие на экране. Нагрузку можно изменять и на модуль решателя (увеличивая количество рассчитываемых объектов), и на модуль рендеринга (изменяя количество источников света и качество текстур). В обоих модулях можно настраивать то, какие инструкции будут использованы при решении задачи. Тест больше оптимизирован под SSE/SSE3, поскольку требуется рассчитывать координаты объектов и силы их взаимодействия.
Как и ожидалось прирост от использования SIMD-инструкций в играх мал, и он тем меньше, чем лучше настройки графики.
Напоследок хочу привести таблицу десктопных ядер от Intel и AMD с указанием поддерживаемых наборов инструкций.
Использование SSE вместо WebSockets для однонаправленного потока данных через HTTP / 2
При создании веб-приложений необходимо продумывать, какой механизм доставки они будут использовать. Предположим, что у нас есть биржевое приложение, позволяющее покупать или продавать акции в режиме реального времени. Оно состоит из виджетов, которые предоставляют пользователям различные функции.
Существует несколько способов их реализации:
Бизнес-кейс
Чтобы быстро добавлять новые виджеты в биржевое приложение и подключать их без перераспределения всей платформы, нужно, чтобы они были автономными и управляли своим собственным механизмом ввода-вывода данных.
Виджеты никак не связаны друг с другом. В идеале они все должны быть подписаны на какую-либо конечную точку API и начинать получать данные от нее.
Данные, которые получат виджеты, в основном состоят из чисел и обновлений для этих чисел: первоначальный ответ содержит 10 акций со значениями их котировок.
Также данные должны включать в себя возможность добавления / удаления торгуемых акций, а также обновление текущих котировок. Мы передаем небольшое количество JSON-строк для каждого обновления так быстро, как это возможно.
HTTP / 2 обеспечивает мультиплексирование запросов, поступающих от одного домена. То есть, мы можем получить одно соединение для нескольких ответов.
Начнем с изучения различных вариантов получения данных и посмотрим, что может дать каждый из них.
Возможные варианты реализации
Длительный поллинг
Клиент запрашивает у сервера данные. Сервер не имеет данных и ждет некоторое время перед отправкой ответа:
После ответа сервер не может отправлять данные клиенту, пока клиент не отправит следующий запрос. Хотя средняя латентность для длинного поллинга приблизительно равна одной сетевой передаче, максимальная латентность превышает три сетевых передачи: ответ, запрос, ответ. Но из-за потери пакетов и повторной передачи максимальная латентность для любого протокола TCP / IP будет состоять более чем из трех сетевых передач (этого можно избежать при конвейерной обработке HTTP ). Это становится проблемой, когда пользователь находится в движении и переключается между мобильными вышками.
Клиент (или сервер) длительного поллинга, который находится под нагрузкой, имеет тенденцию к ухудшению производительности за счет задержки сообщений. Когда это происходит, события, которые отправляются клиенту, будут скапливаться в очереди. В нашем случае необходимо агрегировать данные по мере того, как мы отправляем в виджеты события добавления / удаления / обновления.
Запросы длительного поллинга должны ожидать, пока сервер не сможет что-то отправить клиенту. Это может привести к закрытию соединения прокси-сервером, если он слишком долгое время остается бездействующим.
Это может случиться, если ответы отправляются одновременно через постоянное HTTP / 2 соединение. Проблему сложно решить, поскольку ответы поллинга не могут быть синхронизированы.
WebSockets
WebSockets — это передовая технология, позволяющая открывать интерактивный сеанс связи между браузером и сервером. С помощью этого API можно отправлять сообщения на сервер и получать ответы на основе событий без необходимости запроса ответов с сервера.
Установив, что сокеты могут быть использованы, приступили к изучению их возможностей. И начали упираться в одну стену за другой.
Есть несколько проблем, связанных с WebSockets и прокси:
Балансировка нагрузки (без мультиплексирования) :
Если каждый пользователь открывает n-ное количество сокетов, реализовать корректную балансировку нагрузки очень сложно. Когда серверы перегружены, а вам нужно создавать новые экземпляры и завершать старые, действия, которые выполняются при «повторном подключении», могут вызвать длинные цепочки обновлений и новых запросов. Они будут перегружать систему.
WebSockets необходимо поддерживать как на стороне сервера, так и на стороне клиента. Невозможно переместить соединения сокетов на другой сервер, если текущий перегружен. Соединения должны быть закрыты и вновь открыты.
Нужно заново изобретать велосипед :
Хорошими вариантами применения WebSockets являются чаты и многопользовательские игры. Их главным преимуществом является дуплексная связь, а нам это не нужно.
Промежуточные итоги
Получаем ту же проблему для мобильных устройств и мобильных сетей для обеих технологий. Аппаратная конструкция этих устройств поддерживает открытое соединение, при котором через антенну осуществляется подключение к сотовой сети. Это приводит к сокращению срока службы аккумулятора, его перегреву и платежам, взимаемым операторами связи за передачу дополнительного объема данных.
Но почему еще есть проблемы с мобильными устройствами?
Мобильные устройства имеют антенну, обладающую малой мощностью, которая может принимать данные с ближайшей вышки. Как только мобильное устройство получает данные о входящем вызове, оно подключает полнодуплексную антенну для установления вызова. Одна и та же антенна используется каждый раз, когда вы хотите позвонить или получить доступ к интернету (если не доступен WiFi ).
Этот процесс потребляет довольно много энергии аккумулятора. По этой причине производители мобильных устройств декларируют время работы без подзарядки в режиме ожидания — несколько дней, а в режиме разговора — всего несколько часов.
«Интерфейс EventSource используется для приема Server-Sent Events. Он подключается к серверу через HTTP и принимает события в формате text / event-stream без закрытия соединения».
Основное отличие от поллинга заключается в том, что мы получаем только одно соединение и сохраняем поток событий, проходящий через него. Длительный поллинг создает новое соединение для каждого запроса — добавление заголовков и другие проблемы, с которыми мы столкнулись.
Server-Sent Events представляют собой события в режиме реального времени, исходящие от сервера и получаемые браузером. Они похожи на WebSockets тем, что выполняются в режиме реального времени. Но основной поток данных идет от сервера к клиенту.
После внимательного рассмотрения мы определили, что наш основной поток данных также идет от сервера к клиенту и гораздо реже от клиента к серверу.
Похоже, мы можем решить вопрос с запросами клиентов, отправляя новый запрос. Протокол является однонаправленным, и клиент не может через него отправлять сообщения на сервер. В итоге это даст временную задержку при загрузке на мобильных устройствах. Но это можно пережить — эта задержка измеряется в миллисекундах.
Уникальные функции
Реализация образца клиента
Рассмотрим простой пример кода для клиентской стороны:
Клиентская сторона довольно проста. Клиент подключается к источнику и ждет получения сообщений.
Чтобы серверы могли передавать данные на веб-страницы по протоколу HTTP или с помощью server-push протоколов, спецификация вводит для клиента интерфейс « EventSource ». Использование этого API заключается в создании объекта EventSource и регистрации прослушивателя событий.
Реализация клиента для WebSockets выглядит похоже. Сложность с сокетами заключается в ИТ-инфраструктуре и реализации сервера.
EventSource
Каждый объект EventSource содержит следующие компоненты :
Помимо URL-адреса все остальные компоненты рассматриваются как закрытые, и к ним нельзя получить доступ извне.
Обработка разрывов соединения
Если соединение разрывается, оно автоматически восстанавливается браузером. Сервер может отправить таймаут для повторного завершения или закрытия соединения. В таком случае браузер попытается подключиться после завершения таймаута или не будет ничего делать, если соединение завершено.
Реализация образца сервера
Если клиент такой простой, возможно, сложной окажется реализация сервера? Обработчик сервера для SSE может выглядеть следующим образом:
Определяем функцию, которая будет обрабатывать ответ:
Составление сообщений
Сообщение может содержать несколько свойств:
Устанавливаем для буфера тип события и значение поля. Это приводит к тому, что для event.type задается пользовательское имя события.
Все остальное будет проигнорировано. Мы не можем вводить собственные поля.
Пример с добавленным event :
В клиенте это обрабатывается с помощью addEventListener следующим образом:
Вы можете отправлять несколько сообщений, разделенных символом новой строки, а также использовав для них разные идентификаторы.
Это значительно упрощает то, что мы можем сделать с нашими данными.
Специальные требования к серверу
Мы получили все, чтобы приложение работало эффективно. Но столкнулись с некоторыми проблемами:
Некоторые из доступных полифиллов:
Бесплатное подключение и другие функции
Пользовательские агенты, работающие в контролируемых средах, могут отключить управление соединением с прокси-сервером в сети. В такой ситуации считается, что пользовательский агент включает как программное обеспечение мобильного устройства, так и сетевой прокси-сервер.
Например, браузер на мобильном устройстве, установив соединение, может обнаружить, что он находится в поддерживаемой сети, и попросить прокси-сервер сети взять на себя управление созданным соединением. Последовательность действий в такой ситуации может быть следующей:
Подобный подход может снизить объем передаваемых данных и привести к значительной экономии энергии.
Помимо реализации существующего API и формата передаваемых данных ext/event-stream также могут поддерживаться форматы фреймворка событий, определенные другими спецификациями.
Заключение
SSE является решением наших проблем с доставкой данных. Попутно возникли и некоторые сложности, но они оказались простыми для исправления.
Вот как выглядит окончательная рабочая установка:
Обзор окончательной архитектуры. Все конечные точки API обслуживаются NGINX, поэтому клиенты получают мультиплексированный ответ.
NGINX дает нам следующее :
Таким образом, мы управляем доставкой данных и сертификатами в одном месте, вместо того, чтобы делать это отдельно на каждой конечной точке.
Основные преимущества этого подхода:
Здесь вы можете найти демо-версию кода простой реализации клиента и сервера.
Пожалуйста, оставьте свои отзывы по текущей теме материала. За комментарии, отклики, подписки, дизлайки, лайки огромное вам спасибо!
Пожалуйста, опубликуйте ваши комментарии по текущей теме статьи. За комментарии, дизлайки, отклики, подписки, лайки низкий вам поклон!