Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ontico
Современные процессоры имеют на борту по нескольку вычислительных ядер, позволяющих запускать задачи на них параллельно. И, казалось бы, вот оно — счастье: бей большие задачи на куски, запускай эти куски параллельно на разных ядрах и радуйся.
Но не все так просто. Для того чтобы одновременный доступ к общим данным выполнялся корректно, современные системы используют разные примитивы синхронизации. В основе одних лежат блокировки (locks), в основе других — операции типа сравнение-с-обменом (compare-and-swap). Однако и у тех и у других есть свои слабые места. О них мы и поговорим.
Из доклада вы узнаете, чем блокирующие алгоритмы отличаются от неблокирующих, и какими достоинствами и недостатками обладает каждый из этих классов. Кроме того, будут показаны различные подводные камни тех и других решений: Deadlock, Livelock, Starvation, Mutable vs Immutable hype.
Доклад от Parallels:
Методики тестировния производительности database-centric приложений
Описание: При работе над сложными продуктами в database-centric приложениях изменения в коде и тем более в SQL запросах к базе данных могут приводить к неожиданным падениям производительности или же деградации производительности приложения с ростом размера базы данных. Поэтому важно уметь как можно быстрее отлавливать и исправлять причины таких деградаций.
Доклад о том, как устроен процесс мониторинга производительности продукта автоматизации хостинга и облачных сервисов Parallels Automation, для которого определяющим фактором является производительность базы данных.
Компания покажет, как анализирует планы исполнения SQL запросов внутри PostgreSQL, как проверяет насколько быстро и эффективно в целом работают SQL запросы, как определяет стратегию дальнейшей оптимизации.
Банки.ру — проект с 10-летней историей. В разные времена мы испытывали разные нагрузки. Портал перестраивался под новые требования как логически, так и технологически, что-то мы меняли в авральном режиме, что-то — эволюционным путём. Сейчас в среднем в день у нас примерно 2КК просмотра страниц, т.е. мы уже не маленькие, но ещё и не совсем большие.
Я хочу поговорить об оптимизации, её своевременности, и о субоптимизации, о том, что далеко не всегда лучшие практики разработки нагруженных систем идут на пользу бизнесу.
Посмотрим примеры и поищем ответы на вопросы:
1) Настолько ли ваш highload — highload?
2) Считать ли хабрэффект поводом для внедрения высоких технологий?
3) "Костыль" или "высокотехнологичное решение" — что выбрать? Плюсы и минусы.
4) Как выбрать момент для начала новой эры? Есть ли критерии, когда имеет смысл начинать оптимизировать ваше приложение и внедрять крутые штуки "по-взрослому".
5) Как можно использовать "список Бунина" для достижения очень неплохих показателей, и все ли пункты реально нужны вам?
6) Как работать с тех. долгом, чтобы он не зарастал мхом?
В заключение я расскажу про несколько примеров из жизни banki.ru в части замены технологических решений в области высоких нагрузок, и что из этого вышло.
P.S. Мнение докладчика может не совпадать с вашим, но это его опыт:)
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Демоны в большом проекте – проблемы и их решения (Redis, RabbitMQ, Skytools, Node.JS, HBase)", Александр Чистяков (ведущий разработчик Cezurity)
Аннотация
Когда команда разработчиков собирается написать новый сервис, у нее, как правило, отсутствует свободное время, но есть необходимый энтузиазм. Из-за нехватки времени многие архитектурные решения приходится принимать, руководствуясь общими соображениями, так как провести всесторонние тесты имеющихся на рынке средств в краткие сроки невозможно. Мы, специалисты компании Cezurity, начали свой проект не вчера, и уже накопили некоторый опыт использования технологий, появившихся сравнительно недавно - таких как Skytools, Node.JS, RabbitMQ и Redis. О том, какие возникли проблемы при внедрении этих средств, и какие их ограничения пришлось преодолевать и учитывать - мой доклад. Кроме того, я расскажу о новом направлении в нашей деятельности - внедрении HBase для хранения большого объема данных.
Биография
Докладчик - узкий специалист широкого профиля, относит себя к виду, называемому в современной англоязычной литературе термином "DevOps". Любит принимать участие в создании сложных систем и постоянно это делает. Никогда не работал в Яндексе, компенсировав это работой в Mail.Ru и некоторых других местах.
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
В последнее время во фронтенде появляется столько нового и внедряется настолько быстро, что не все успевают осознать последствия. Хорошо это или плохо? Рассмотрим некоторые новинки с точки зрения «за», а главное – «против».
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
В докладе я расскажу о следующем:
+ почему тема доклада не оговорка, а абсолютно реальная вещь;
+ что можно извлечь из результатов теста помимо «да/нет»;
+ в каких случаях «количество» = «качество»;
+ когда «один в поле не воин»;
+ немного о том, зачем тестировщику нужна матстатистика;
+ как избежать случайностей в результатах;
+ «буря в стакане» или масштабируем highload в docker/openvz;
+ почему фиксация запросов в тестах приводит к фиксации сервиса на продакшене;
+ а также всё вышеперечисленное на примерах наших проектов.
В докладе мы поделимся опытом создания content-based рекомендательной системы для электронной коммерции, работающей на семантическом ядре рунета (десятки миллионов профилей). Расскажем, как организовали централизованный сбор и обработку информации о посещении пользователями более 100 000 сайтов различной направленности на основе Amazon Kinesis. Поделимся опытом многопоточной онлайн-индексации потоков данных в Lucene. Продемонстрируем используемые базовые алгоритмы ранжирования и формирования персональных рекомендаций для посетителей более 20 000 интернет-магазинов.
Поговорим о плюсах и минусах лямбда-архитектур и обоснуем выбранное нами архитектурное решение. Отдельно остановимся на тонкостях технической реализации многопоточных алгоритмов и особенностях обеспечения реального времени - поступившая информация о действиях посетителя практически мгновенно учитывается рекомендательным движком, обеспечивая максимальную конверсию.
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
JavaScript, который мы пишем, не всегда исполняется, как мы думаем. Виртуальные машины, исполняющие его, делают многое, чтобы он работал быстрее. Но они не всесильны, и чтобы сделать код действительно быстрым, нужно знать их особенности и как все работает под капотом.
Поговорим об этих особенностях, что может служить причиной потери производительности, как это диагностировать и как делать код действительно быстрым. Доклад базируется на опыте, полученном в ходе работы над такими проектами как basis.js (весьма быстрый фреймворк для SPA), CSSO (минификатор CSS, который из медленного стал один из самых быстрых), CSSTree (самый быстрый детальный CSS парсер) и других.
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
Задача выглядит обманчиво простой — рядом с баннером игры из Одноклассников показывать текстовый тизер «эту игру играет Кот Матроскин и ещё 5 твоих друзей» (имя и количество берутся из друзей пользователя на Одноклассниках).
Как обрабатывать граф друзей проекта Одноклассники для этой задачи?
На этот простой вопрос дают разные ответы:
- взять графовую базу данных
- использовать матрицу инцидентности
- использовать список смежных вершин.
Если уточнить, что сырые данные занимают полтора терабайта, в графе 200 миллионов вершин и 13 миллиардов связей, то ручные решения сразу отметаются.
«Графовая база данных!» Стоит озвучить нагрузку в десятки тысяч запросов секунду и требования отвечать за миллисекунды (тысячные доли секунды!) как графовые базы сразу оказываются за бортом — типичное время ответа на простые запросы — единицы секунд.
Экс-разработчик MySQL и SciDB, ныне ведущий разработчик myTarget Олег Царёв расскажет, как решалась эта непростая задача в рамках проекта.
Este documento presenta el proyecto de vida de Diana Cáterin Villamil Moreno, una estudiante de 14 años. Incluye información sobre su familia, gustos, habilidades, debilidades e intereses. Entre sus intereses se encuentran estudiar, viajar, bailar, ayudar a los demás y cuidar el medio ambiente.
Este documento describe brevemente Twitter, incluyendo su origen en California en 2006, su popularidad mundial con más de 200 millones de usuarios, y cómo se ha convertido en una herramienta para compartir noticias y eventos. También resume los resultados de una encuesta que muestra que los jóvenes, residentes de ciudades, latinos y afroamericanos en EEUU tienen más probabilidades de usar Twitter que otros grupos.
Банки.ру — проект с 10-летней историей. В разные времена мы испытывали разные нагрузки. Портал перестраивался под новые требования как логически, так и технологически, что-то мы меняли в авральном режиме, что-то — эволюционным путём. Сейчас в среднем в день у нас примерно 2КК просмотра страниц, т.е. мы уже не маленькие, но ещё и не совсем большие.
Я хочу поговорить об оптимизации, её своевременности, и о субоптимизации, о том, что далеко не всегда лучшие практики разработки нагруженных систем идут на пользу бизнесу.
Посмотрим примеры и поищем ответы на вопросы:
1) Настолько ли ваш highload — highload?
2) Считать ли хабрэффект поводом для внедрения высоких технологий?
3) "Костыль" или "высокотехнологичное решение" — что выбрать? Плюсы и минусы.
4) Как выбрать момент для начала новой эры? Есть ли критерии, когда имеет смысл начинать оптимизировать ваше приложение и внедрять крутые штуки "по-взрослому".
5) Как можно использовать "список Бунина" для достижения очень неплохих показателей, и все ли пункты реально нужны вам?
6) Как работать с тех. долгом, чтобы он не зарастал мхом?
В заключение я расскажу про несколько примеров из жизни banki.ru в части замены технологических решений в области высоких нагрузок, и что из этого вышло.
P.S. Мнение докладчика может не совпадать с вашим, но это его опыт:)
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Демоны в большом проекте – проблемы и их решения (Redis, RabbitMQ, Skytools, Node.JS, HBase)", Александр Чистяков (ведущий разработчик Cezurity)
Аннотация
Когда команда разработчиков собирается написать новый сервис, у нее, как правило, отсутствует свободное время, но есть необходимый энтузиазм. Из-за нехватки времени многие архитектурные решения приходится принимать, руководствуясь общими соображениями, так как провести всесторонние тесты имеющихся на рынке средств в краткие сроки невозможно. Мы, специалисты компании Cezurity, начали свой проект не вчера, и уже накопили некоторый опыт использования технологий, появившихся сравнительно недавно - таких как Skytools, Node.JS, RabbitMQ и Redis. О том, какие возникли проблемы при внедрении этих средств, и какие их ограничения пришлось преодолевать и учитывать - мой доклад. Кроме того, я расскажу о новом направлении в нашей деятельности - внедрении HBase для хранения большого объема данных.
Биография
Докладчик - узкий специалист широкого профиля, относит себя к виду, называемому в современной англоязычной литературе термином "DevOps". Любит принимать участие в создании сложных систем и постоянно это делает. Никогда не работал в Яндексе, компенсировав это работой в Mail.Ru и некоторых других местах.
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
В последнее время во фронтенде появляется столько нового и внедряется настолько быстро, что не все успевают осознать последствия. Хорошо это или плохо? Рассмотрим некоторые новинки с точки зрения «за», а главное – «против».
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
В докладе я расскажу о следующем:
+ почему тема доклада не оговорка, а абсолютно реальная вещь;
+ что можно извлечь из результатов теста помимо «да/нет»;
+ в каких случаях «количество» = «качество»;
+ когда «один в поле не воин»;
+ немного о том, зачем тестировщику нужна матстатистика;
+ как избежать случайностей в результатах;
+ «буря в стакане» или масштабируем highload в docker/openvz;
+ почему фиксация запросов в тестах приводит к фиксации сервиса на продакшене;
+ а также всё вышеперечисленное на примерах наших проектов.
В докладе мы поделимся опытом создания content-based рекомендательной системы для электронной коммерции, работающей на семантическом ядре рунета (десятки миллионов профилей). Расскажем, как организовали централизованный сбор и обработку информации о посещении пользователями более 100 000 сайтов различной направленности на основе Amazon Kinesis. Поделимся опытом многопоточной онлайн-индексации потоков данных в Lucene. Продемонстрируем используемые базовые алгоритмы ранжирования и формирования персональных рекомендаций для посетителей более 20 000 интернет-магазинов.
Поговорим о плюсах и минусах лямбда-архитектур и обоснуем выбранное нами архитектурное решение. Отдельно остановимся на тонкостях технической реализации многопоточных алгоритмов и особенностях обеспечения реального времени - поступившая информация о действиях посетителя практически мгновенно учитывается рекомендательным движком, обеспечивая максимальную конверсию.
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
JavaScript, который мы пишем, не всегда исполняется, как мы думаем. Виртуальные машины, исполняющие его, делают многое, чтобы он работал быстрее. Но они не всесильны, и чтобы сделать код действительно быстрым, нужно знать их особенности и как все работает под капотом.
Поговорим об этих особенностях, что может служить причиной потери производительности, как это диагностировать и как делать код действительно быстрым. Доклад базируется на опыте, полученном в ходе работы над такими проектами как basis.js (весьма быстрый фреймворк для SPA), CSSO (минификатор CSS, который из медленного стал один из самых быстрых), CSSTree (самый быстрый детальный CSS парсер) и других.
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
Задача выглядит обманчиво простой — рядом с баннером игры из Одноклассников показывать текстовый тизер «эту игру играет Кот Матроскин и ещё 5 твоих друзей» (имя и количество берутся из друзей пользователя на Одноклассниках).
Как обрабатывать граф друзей проекта Одноклассники для этой задачи?
На этот простой вопрос дают разные ответы:
- взять графовую базу данных
- использовать матрицу инцидентности
- использовать список смежных вершин.
Если уточнить, что сырые данные занимают полтора терабайта, в графе 200 миллионов вершин и 13 миллиардов связей, то ручные решения сразу отметаются.
«Графовая база данных!» Стоит озвучить нагрузку в десятки тысяч запросов секунду и требования отвечать за миллисекунды (тысячные доли секунды!) как графовые базы сразу оказываются за бортом — типичное время ответа на простые запросы — единицы секунд.
Экс-разработчик MySQL и SciDB, ныне ведущий разработчик myTarget Олег Царёв расскажет, как решалась эта непростая задача в рамках проекта.
Este documento presenta el proyecto de vida de Diana Cáterin Villamil Moreno, una estudiante de 14 años. Incluye información sobre su familia, gustos, habilidades, debilidades e intereses. Entre sus intereses se encuentran estudiar, viajar, bailar, ayudar a los demás y cuidar el medio ambiente.
Este documento describe brevemente Twitter, incluyendo su origen en California en 2006, su popularidad mundial con más de 200 millones de usuarios, y cómo se ha convertido en una herramienta para compartir noticias y eventos. También resume los resultados de una encuesta que muestra que los jóvenes, residentes de ciudades, latinos y afroamericanos en EEUU tienen más probabilidades de usar Twitter que otros grupos.
El documento define la educación digital como la educación presencial y a distancia que utiliza tecnologías digitales para que profesores y estudiantes adquieran competencias y habilidades de aprendizaje de forma permanente. Explica que la educación digital permite aprender en cualquier lugar y momento, mejorando el aprendizaje tanto para estudiantes presenciales como a distancia. Además, señala que su uso se está generalizando en universidades y empresas para brindar atención personalizada a los estudiantes y conectarlos con una amplia comunidad académ
Este documento describe varias herramientas para crear presentaciones en línea como Prezi, Scribd, Slideshare, SlideRocket y otras. Prezi permite hacer zoom y es muy visual, aunque se debe tener cuidado de no abusar de los efectos. Scribd permite compartir documentos en varios formatos. Slideshare es una de las herramientas más utilizadas para compartir presentaciones en formato de diapositivas.
El documento describe la historia del trastorno por déficit de atención e hiperactividad (TDAH), desde sus primeras descripciones en 1845 hasta avances clave en la comprensión de sus bases biológicas y el desarrollo de tratamientos efectivos en la década de 1930 y 1940. Se destacan las contribuciones de pioneros como Still, Bradley, y Strauss en la caracterización del trastorno y el descubrimiento de que los estimulantes mejoran los síntomas.
A PowerPoint presentation of advanced mediation. The six mainstream styles of mediation, their structure and grounding. Get an introduction to the PP by mailing [email protected]
www.mediator.dk
An introduction to Rust: the modern programming language to develop safe and ...Claudio Capobianco
Rust is a young programming language developed by Mozilla with the open source community support. According to a survey of StackOverflow, in 2016 was the most loved among developers language! The goal of Rust is to combine control and performances, that is, operate at low level with high-level constructs. The actual applications vary from operating system to web development. Rust natively includes tools for Agile development, such as dependency management, testing and much more. The gap with other popular languages is filling up quickly thanks to the community, very active and fantastic :)
In this introductory presentation we will discuss the characteristics that make Rust unique, including the concepts of Ownership, Borrowing, and Lifetimes.
These slide has be presented for a talk in BIC Lazio Casilina, that has been also the first meetup of Rust Rome!
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
Расскажу зачем они вообще нужны. Пройдемся по технологиям и промоем им косточки. Рассмотрим достоинства и недостатки, а также где и когда лучше всего применять ту или иную ORM.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TKConf
Расскажу об организации процесса разработки Frontend в единый конвейер, чтобы увеличить скорость и минимизировать затраты с рисками.
Как организовать верстку макета по фантастичному макету дизайнера при этом не вогнав в когнитивный диссонанс результатом на Bootstrap.
Каким образом объединить воинствующие стороны: Frontend, Backend и дизайнеров.
"Как остаться в светлой памяти: доклад о том, почему наши приложения вылетают...Egor Petrov
В своих проектах мы часто забываем об out of memory error. Доклад посвящен причинам появления таких ошибок, механизмам контроля со стороны iOS, а также инструментам их отслеживания. Отдельно разберем, как бороться с потерей памяти превентивными мерами: работой с изображениями, контролем кэша, выгрузкой неиспользуемых экранов и другими. Такой доклад забыть не получится.
В последнее время во фронтенде появляется столько нового и внедряется настолько быстро, что не все успевают осознать последствия. Хорошо это или плохо? Рассмотрим некоторые новинки с точки зрения «за», а главное – «против».
Конференция FrontTalks, Екатеринбург, 19 сентября
Видео: https://vimeo.com/107694664
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Ontico
Огромная часть работы службы эксплуатации, так или иначе, связана с мониторингом существующей инфраструктуры.
Если система мониторинга настроена хорошо, она позволяет сократить время простоя, какие-то проблемы показать на ранней стадии, формализовать рабочие процессы команды админов.
То есть она является носителем знания о нашей инфраструктуре и о том, как именно работают админы.
Можно ли извлечь дополнительную пользу из этого?
В hh.ru мы используем систему мониторинга ещё и как check list для повседневных задач админов (алерты в данном случае являются задачами для человека: сделал задачу - триггер проверил результат и погас), идея взята из TDD.
Также расскажу, как мы работаем с внештатными ситуациями: реагируем на алерты, чиним, разбираем и классифицируем.
Еще на основе разобранных инцидентов мы считаем показатели работы службы эксплуатации, из этих показателей высчитываются наши премии (данный KPI получился удачным: с ним согласен и бизнес и админы).
Highload++2013: TopGun - архитектура терабитной платформы DPILeonid Yuriev
Презентация с конференции HighLoad-2013 об архитектуре новой DPI платформы Петер-Сервис.
http://www.highload.ru/2013/abstracts/1178.html
Представлен обзор архитектуры многоцелевой DPI-платформы, на основе которой могут строиться как "шпионские" приложения класса СОРМ/PRISM, так и коммерческие системы PCEF/TDF (Traffic Shaping), безопасного Интернета (интеллектуальная фильтрация содержимого), таргетирования рекламы и т. д. К особенностям рассматриваемого решения можно отнести мультитерабитное масштабирование, способ балансировки, обработку "роем" (Swarm Intelligence) и аварийного восстановления (failover) посредством репликации конечных автоматов.
Roadmap:
- offtopic: кому и зачем нужен DPI?
- offtopic: законность и морально-этические вопросы.
- на какую "луну" нужно сесть, что мы хотим сделать?
- распределение трафика за счет использования коммутаторов и MAC rewrite.
- роевой интеллект (Swarm Intellegence) для управления балансировкой и обработкой данных.
- репликация конечных автоматов (виртуальных микромашин).
- распределенное "Табло" как оперативное хранилище с элементами key-value и eventual consistency, lockfree в shared memory.
- транспортный фасад, унифицирующий DPDK, netmap, Infiniband (RDMA), 0mq и zerocopy и lockfree обмен через shared memory.
2. Java Platform Performance BoF @
о чём у нас
• Отвечаем на вопросы
– В основном, предварительно собранные в разных местах Рунета
– Есть возможность задать вопрос прямо здесь
• Пишем на бумажке, передаём вперёд ;)
• Здесь и сейчас:
– Performance Engineering
– Benchmarking
– JIT
– Concurrency and synchronization
– Startup
• Не здесь или не сейчас, а на других сессиях:
– “Диагностика проблем и настройка GC”
#2, Oracle
4. Performance Engineering
абстрактно и отлично об отличиях в абстракциях
• Computer Science → Software Engineering
– Строим приложения по функциональным требованиям
– В большой степени абстрактно, в “идеальном мире”
• Теоретически неограниченная свобода – искусство!
• Можно строить воздушные зАмки
– Рассуждения при помощи формальных методов
• Software Performance Engineering
– “Real world strikes back!”
– Исследуем взаимодействие софта с железом на типичных данных
• Производительность уже нельзя оценить
• Производительность можно только измерить
– Естественно-научные методы
• Основываемся на эмпирических данных
#4, Oracle
5. Performance Engineering
первый шаг
• Классические ошибки первого шага
– “я вижу, что метод foo() реализован неэффективно”
– “по профилю видно, что метод bar() – самый горячий и занимает 5%”
– “по-моему, у нас тормозит БД, и необходимо перейти с DBX на DBY”
• Правильный первый шаг:
– Необходимо выбрать метрику
• ops/sec, transactions/sec
• время исполнения
• время отклика
– Убедиться в корректности метрики
• релевантна (учитывает реальный сценарий работы приложения)
• повторяема
ЦЕЛЬ → улучшение метрики!
#5, Oracle
6. Performance Engineering
анализ узких мест (tips)
• Низкая утилизация CPU
– Высокая дисковая, сетевая активность
– Конфликт блокировок
– Конфликт ресурсов ОС
– Слабая параллелизация приложения
• Высокая утилизация ядра ОС
– Частые блокировки
– Частое обращение к ОС
• Высокая утилизация CPU
– Неоптимальная архитектура приложения
– Неправильное использование API
– Неоптимизированные горячие методы
– Неоптимальные настройки GC
#6, Oracle
7. Performance Engineering
инструменты для анализа системы
Solaris Linux Windows Что смотрим
Сеть netstat, dtrace netstat perfmon количество
соединений, объем
трафика
Диск iostat, dtrace iostat perfmon количество обращений
к диску, задержка
Память vmstat, prstat, vmstat, top perfmon подкачка страниц,
dtrace размер памяти
Процессы ps, vmstat, ps, vmstat, top perfmon количество нитей,
mpstat, prstat, состояние нитей,
dtrace переключения
контекста
Ядро ОС mpstat, lockstat, vmstat perfmon kernel time, блокировки,
plockstat, dtrace, системные вызовы,
intrstat, vmstat прерывания ...
#7, Oracle
8. Performance Engineering
tools, tools, tools again, more tools
• VisualVM
– http://visualvm.dev.java.net
• JRockit Mission Control
– http://www.oracle.com/technetwork/middleware/jrockit/mission-control/index.html
• Sun Studio Analyzer
– http://www.oracle.com/technetwork/server-storage/solarisstudio/overview/index.html
• NetBeans Profiler
– http://www.netbeans.org
• DTrace
– http://www.oracle.com/technetwork/systems/dtrace/dtrace/index.html
• Ещё могут быть полезны:
– JProbe
– OptimizeIt
– YourKit
#8, Oracle
10. JVM tuning
настройка параметров JVM
• JVM сама подбирает оптимальные параметры своей
работы
– Server vs. Client
– Large pages (Solaris)
– CompressedOops (64-bit VM)
• Так что же настраивать?
– GC/Heap tuning
– -XX:+UseNUMA (Solaris, Linux)
– -XX+:UseLargePages (Linux, Windows)
• http://www.oracle.com/technetwork/java/javase/tech/largememory-jsp-137182.html
• Не забыть
– Использовать последнюю версию JDK
#10, Oracle
12. Benchmarking
на чём измерять производительность?
“микро” синтетические авто-сценарии реальные
бенчмарки бенчмарки реальных приложения
приложений
релевантность плохая средняя хорошая отличная
расходы на низкие средние средние высокие
разработку и
поддержку
расходы на низкие низкие средние высокие
запуск
сложность очень средняя средняя сложно
интерпретации сложно
результатов
#12, Oracle
13. Benchmarking
наша стратегия
• Сделать реальные приложения быстрее
– Но, слишком сложно поддерживать и запускать
– Поэтому...
• Сфокусироваться на синтетических бенчмарках и авто-
сценариях
– SPECjbb*, SPECjvm*, SPECjAppServer*, SPECjEnterprise*
– Glassfish, Weblogic, NetBeans, и т.п.
– Большие in-house нагрузки
• Пользоваться микробенчмарками с опаской
– Иногда от них никуда не деться
– Очень легко написать, очень легко запустить
– Очень легко “выстрелить себе в ногу”
– ...что чуть ли не каждую неделю демонстрируется в профильных
блогах
#13, Oracle
14. Benchmarking
итак, вы решили написать свой бенчмарк
• Опасайтесь типичных ошибок
• Дизайн эксперимента
– Что хотим измерить?
– Каким способом будем измерять?
• Реализация эксперимента
– Отсутствие прогрева, “мёртвый код”, etc.
– Многопоточность, утилизация
– Контроль переменных: результат воспроизводится?
– Контроль переменных: результат вообще зависит от входов?
• Интерпретация результатов
– Что в итоге измерили?
• Почему мой бенчмарк не может работать быстрее?
– Значим ли результат?
• 1000 ops/sec против 1050 ops/sec – прирост или нет?
#14, Oracle
16. JIT
факты
• … есть
• … работает
• … работает хорошо
• … знает о железе всё:
– Количество и тип CPU
– Поддерживаемые инcтрукции (SSEx, AVX, VIS)
– Топологию памяти (в т.ч. размеры кэшей и их характеристики)
• … знает о приложении много всего:
– Иерархию загруженных классов
– Актуальную статистику создания объектов
– Горячий код
– Какие ветвления исполнялись
– Какие значения использовались
– Многое другое
• … не боится использовать эти знания для компиляции
#16, Oracle
18. JIT
performance urban legends
final дает лучшую
производительность
копируйте поля в
локальные переменные!
volatile запрещает JIT
Reflection –
оптимизировать
дорого
доступ к полю
вызов виртуального
метода - дорого избегайте get/set вручную вылизанный метод
методов внутри лучше аналога из classlib
самого класса
immutable классы –
плохо вручную выполненый
native методы дорогие, System.arraycopy() inline – хорошо
нативный – значит ...
Java медленна потому, что нельзя вручную создание объектов дорого –
выключить проверку выхода индекса за используйте Object pooling
границы массива
#18, Oracle
19. JIT
как писать код
• Используйте стандартные библиотеки
– Зачем писать собственный стандартный контейнер?
• Используйте высокоуровневый API:
– java.util.*
– java.util.concurrent.*
– NIO, NIO.2
– вообще библиотеки
• Код должен правильным и понятным
– Сначала правильно
– Потом алгоритмически “быстро”
– Код не должен быть JIT-oriented
• Правильно используйте возможности языка
– EPIC FAIL: штатная передача управления exception'ами
– FAIL: Возврат “исключения” через return <код_ошибки>
– FAIL: int вместо Enum или boolean
– ...
#19, Oracle
20. JIT
для любопытных
Как получить ассемблерный код метода?
– Обычным дебаггером ;)
– JVMTI
– -XX:+PrintAssembly
• http://wikis.sun.com/display/HotSpotInternals/PrintAssembly
#20, Oracle
22. Concurrency
с чем его есть
• Только мы научились программировать, новая беда
– Новое входное данное в программе: время
– Подавляющее большинство concurrency-багов – гейзен-баги!
– TDD “отдыхает”
• Читаем хорошие книги
– “Учиться, учиться и ещё раз учиться” (с)
– “Java Concurrency in Practice”
– “The Art Of Multiprocessor Programming”
– “JSR 133 Cookbook”
– “A Little Book of Semaphores”
• Пользуемся высокоуровневыми примитивами
– java.util.concurrent.*
– … или другими, построенными на их основе
– … при условии, что знаем, как их можно композировать без потери корректности
– … при условии, что вообще знаем, как показать корректность
– … при условии, что понимаем, сколько стоит тот или иной подход
– … при условии, что обладаем 42-ухкратным запасом терпения и усидчивости
#22, Oracle
31. Startup
длинные приложения
• Важно только для коротких приложений
– Чем дольше работает приложение, тем меньше удельные затраты на
загрузку классов и компиляцию
• Пример: 8 часа работает IntelliJ IDEA 10.x:
– 26.600 классов загружено
– 5315 методов скомпилировано
• Загрузка классов:
– Всего потрачено 202 с., ~0.7% общего времени
– 10 мсек на класс
• Компиляция:
– Всего потрачено 112 с., ~0.03% общего времени
– 20 мсек на метод
#31, Oracle
32. What's Next
• Послушать ещё?
– JavaOne Moscow (апрель 2011)
• Проблема со слайдами?
– Найдите нас на конференции
– Напишите нам письмо
• Проблема с JDK?
– http://openjdk.java.net
– Задайте вопрос в OpenJDK
– ...а лучше сделайте патч и дайте его в OpenJDK на review
#32, Oracle
35. Performance Engineering
итеративный подход
Измерения
(эксперименты)
Старт Разработка Сбор и обработка данных
(кодирование решений) (профилировка, статистика)
Поиск решений Анализ узких мест
(прототипирование)
Важно:
– Одно изменение за цикл!
– Документировать все изменения
#35, Oracle
36. Performance Engineering
анализ узких мест
• Что ограничивает скорость работы приложения?
• CPU
• Ядро ОС
• I/O (Сеть, Диск)
#36, Oracle
37. Performance Engineering
”нисходящий” метод поиска узких мест
• Уровень системы
– Сеть
– Диск
– Database
– Операционная система
– Процессор/память
• Уровень приложения
– Блокировки, синхронизация
– Execution Threads
– API
– Алгоритмические проблемы
• Уровень JVM
– Выбор JVM
– Heap tuning
– JVM tuning
#37, Oracle
38. New Features,
Compatibility,
Support, and beyond
#38, Oracle
39. Java 7, Java 8
что ожидать в области производительности
• Java 7
– invokedynamic
– NIO.2
– Concurrency and Collection updates (Fork/Join)
– XRender pipeline for Java2D (client)
• Java 8 (или позже)
– Модульность
– λ-выражения (замыкания)
– Collection updates (filter, map, reduce)
#39, Oracle
40. Обратная совместимость
• Мешает ли улучшать производительность JVM?
– Да, поэтому иногда расширяемся:
• invokedynamic
• Модульность
• Стоит ли расширяться по первому требованию?
– Нет, развитие JVM/JIT, реализация новых методов оптимизации
позволяет получить бОльший выигрыш
• Вложенные классы
• Reflection
#40, Oracle
41. Лучшая ОС для Java
угадайте, какая?
Solaris
• “Engineered Together”
• Высокопроизводительный TCP/IP стек
– low-latency
– up to 50% faster
• DTrace
– мониторинг
• NUMA
– MPO, Memory Placement Optimization
• Large Pages
– Автоматическая аллокация
– Разные размеры
#41, Oracle
42. Benchmarking
ближе к делу, пример
• Computer Language Benchmark Game
– http://shootout.alioth.debian.org/
– Самый известный полигон для расстрела невинных ног
• Тест “PiDigits”
– Вычислить первые N цифр в десятичном разложении π
– Вычисляется приближение π специальным рядом
• Требуется arbitrary precision для представления рациональных
членов ряда
– Потенциально параллелизуема
– Две версии Java-теста:
• Текущая использует GNU MP, внутренне параллельна, 240 строк
кода, Java + нативные врапперы + GMP
• Предыдущая использует BigInteger, не параллельна, 130 строк
кода, plain Java
#42, Oracle
43. Benchmarking
ближе к делу, пример
• Computer Language Benchmark Game
– http://shootout.alioth.debian.org/
– Самый известный полигон для расстрела невинных ног
• Тест “PiDigits”
– Вычислить первые N цифр в десятичном разложении π
– Вычисляется приближение π специальным рядом
• Требуется arbitrary precision для представления рациональных
членов ряда
– Потенциально параллелизуема
– Две версии Java-теста:
• Текущая использует GNU MP, внутренне параллельна, 240 строк
кода, Java + нативные врапперы + GMP
• Предыдущая использует BigInteger, не параллельна, 130 строк
кода, plain Java
#43, Oracle
44. Benchmarking
ближе к делу, пример
• Метрика: время исполнения
– time java -server pidigits 1000
• “Прогреем”:
pidigits.javasteady:
public static void main(String[] args){
pidigits m = new pidigits(Integer.parseInt(args[0]));
for (int i=0; i<65; ++i) m.pidigits(false);
m.pidigits(true);
}
#44, Oracle
45. Benchmarking
ближе к делу, пример
• Метрика: время исполнения
– time java -server pidigits 1000
• “Прогреем”:
pidigits.javasteady:
public static void main(String[] args){
pidigits m = new pidigits(Integer.parseInt(args[0]));
for (int i=0; i<65; ++i) m.pidigits(false);
m.pidigits(true);
}
pidigits.java:
public static void main(String[] args){
pidigits m = new pidigits(Integer.parseInt(args[0]));
// for (int i=0; i<19; ++i) m.pidigits(false);
m.pidigits(true);
}
#45, Oracle
46. Benchmarking
в век многоядерных систем
• Обычная платформа
– 2x2 Intel i5 2.6 Ghz, Ubuntu 10.10 i686, JDK 6u25
• Три варианта эксперимента:
– 1 экземпляр бенчмарка
• по “методологии CLBG” (+ корректный прогрев)
• GMP будет использовать 1x4=4 потока
• BI будет использовать 1x1=1 поток
– 4 экземпляра бенчмарка
• чтобы утилизировать все ядра = снормировать на систему
• GMP будет использовать 4х4=16 потоков
• BI будет использовать 4x1=4 потока
– 16 потоков
• ради одинаковой нагрузки на OS = снормировать на систему+OS
• GMP будет использовать 4х4=16 потоков
• BI будет работать в 16x1=16 потоков
• Какой из них наиболее релевантен?
#46, Oracle
47. Benchmarking
а вот и данные
• Метрика: операции в секунду
– 20 итераций
– [a; b] – доверительный интервал на 95%
1 экземпляр 4 экземпляра 16 потоков
“GMP”
8.84 13.28 13.28
[8.69; 8.99] [12.86; 13.71] [12.86; 13.71]
“BigInteger”
6.21 13.46 14.34
[6.19; 6.24] [13.35; 13.56] [14.21; 14.46]
#47, Oracle
48. Concurrency
элементная база
• OS Threading
– мьютексы
• mutex_lock()/mutex_unlock()
– conditional waits
• cond_wait()/cond_signal()
• WaitForSingleObject
• Compare-and-Swap (CAS)
– CAS(x1, x2, x3) = { if (x1 == x2) { x1 = x3 }; }
– атомарная операция, поддерживаемая в “железе”: из нескольких
одновременных CAS'ов успешно завершается только один
– Миф: локальный CAS блокирует шину, и стоит больше на
многопроцессорных системах
– Факт: глобальный CAS требует трафика на шине
http://blogs.sun.com/dave/entry/biased_locking_in_hotspot
#48, Oracle
49. Concurrency
atomics
• java.util.concurrent.Atomic*
– обеспечивают атомарные операции над примитивами и указателями
– альтернатива: synchronized {} или Lock'и
• Трюк в использовании CAS'а:
– Изменение состояния атомика делается при помощи одного CAS'а
– Чтение состояния не требует CAS'а
mov %ecx,%edx
mov 0x8(%ecx),%eax
public final int incrementAndGet() { lea 0x8(%ecx),%edi
for (;;) { mov %eax,%ecx
int current = get(); inc %ecx
int next = current + 1; lock cmpxchg %ecx,(%edi)
if (compareAndSet(current, next)) mov $0x0,%ebx
return next; jne [ok]
} mov $0x1,%ebx
} test %ebx,%ebx
je [ok]
#49, Oracle
50. Concurrency
volatile
• Volatile определяет порядок чтения-записей в поле
– Точная семантика определена в Java Memory Model
• НЕ обеспечивает атомарности
– Реализуется расстановкой барьеров
• Какие из них вставятся в код, зависит от Hardware Memory Model
• Эффект барьера зависит от HMM
PUSHL EBP
SUB ESP,8 push %ebp
MOV EBX,[ECX + #12] sub $0x8,%esp
MEMBAR-acquire mov 0xc(%ecx),%ebx
MEMBAR-release inc %ebx
INC EBX mov %ebx,0xc(%ecx)
MOV [ECX + #12],EBX lock addl $0x0,(%esp)
MEMBAR-volatile add $0x8,%esp
LOCK ADDL [ESP + #0], 0 pop %ebp
ADD ESP,8 test %eax,0xb779c000
POPL EBP ret
TEST PollPage,EAX
RET
http://g.oswego.edu/dl/jmm/cookbook.html
#50, Oracle
51. Concurrency
intrinsic synchronization
• synchronized(object) { }
• 4 состояния:
– Init
• Начальное “неопределённое” состояние
– Biased
• Захватывается одним “владеющим” потоком, нет конфликтов
• Захват владельцем: проверка на threadID
• Захват не-владельцем: переход либо в Biased, либо в Thin
– Thin
• Захватывается несколькими потоками, но конфликтов нет
• Захват: CAS
• Конфликтный захват: переход в Fat
– Fat
• Захватывается несколькими потоками, конфликт на блокировке
• Вызов примитива синхронизации из ОС
#51, Oracle
52. Concurrency
java.util.concurrent.Lock
• Построены на базе j.u.c.AbstractQueueSynchronizer
– Использует атомики
• CAS
– Использует Unsafe.park()/unpark()
• интринзики для cond_wait()/cond_signal()/WaitForSingleObject()
• ReentrantLock
– По семантике эквивалентен synchronized {}
• Рекурсивный захват: проверка на threadID
• Ставит потоки во внутреннюю очередь и делает park()
– Non-Fair (default)
• Не гарантирует отсутствие starvation
• Barging FIFO (CAS)
• Лучшая производительность
– Fair
• Гарантирует отсутствие starvation
• FIFO
• Честность в обмен на производительность
http://gee.cs.oswego.edu/dl/papers/aqs.pdf
#52, Oracle
53. Concurrency
атомарный счётчик
private AtomicInteger atomic = new AtomicInteger();
private ReentrantLock lock = new ReentrantLock();
private final Object intrinsicLock = new Object();
private int primCounter = 0;
@GenerateMicroBenchmark
public void testAtomicInteger() {
atomic.incrementAndGet();
}
@GenerateMicroBenchmark
public void testReentrantLock() {
lock.lock();
primCounter++;
lock.unlock();
}
@GenerateMicroBenchmark
public void testIntrinsicLock() {
synchronized (intrinsicLock) {
primCounter++;
}
}
#53, Oracle
55. Concurrency
ReentrantLock vs. synchronized
• Семантика одинакова
– Требования к видимости памяти
– Рекурсивный
• Плюсы j.u.c.RL
– Очередь потоков держится на стороне JVM
• опционально, FIFO-политика при захвате-освобождении
• позволяет быть “честным” на любой платформе
– Barging FIFO policy
• lock() может быть сразу удовлетворён, даже если в очереди есть
потоки
• сильно улучшает производительность при конфликте блокировок
– Допускается несколько Condition
• Минусы j.u.c.RL
– Нет scope'ов, требуется ручной unlock() через finally
• Должно быть проще с ARM в JDK7
#55, Oracle