Конференция DotNext 2016 в Москве. Итоги.

Ваш отзыв

dotnext

Добрый день всем!

Опять на работе этой самой работы через край. А что поделаешь, конец года как-никак. Поэтому я нашла время написать статью на блог только сегодня, хотя есть идеи и для других постов. Сегодня, 9 декабря, в Москве прошла конференция DotNext  — конференция для .NET разработчиков. Именно о ней и пойдет речь в сегодняшней статье.

В гостинице Рэдиссон Славянская в четырех залах читались доклады на различные темы вокруг темы .NET с 10:00 до 20:00 по московскому времени (да, учитывая содержание одного из докладов, это надо указывать ). Всего полноценно можно было побывать на 8 докладах — на 2 общих и на 6 выбранных. Заранее прошу прощения за качество фоток .

Доклад 1

На первом из них известный своими книгами Дино Эспозито на английском языке рассказывал о современном состоянии ASP.NET и о грядущих изменениях. Сейчас существует целых ветви проектов ASP.NET: Web Forms, MVC и Web API. Ниже на фотографии показан слайд с доклада.

дино эспозито

Дино Эспозито в уговаривал всю аудиторию забыть о такой технологии как Web Forms, так как вокруг будет только одно телевидение MVC .  Вот что будет поддерживать Microsoft в ближайшем будущем:

dsc_0209

Смысл именно такой архитектуры состоит в том, что если на предыдущем слайде четко указан web-сервер IIS, то здесь его роль вполне может играть любой другой, например, Apache.

Доклад 2

В качестве следующего доклада, который предстояло послушать, я выбрала доклад Михаила Ярийчука «А не зашкалит сервер от 100,000 запросов/сек?». Докладчик рассказывал о том, с какими проблемами производительности пришлось столкнуться буквально с самого начала разработки документо-ориентированной СУБД RavenDb, написанной на C#.

ravendb Ярийчук

Особые проблемы создавала сборка мусора, устраиваемая Garbage Collector. Она вносила существенный вклад в общее время выполнение операций по работе с базой данных. Поэтому был написан собственный аллокатор памяти. Работа производилась с файлами, спроецированными в память, средствами той операционной системы, на которой СУБД приходилось работать. В случае с Windows использовались команды WinApi.

Также была создана собственная реализация key-value базы данных под названием Voron. Пока она находится внутри проекта RavenDb, а не в виде отдельного репозитория на гитхабе.

В качестве отдельного проекта была оформлена собственная библиотека для сериализации/десериализации JSON — Blittable JSON.

Разработчики RavenDb не пожалели даже стандартные строки в C#, заменили их строками собственной реализации в виде unsafe кода .

Все выше приведенные мероприятия позволили существенно повысить производительность конкретного программного продукта. Но на этом все не закончилось. Оказалось, что при использовании Web API, например, для получения данных из БД, выявились тормоза в запросе… Выяснилось, что тормозила подсистема роутинга Web API. Благодаря тому, что эту подсистему выкинули и заменили другой, кастомной, тайминги запросов уменьшились на два порядка! Да, была реализована система, которая выполняла только поставленные перед ней задачи, без лишних фич, но зато делающая это эффективно.

Однако докладчик обратил особое внимание слушателей, что все эти оптимизации делались, исходя из конкретной задачи. Не стоит бежать, роняя тапки, и внедрять у себя тоже самое  . С случае с RavenDb это было необходимо и не факт, что в других проектах все это надо и вообще сработает столь же эффективно.

Доклад 3

Следующий доклад вновь был на английском языке и назывался «Stack Overflow — It’s all about perfomance», докладывал Marco Cecconi, собственно разработчик Stack Overflow.

marco cecconi dotnext

Докладчик сначала рассказывал об общих подходах к измерению и повышению производительности различных проектов. В частности, рассказывал о подходе Build (построение) -> Measure (измерение) -> Analyse (анализ). Затем Marco Cecconi наглядно показывал, как решалась проблема крайне высокой востребованности сайта Stack Overflow железным и программным методом. Выяснилось, что данный сайт является одним из самых популярных даже в Северной Корее  .

Во-первых, благодаря кластеризации серверов бед с данными и веб-серверов обеспечивается распределение нагрузки. Хотя, судя по данным приведенной им таблицы, самыми нагруженными являются сервера БД — до 30 с лишним процентов !  Веб-сервера в среднем нагружены не более чем на 4%. Также повсеместно используется кэширование (используется Redis). Новый запрос пришел — результат сразу в кэш!

Код также оптимизирован. В коде идет обращение к кэшу при помощи статического метода. Как и предыдущий докладчик, они также провели работу со строками, правда, совершенно в другом направлении. Чтобы одинаковые строки не плодились, они формируются один раз и передаются в различные методы. Например, так поступили с названиями вкладок на сайте.

Все было отлично, за исключением размеров графиков и подписей к ним. Думаю, можно было подобрать несколько иной масштаб отображаемых данных, чтобы слабовидящие программисты с галерки тоже прониклись деталями отображаемого, а не только общей картиной  . Кстати, у кого техника на галерке позволяла, фоткали графики и после просматривали их у себя на устройствах. Так что не у меня одной были проблемы.

Доклад 4

Следующий выбранный доклад — это доклад Михаила Щербакова «Странные дела: уязвимости в .NET платформе». Докладчик рассказал и показал на простых примерах некоторые найденные уязвимости, ВРОДЕ БЫ закрытые в самых новых выпусках .NET.

Михаил Щербаков DotNext

Среди них — это загрузка сервера под 100% обычной, казалось бы, проверкой E-Mail. Дело в том, что в старых версиях ASP.NET электропочта проверялась регуляркой, которую адрес вида «а.а.а@а.а.а.а.а.а.а.а.а.а.а.а.а.а» приводил в ступор. Тоже было и с URL-строкой. Фактически шло многократное зацикливание конечного автомата  . Это дыру уже пофиксили, заменили проверку при помощи регулярки проверками на соответствие схеме.

Также были рассмотрены возможности XXE-атак. Стандартные классы десериализации XML документов позволяли при особом подходе исполняться произвольным запросам, например, прочитать какой-нибудь web.config… .  При этом юзаются тег <!ENTITY…> и даже <!DOCTYPE..>.

Также конкретные дыры нашлись при использовании стандартных классов для десериализации бинарных данных. Если в лоб принимать бинарные данные и их десериализовывать, то уже на этапе десериализации на Вашем компьютере может неожиданно запуститься калькулятор ! Да, это был игрушечный пример использования такой атаки при условии возможности исполнения кода с нужными правами.

Страшно сказать, но две последние дыры закрыты в .NET, только начиная с версии 4.6… Вряд ли у всех прямо сейчас все проекты уже переведены на новую версию .NET.

Доклад 5

Далее был сытный обед, сразу после которого надо было бы слушать какую-нибудь отвлеченную информацию, но следующим докладом был «Продолжаем говорить про арифметику» Андрея Акиньшина, который думать заставлял  !

Андрей Акиньшин арифметика

С особой непринужденностью Андрей Акиньшин подбрасывал все новые и новые задачки аудитории на предмет производительности той или иной, на первой взгляд, простой операции сложения или вычитания чисел, а также ее точности. Докладчик не ограничивался показом одних только таймингов операций, он вскрывал причины именно таких больших или таких малых таймингов. Оказалось, что различные платформы, где запускался один и тот же код, по-разному генерировали ассеблерный код, что приводило к весьма неожиданным результатам в плане производительности. Код с инструкцией jmp вместо условных mov в том же месте, исполнялся заметно медленнее.

На фотографии выше докладчик рекомендует использовать алгоритм Кахана для суммирования чисел с плавающей запятой, который сохраняет накапливающуюся ошибку при суммировании в связи с конечной длиной числа, которую способен обработать, например, тип double (около 16 цифр).

Доклад 6

Затем следовал доклад Игоря Чевдаря «Модификация кода .NET в рантайме». Докладчик рассматривал два варианта модификации кода: статическую и динамическую. Также коснулся модификаций вызовов JIT-компилятора.

Игорь Чевдарь DotNext

Статическая модификация кода удобна тем, что изменяется сам код приложения, нет необходимости при каждом запуске сборки что-то там нужное менять.  В этом помогает библиотека Mono.Cecil, работу которой продемонстрировал докладчик. Задача средствами этой библиотеки подгрузить нужную сборку и затем менять те методы, те данные, ради которых все и затевалось. Важно то, что при этом изменяется сам код сборки. Можно, конечно, создать новую сборку на основе старой, но речь идет о том, что библиотека работает со сборкой просто как с массивом байт, как если бы открыли обычный файл на запись.

Динамическая модификация кода состоит в расстановке хуков к необходимым методам. Фактически подменяется адрес вызова функции на тот, где покоится измененный метод. На этом принципе работают всевозможные mock-библиотеки для тестирования нашего кода.

Доклад 7

Последний доклад, на который я пошла, был доклад «Подводные камни Date & Time» в исполнении Ильи Фофанова.

Илья Фофанов DotNext

Докладчик приводил различные примеры того, как при операциях с датами может ничего не работать . Например, столь нужные арифметические операции с датами могут выдать совсем нежеланные результаты. Например, класс DateTime ничего не знает о часовых поясах. Более того, даже класс DateTimeOffset формально о них тоже ничего не знает, он знает только о смещении времени (наши +03:00).

Обращалось особое внимание на параметр DateTimeKind в конструкторе структуры DateTime. Если поставить его в Local, то учитывается зимнее/летнее время, если Utc — то, конечно, нет, зато с такими датами проще совершать арифметические операции — не произойдет сюрприза в виде исчезнувшего или, наоборот, прибавившегося часа. На смещение при этом будет лишь указано, но оно никак не повлияет на конечный результат.

За часовые пояса отвечает класс TimeZoneInfo, который опирается на данные майкрософтовской базы данных часовых поясов. Названия часовых поясов в последней не всегда адекватны…

Было предложено обратить внимание на библиотеку Джона Скита Noda Time. Во-первых, она способна использовать как майкрософтовскую БД, так и БД IANA, а также может одно с другим сопоставить. Во-вторых, в ней, как утверждает докладчик, многие из проблем арифметики дат, перечисленных выше, решены.

Итог

По крайней мере те доклады, на которых я была, мне очень понравились, каждый по-своему. Для себя приняла решение, что надо ходить в первую очередь на «проблемные» доклады, то есть на те, в рамках которого докладчик рассказывает не о новых фичах какого-то решения, а о проблемах, с которыми пришлось столкнуться и как-то их решать. Банка сгущенки в тему .

Dotnext банка сгущенки

Оставьте комментарий

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...