Epidemic Algorithms for Replicated Database Maintenance (1/2)
#shark_whitepaper
Классическая дремучая работа из 1987 года, когда самыми крутыми компаниями в IT были Xerox и IBM, которая в будущем станет основой для большинства алгоритмов поиска сбоев (failure detection) и уменьшения энтропии (entropy reduction). Благодаря этой работе появится, например целая семья алгоритмов-протоколов с общий названием gossip. Они используются практически везде, где есть необходимость поддерживать несколько узлов, например в Consul, Cassandra, AWS S3 (раскрывают в постмортеме) и в десятках других продакшон-грейд продуктах.
Эпидемические алгоритмы/протоколы так называются не случайно, а в честь особого вида математики, изучающего распространение эпидемий. Да, такая математика тоже существует. Вот например целая книжка по теме, очень актуально. Только в случае с алгоритмами цель — заразить наибольшее количество узлов, а не предотвратить заражение. Эдакий Plague Inc на транзисторах.
Терминология берётся из всё той же математики эпидемий. Узлы сети разделяются на 3 вида:
- susceptible — ещё не получили обновление.
- infective — уже получили и распространяют.
- removed — уже получили и не распространяют.
Задача стоит в том, чтобы распространить обновление по распределенной сети узлов, при этом уменьшить число узлов, которые ни разу не получили обновление, т.е. остались susceptible (такие узлы называются residue). При этом эпидемия должна завершиться за минимальное количество сообщений (traffic), а также алгоритм должен сойтись (convergence) максимально быстро. Сходимость измеряется как по среднему времени, так и по времени между первым и последним сообщением.
Эпидемия начинается с того, что некий узел переходит в состояние infective, и начинает распространять обновления. Их распространение происходит на случайным образом выбранные соседние узлы. После попытки заражения, узел с заранее заданной вероятностью
- Blind / Feedback. При blind распространении узел всегда после отправки сообщения проверяет, нужно ли ему перейти в removed. При feedback только если новая нода уже получала обновление. Использование feedback увеличивает трафик, так как нужно вернуть и ответ, но зато позволяет резко сократить процент residue узлов после завершения пандемии.
- Counter / Coin. В общем случае, узел переходит в removed с вероятностью
- Push / Pull. Обычно узлы заражают соседей по push модели, так как рассылают сообщения сами. Можно сделать алгоритм наоборот, когда все узлы сети сами начнут запрашивать сообщения от соседей. При наличии большого количества эпидемий одновременно, это работает даже лучше, чем push (пруфы в статье, спойлер: там матан с производными), но генерирует больше трафика. Оба подхода можно использовать одновременно в push-pull модели.
#shark_whitepaper
Классическая дремучая работа из 1987 года, когда самыми крутыми компаниями в IT были Xerox и IBM, которая в будущем станет основой для большинства алгоритмов поиска сбоев (failure detection) и уменьшения энтропии (entropy reduction). Благодаря этой работе появится, например целая семья алгоритмов-протоколов с общий названием gossip. Они используются практически везде, где есть необходимость поддерживать несколько узлов, например в Consul, Cassandra, AWS S3 (раскрывают в постмортеме) и в десятках других продакшон-грейд продуктах.
Эпидемические алгоритмы/протоколы так называются не случайно, а в честь особого вида математики, изучающего распространение эпидемий. Да, такая математика тоже существует. Вот например целая книжка по теме, очень актуально. Только в случае с алгоритмами цель — заразить наибольшее количество узлов, а не предотвратить заражение. Эдакий Plague Inc на транзисторах.
Терминология берётся из всё той же математики эпидемий. Узлы сети разделяются на 3 вида:
- susceptible — ещё не получили обновление.
- infective — уже получили и распространяют.
- removed — уже получили и не распространяют.
Задача стоит в том, чтобы распространить обновление по распределенной сети узлов, при этом уменьшить число узлов, которые ни разу не получили обновление, т.е. остались susceptible (такие узлы называются residue). При этом эпидемия должна завершиться за минимальное количество сообщений (traffic), а также алгоритм должен сойтись (convergence) максимально быстро. Сходимость измеряется как по среднему времени, так и по времени между первым и последним сообщением.
Эпидемия начинается с того, что некий узел переходит в состояние infective, и начинает распространять обновления. Их распространение происходит на случайным образом выбранные соседние узлы. После попытки заражения, узел с заранее заданной вероятностью
k переходит в состояние removed, т.е. перестает распространять обновления. Эпидемия завершается, когда в сети отсутствуют infective узлы, т.е. все узлы либо уже распространили и перешли в removed, либо никогда не получили обновление и остались в susceptible. Процесс заражения можно разделить по нескольким критериями:- Blind / Feedback. При blind распространении узел всегда после отправки сообщения проверяет, нужно ли ему перейти в removed. При feedback только если новая нода уже получала обновление. Использование feedback увеличивает трафик, так как нужно вернуть и ответ, но зато позволяет резко сократить процент residue узлов после завершения пандемии.
- Counter / Coin. В общем случае, узел переходит в removed с вероятностью
1/k, т.е. по броску k-гранной монетки. Подход counter значит, что узел не бросает монетку, а отключается только после n отправленных сообщений. Трейдофф здесь между "хранить счётчик" и не хранить. Кажется мелочь, но в системе может одновременно происходить несколько волн эпидемии с разными обновлениями, а счётчик нужно хранить на каждую из них на всех infective узлах, так что накладные расходы могут быть большими. Возможно также использовать и комбинированный подход, когда сначала отсылается n сообщений, а затем узел отключается с вероятностью k.- Push / Pull. Обычно узлы заражают соседей по push модели, так как рассылают сообщения сами. Можно сделать алгоритм наоборот, когда все узлы сети сами начнут запрашивать сообщения от соседей. При наличии большого количества эпидемий одновременно, это работает даже лучше, чем push (пруфы в статье, спойлер: там матан с производными), но генерирует больше трафика. Оба подхода можно использовать одновременно в push-pull модели.
🔥1
Epidemic Algorithms for Replicated Database Maintenance (2/2)
Замечательные рассуждения приводятся и об удаление данных при эпидемиях. Недостаточно отправить сообщение "удалить данные", потому что при наличии конкурирующих сообщений с изменениями, эпидемия по обновлению может перебороть эпидемию по удалению. Поэтому приходится хранить death certificate — некоторое сообщение, при получении которого все более старые сообщения можно игнорировать. Эти сообщения нужно хранить какое-то время, но не всё так просто.
Во-первых, выбрать правильное время хранения тяжело, т.к. в большой сети может всегда существовать недоступный узел, при этом недоступным он может быть долго, например дольше времени хранения. Во-вторых, всегда есть вероятность наличия residual узлов, которые вообще не получили информацию об удалении. При этом, существующие сертификаты тоже нужно когда-то удалять, так как они бесполезны, а место занимают.
В таких случаях можно использовать как минимум две техники. Первая — это использовать вместе с эпидемическим алгоритмом дополнительный способ синхронизации. Вторая — хранить death certificate на некоторых нодах в спящем состоянии. Когда такой узел получает обновление для спящего мертвого сертификата, он пробуждает сертификат и запускает новую эпидемию по удалению этого уже, казалось бы, удаленного элементы. Тут мы успешно перейдем к производной первой проблемы — когда удалить спящий сертификат...
Есть и другая сложность. Часть обновлений — это в самом деле легальное "возрождение" ранее убитых данных. Решить её в статье предлагается через заведение второго таймштампа. Один используется при обычных обновлениях, второй для активизации после удаления. Если узел активизирован после таймштампа сертификата, значит сертификат неверен и все узлы, которые одновременно пытаются распространить и удаление и обновление, должны прекратить распространять удаление и вообще уничтожить свой death certificate.
В заключении работы рассматривается, как вообще такие алгоритмы работает в реальных сетях, где узлы находятся на разном расстоянии, но при этом все соединены. Вывод в целом очевиден: эффективнее построить пространственный индекс (spatial index) и ходить по более близким элементам с большей вероятностью, чем по менее близким. При чем пруф есть как математический (который я не понял ¯\_(ツ)_/¯), так и экспериментальный. А вот если взять более необычные топологии сети, например когда узлы соединены в мини-кластеры и лишь малая часть нод общается между кластерами, тут всё становится ужасно как во времени сходимости так и в проценте residual узлов. И если pull-модель ещё как-то справляется, то push-модель при симуляциях может вообще не выйти за пределы одного кластера.
Замечательные рассуждения приводятся и об удаление данных при эпидемиях. Недостаточно отправить сообщение "удалить данные", потому что при наличии конкурирующих сообщений с изменениями, эпидемия по обновлению может перебороть эпидемию по удалению. Поэтому приходится хранить death certificate — некоторое сообщение, при получении которого все более старые сообщения можно игнорировать. Эти сообщения нужно хранить какое-то время, но не всё так просто.
Во-первых, выбрать правильное время хранения тяжело, т.к. в большой сети может всегда существовать недоступный узел, при этом недоступным он может быть долго, например дольше времени хранения. Во-вторых, всегда есть вероятность наличия residual узлов, которые вообще не получили информацию об удалении. При этом, существующие сертификаты тоже нужно когда-то удалять, так как они бесполезны, а место занимают.
В таких случаях можно использовать как минимум две техники. Первая — это использовать вместе с эпидемическим алгоритмом дополнительный способ синхронизации. Вторая — хранить death certificate на некоторых нодах в спящем состоянии. Когда такой узел получает обновление для спящего мертвого сертификата, он пробуждает сертификат и запускает новую эпидемию по удалению этого уже, казалось бы, удаленного элементы. Тут мы успешно перейдем к производной первой проблемы — когда удалить спящий сертификат...
Есть и другая сложность. Часть обновлений — это в самом деле легальное "возрождение" ранее убитых данных. Решить её в статье предлагается через заведение второго таймштампа. Один используется при обычных обновлениях, второй для активизации после удаления. Если узел активизирован после таймштампа сертификата, значит сертификат неверен и все узлы, которые одновременно пытаются распространить и удаление и обновление, должны прекратить распространять удаление и вообще уничтожить свой death certificate.
В заключении работы рассматривается, как вообще такие алгоритмы работает в реальных сетях, где узлы находятся на разном расстоянии, но при этом все соединены. Вывод в целом очевиден: эффективнее построить пространственный индекс (spatial index) и ходить по более близким элементам с большей вероятностью, чем по менее близким. При чем пруф есть как математический (который я не понял ¯\_(ツ)_/¯), так и экспериментальный. А вот если взять более необычные топологии сети, например когда узлы соединены в мини-кластеры и лишь малая часть нод общается между кластерами, тут всё становится ужасно как во времени сходимости так и в проценте residual узлов. И если pull-модель ещё как-то справляется, то push-модель при симуляциях может вообще не выйти за пределы одного кластера.
🔥1
Consistent Hashing и Akamai Technologies (1/2)
#shark_whitepaper
Я честно пытался написать привычный tl/dr по работе по консистентному хешированию (Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web), но пока готовился, понял, что интереснее даже не сама работа, а то, как развивался мир после нее. Кому все-таки хочется хардкора, матан начинается с четвёртой страницы и не заканчивается до самого конца. А если вы в первый раз видите словосочетание «консистентное хеширование» то советую посмотреть ссылка один просто хорошая и ссылка два лекция Стенфорда. Матана там нет, я проверил.
Сначала о работе. Идея заключается в том, чтобы выстраивать кеши друг за другом в Random Tree. Каждой странице при помощи случайной равномерной хеш-функции
Поскольку сеть в целом нестабильная, а нагрузка даже без swamping узлов может расти, нужно как-то добавлять дополнительные ноды в сеть и поднимать старые. Но ведь мы использует хеш-функции для определения пути от первого кеша до сервера. Обычно при изменении размера хеш-таблицы (в нашем случае, при вылете ноды), нужно заново вычислять значение хеш-функции для большинства ключей. Здесь как раз на помощь и приходит consistent hashing. Если использовать консистентную хеш-функцию в качестве функции
#shark_whitepaper
Я честно пытался написать привычный tl/dr по работе по консистентному хешированию (Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web), но пока готовился, понял, что интереснее даже не сама работа, а то, как развивался мир после нее. Кому все-таки хочется хардкора, матан начинается с четвёртой страницы и не заканчивается до самого конца. А если вы в первый раз видите словосочетание «консистентное хеширование» то советую посмотреть ссылка один просто хорошая и ссылка два лекция Стенфорда. Матана там нет, я проверил.
Сначала о работе. Идея заключается в том, чтобы выстраивать кеши друг за другом в Random Tree. Каждой странице при помощи случайной равномерной хеш-функции
h присваивается некий путь от первого кеша до вершины. Таких функцию несколько, т.е. есть больше чем 1 путь, по которому можно получить страницу. Браузер может вычислить этот путь, выбрав одну из хеш-фунцию. Запрос приходит на первый кеш, и если тот содержит страницу, отдаёт её, а если нет, направляет запрос на следующий кеш. Тот на следующий, на следующий и так до тех пор, пока запрос не доберётся до сервера, где страница уж точно есть. Страница сохраняется в кеше только после того, как кеш увидит запрос этой страницы несколько раз. Здесь важно, что у каждой страницы несколько случайных путей по дереву кешей в зависимости от выбранной хеш-функции. Разные клиенты будут получать разный путь к одной и той же странице, эффективно размазывая её по всему дереву кешей, что позволяет избавиться от перегруженных нод. В работе перегруженные ноды называют swamping. Доказательство того, что такое размазывание работает тоже есть. Поскольку сеть в целом нестабильная, а нагрузка даже без swamping узлов может расти, нужно как-то добавлять дополнительные ноды в сеть и поднимать старые. Но ведь мы использует хеш-функции для определения пути от первого кеша до сервера. Обычно при изменении размера хеш-таблицы (в нашем случае, при вылете ноды), нужно заново вычислять значение хеш-функции для большинства ключей. Здесь как раз на помощь и приходит consistent hashing. Если использовать консистентную хеш-функцию в качестве функции
h ещё на самом первом шаге при выборе случайного пути, можно добиться того, что большая часть случайных путей не будет перестраиваться при добавлении или удалении новых нод из сети.🔥1
Consistent Hashing и Akamai Technologies (2/2)
А теперь история. Двое из авторов работы Daniel Lewin и Frank Leighton — основатели Akamai Technologies. Компания делает CDN и security решения. Это Cloudflare/Fastly в мире ентерпрайза. Через них проходит по разным оценкам до 30% всего трафика в мире. Работа датируется 1997 годом и говорит как раз о том, как эффективно раздавать страницы в Интернете. В 1998 году авторы попали в финал конкурса MIT $50к Entrepreneurship Competition (сейчас MIT $100k. Инфляция!), основав в этом же году компанию. Собственно на двух идеях из работы: Random Trees и Consistent hashing, и основана архитектура Akamai CDN.
31 марта 1999 года происходит знаменательное событие для Akamai и для мира. В свет выходят Звездные войны. Эпизод 1: Скрытая угроза. Да ещё и онлайн. «Онлайн» в конце 20 века до появления ютуба значило «Вы можете скачать файл в формате Real Video, QuickTime или AVI и посмотреть на своем ПК». Официальный и эксклюзивный дистрибьютор — apple.com. Собственно, apple.com практически сразу же падает и продолжает лежать недоступным на протяжении половины дня. Но сеть Akamai, которая уже успешно справилась с раздачей более миллиона копий трейлера звездных войн за сутки, продолжает жить. PR скандала не случилось.
01 апреля 1999 года Стив Джобс решает лично позвонить одному из сооснователей компании Paul Segan, но тот принимает звоном за первоапрельскую шутку своих коллег и кладет трубку. На сотрудничество компаний этот инцидент не повлиял.
11 сентября 2001 года трагически погибает один из основателей Akamai и соавторов работы Daniel Lewin. Убит одним из террористов на борту самолёта American Airlines Flight 11, который врезался в первую, северную башню Всемирного торгового центра.
2001 год: консистентное хеширование начинает применяться в первых P2P сетях. В таких сетях нужно чтобы все узлы могли знать, где лежит какой файл. Первые версии, например Napster, хранили такую информацию централизовано, что позволяет легко отключить всю сеть при падении главного узла. Далее ко второму поколению, например сеть Gnutella, появилась идея раздавать такую информацию через broadcast. Это работало пока узлов в сети было мало. Наконец третье поколение P2P сетей, начиная с Chord, уже начали использовать консистентное хеширование. Преимуществом такого хеширования для P2P является то, что не обязательно знать о расположении всех остальных серверов в сети. Достаточно знать несколько, которые находятся рядом. Частично даже современный BitTorrent продолжает использовать consistent hashing.
2006 год: Амазон запускает пока недоступную для широкой общественности Dynamo, которая тоже использует консистентное хеширование для партиционирования и репликации. Цель — хранить максимум информации надежно на простом железе и быстро её раздавать. Это важная веха, так как Амазон через год также публикует вот эту работу (Dynamo: Amazon’s Highly Available Key-value Store).
В дальнейшем consistent hashing стал применяться и в Cassandra, и в Ryak, и в Couchbase, Akka, Gluster, и ещё в десятках других продуктах. Сейчас это одна из базовых структур данных / алгоритмов для построения сетей с частой сменой количества участников.
А теперь история. Двое из авторов работы Daniel Lewin и Frank Leighton — основатели Akamai Technologies. Компания делает CDN и security решения. Это Cloudflare/Fastly в мире ентерпрайза. Через них проходит по разным оценкам до 30% всего трафика в мире. Работа датируется 1997 годом и говорит как раз о том, как эффективно раздавать страницы в Интернете. В 1998 году авторы попали в финал конкурса MIT $50к Entrepreneurship Competition (сейчас MIT $100k. Инфляция!), основав в этом же году компанию. Собственно на двух идеях из работы: Random Trees и Consistent hashing, и основана архитектура Akamai CDN.
31 марта 1999 года происходит знаменательное событие для Akamai и для мира. В свет выходят Звездные войны. Эпизод 1: Скрытая угроза. Да ещё и онлайн. «Онлайн» в конце 20 века до появления ютуба значило «Вы можете скачать файл в формате Real Video, QuickTime или AVI и посмотреть на своем ПК». Официальный и эксклюзивный дистрибьютор — apple.com. Собственно, apple.com практически сразу же падает и продолжает лежать недоступным на протяжении половины дня. Но сеть Akamai, которая уже успешно справилась с раздачей более миллиона копий трейлера звездных войн за сутки, продолжает жить. PR скандала не случилось.
01 апреля 1999 года Стив Джобс решает лично позвонить одному из сооснователей компании Paul Segan, но тот принимает звоном за первоапрельскую шутку своих коллег и кладет трубку. На сотрудничество компаний этот инцидент не повлиял.
11 сентября 2001 года трагически погибает один из основателей Akamai и соавторов работы Daniel Lewin. Убит одним из террористов на борту самолёта American Airlines Flight 11, который врезался в первую, северную башню Всемирного торгового центра.
2001 год: консистентное хеширование начинает применяться в первых P2P сетях. В таких сетях нужно чтобы все узлы могли знать, где лежит какой файл. Первые версии, например Napster, хранили такую информацию централизовано, что позволяет легко отключить всю сеть при падении главного узла. Далее ко второму поколению, например сеть Gnutella, появилась идея раздавать такую информацию через broadcast. Это работало пока узлов в сети было мало. Наконец третье поколение P2P сетей, начиная с Chord, уже начали использовать консистентное хеширование. Преимуществом такого хеширования для P2P является то, что не обязательно знать о расположении всех остальных серверов в сети. Достаточно знать несколько, которые находятся рядом. Частично даже современный BitTorrent продолжает использовать consistent hashing.
2006 год: Амазон запускает пока недоступную для широкой общественности Dynamo, которая тоже использует консистентное хеширование для партиционирования и репликации. Цель — хранить максимум информации надежно на простом железе и быстро её раздавать. Это важная веха, так как Амазон через год также публикует вот эту работу (Dynamo: Amazon’s Highly Available Key-value Store).
В дальнейшем consistent hashing стал применяться и в Cassandra, и в Ryak, и в Couchbase, Akka, Gluster, и ещё в десятках других продуктах. Сейчас это одна из базовых структур данных / алгоритмов для построения сетей с частой сменой количества участников.
🔥1
Когнитивные искажения (1/2)
Пока настаивается пост про gossip в продолжении этого, поговорим о когнитивных искажениях — устойчивых шаблонах поведения, свойственных для людей в определенных ситуациях. Мне вообще не очень нравится русскоязычный вариант термина, так как «искажение» как будто слово из области Матрицы или путешествий во времени. В английском варианте этот термин звучит как cognitive bias, где bias переводится как предвзятость или склонность. Склонность — не правило. Суть в том, что какая-то часть людей, оказавшись в конкретной ситуации, с большей вероятностью поведёт себя определенным образом. Именно на вас «искажение» может не действовать, но в целом тенденция прослеживается. И конечно никто не пытается объяснить все сложные механизмы человеческого мышления через пару примеров.
«Склонностей» в мире людей бесчисленное множество и мы с ними сталкиваемся каждый день. Рассмотреть их все точно не получится, поэтому я поговорю только о тех, с которыми сам пытаюсь бороться, но всё ещё не умеют. На вики есть замечательная инфографика по теме, кто захочет изучить подробнее или просто залипнуть. А ещё алфавитный список на английской вики.
Начнем с chois-supportive bias или искажения сделанного выбора. В IT постоянно приходится принимать какие-то решения. Они бывают глобальные: на каком языке писать, какое хранилище данных выбрать, кого из двух кандидатов нанять или более локальные, например какой из 3 видов синтаксиса выбрать, чтобы реализовать задачу. При принятии решений применяется разная аргумента от «вот тут дядька на медиуме написал» и пресловутого "best practice" до экспериментов и замеров. «Искажение» заключается в том, что после принятия решения, вся методология летит в трубу. Наш выбор начинает казаться более правильным по необъективным причинам, а вместе с тем, отвергнутый вариант становится менее интересным. Всякий раз, когда на вопрос «почему вы всё не сделали на технологии
Вносить изменения в процессы или технологии в IT вообще крайне тяжело. Мало того, что сделанный выбор кажется более верным, так ещё люди в принципе предпочитают оставить всё как есть. Это называется status quo bias. Под эту категорию попадают и допотопное легаси, которое никто не хочет трогать не потому что риски, а потому что так сложилось. И бесконечные алгоритмы на собеседованиях (хотя я пытался их рационализировать). И что самое плохое, процессы в IT. Вам кажется что скрам не работает и ежедневные созвоны не нужны? Попробуйте доказать это ближайшему менеджеру.
Пока настаивается пост про gossip в продолжении этого, поговорим о когнитивных искажениях — устойчивых шаблонах поведения, свойственных для людей в определенных ситуациях. Мне вообще не очень нравится русскоязычный вариант термина, так как «искажение» как будто слово из области Матрицы или путешествий во времени. В английском варианте этот термин звучит как cognitive bias, где bias переводится как предвзятость или склонность. Склонность — не правило. Суть в том, что какая-то часть людей, оказавшись в конкретной ситуации, с большей вероятностью поведёт себя определенным образом. Именно на вас «искажение» может не действовать, но в целом тенденция прослеживается. И конечно никто не пытается объяснить все сложные механизмы человеческого мышления через пару примеров.
«Склонностей» в мире людей бесчисленное множество и мы с ними сталкиваемся каждый день. Рассмотреть их все точно не получится, поэтому я поговорю только о тех, с которыми сам пытаюсь бороться, но всё ещё не умеют. На вики есть замечательная инфографика по теме, кто захочет изучить подробнее или просто залипнуть. А ещё алфавитный список на английской вики.
Начнем с chois-supportive bias или искажения сделанного выбора. В IT постоянно приходится принимать какие-то решения. Они бывают глобальные: на каком языке писать, какое хранилище данных выбрать, кого из двух кандидатов нанять или более локальные, например какой из 3 видов синтаксиса выбрать, чтобы реализовать задачу. При принятии решений применяется разная аргумента от «вот тут дядька на медиуме написал» и пресловутого "best practice" до экспериментов и замеров. «Искажение» заключается в том, что после принятия решения, вся методология летит в трубу. Наш выбор начинает казаться более правильным по необъективным причинам, а вместе с тем, отвергнутый вариант становится менее интересным. Всякий раз, когда на вопрос «почему вы всё не сделали на технологии
B, вместо A?» вам хочется поднять голос на человека, остановитесь и задумайтесь, а почему, собственно, не сделали? Если ваш выбор A > B основывался на фактах, то они скорее всего всё ещё верны. Если не основывался, а покричать хочется, то вы столкнулись с искажением. Вам хочется защитить ваш вариант, потому что он ваш, а не потому что он объективно верный. Вносить изменения в процессы или технологии в IT вообще крайне тяжело. Мало того, что сделанный выбор кажется более верным, так ещё люди в принципе предпочитают оставить всё как есть. Это называется status quo bias. Под эту категорию попадают и допотопное легаси, которое никто не хочет трогать не потому что риски, а потому что так сложилось. И бесконечные алгоритмы на собеседованиях (хотя я пытался их рационализировать). И что самое плохое, процессы в IT. Вам кажется что скрам не работает и ежедневные созвоны не нужны? Попробуйте доказать это ближайшему менеджеру.
🔥1
Когнитивные искажения (2/2)
Следующий на очереди у нас selection bias или ошибка отбора. Она заключается в неправильно собранной выборке при измерении статистической величины. Например, если вы в новостях услышали про одного-двух людей, которые заразились коронавирусом после прививки, из-за этого нельзя делать вывод что прививки не работают. Если у ваших друзей сработало решение
Перейдём к спонсору одновременно и токсичных комьюнити, и синдрома самозванца, а именно к ошибке атрибуции или attribution bias. Её суть заключается в том, что некоторым людям при рационализации успехов или неудач других людей более свойственно приписывать эти успехи/неудачи внутренним характеристикам индивида, а не сложившимся обстоятельствам. Почему ваш джун сломал приложение в проде? «Потому что он глупый» — ответ неверный. Любая ситуация состоит из суммы человека и условий, в которых он находится. Стресс, отсутствие понятных инструкций, незащищенная от человеческих ошибок среда — всё это не менее, а скорее более важно, чем интеллектуальные способности конкретно взятого индивида.
Здесь же синдром самозванца. Некоторым людям свойственно занижать свои способности на фоне других людей. Во многом это происходит, потому что успех других воспринимается как следствие их героического характера, силы воли или поля искажения реальности. Ошибка атрибуции заключается в полном игнорировании состояния реальности, которая также имеет влияние на успех или неудачу. Каждая мелочь в многогранном мире, начиная от количества родительской заботы в детстве, заканчивая макроэномической ситуации, влияет на успешность. Исключительных людей, гениев, которые и вправду имеют врожденные способности, единицы по сравнению с остальными.
Напоследок, «утро вечера мудренее» или эффект недавнего, он же recency bias. Из-за этого «искажения», более ранние события или информация воспринимаются как более важные. После долгой и нудной ручной работы всегда хочется потратить дни на её автоматизацию, хотя возможно ручную работу нужно делать раз в год и это нецелесообразно. Или любимый мной процесс ретроспективы. Как много раз вам приходилось придумывать пункты для ретро прямо во время этого ретро? При таком подходе, вы непроизвольно будете считать за более важные самые недавние события. Кстати, если до этого вы не слышали про когнитивные искажения и завтра же попробуйте списать все проблемы на них, это тоже будет проявлением эффекта недавнего.
Следующий на очереди у нас selection bias или ошибка отбора. Она заключается в неправильно собранной выборке при измерении статистической величины. Например, если вы в новостях услышали про одного-двух людей, которые заразились коронавирусом после прививки, из-за этого нельзя делать вывод что прививки не работают. Если у ваших друзей сработало решение
A, из этого не следует, что вам нужно его повторять. Возможно, стоит найти более репрезентативную выборку. Разновидностью ошибки отбора является ошибка выжившего или survival bias. Люди в интернетах сплошь и рядом рассказывают об успехах, но практически никто не говорит о неудачах. Это создаёт ложную уверенность, поскольку голоса тех, у кого не получилось или тех, кто «не выжил», не попадают в выборку.Перейдём к спонсору одновременно и токсичных комьюнити, и синдрома самозванца, а именно к ошибке атрибуции или attribution bias. Её суть заключается в том, что некоторым людям при рационализации успехов или неудач других людей более свойственно приписывать эти успехи/неудачи внутренним характеристикам индивида, а не сложившимся обстоятельствам. Почему ваш джун сломал приложение в проде? «Потому что он глупый» — ответ неверный. Любая ситуация состоит из суммы человека и условий, в которых он находится. Стресс, отсутствие понятных инструкций, незащищенная от человеческих ошибок среда — всё это не менее, а скорее более важно, чем интеллектуальные способности конкретно взятого индивида.
Здесь же синдром самозванца. Некоторым людям свойственно занижать свои способности на фоне других людей. Во многом это происходит, потому что успех других воспринимается как следствие их героического характера, силы воли или поля искажения реальности. Ошибка атрибуции заключается в полном игнорировании состояния реальности, которая также имеет влияние на успех или неудачу. Каждая мелочь в многогранном мире, начиная от количества родительской заботы в детстве, заканчивая макроэномической ситуации, влияет на успешность. Исключительных людей, гениев, которые и вправду имеют врожденные способности, единицы по сравнению с остальными.
Напоследок, «утро вечера мудренее» или эффект недавнего, он же recency bias. Из-за этого «искажения», более ранние события или информация воспринимаются как более важные. После долгой и нудной ручной работы всегда хочется потратить дни на её автоматизацию, хотя возможно ручную работу нужно делать раз в год и это нецелесообразно. Или любимый мной процесс ретроспективы. Как много раз вам приходилось придумывать пункты для ретро прямо во время этого ретро? При таком подходе, вы непроизвольно будете считать за более важные самые недавние события. Кстати, если до этого вы не слышали про когнитивные искажения и завтра же попробуйте списать все проблемы на них, это тоже будет проявлением эффекта недавнего.
🔥1
Введение в семейство алгоритмов Gossip (1/4)
#shark_whitepaper
Gossip — ещё одно слово, часто встречающиеся в литературе и бложиках на медиуме, которое скрывает за собой бесконечные пласты статей разных умных дядек. В качестве знакомства, я осилил четыре из них, но расскажу о трёх, а по четвертой пройдусь вскользь, так как она оказалась супер специфичной. Исторически, gossip появился из дремучей работы 1987 году про эпидемические алгоритмы, о которой я писал тут. Информация оттуда не нужна, чтобы понять этот пост, но может быть интересно. Пост из четырёх частей, так что устраивайтесь поудобнее. В первой введение, затем описание самого протокола на псевдокоде, далее работа gossip в очень больших сетях и в завершении, практические применения и проблемы.
Семейство протоколов gossip — это специфичный набор алгоритмов по обмену данными в сети узлов. Идея в следующем: пусть каждый узел раз в промежуток времени находит один из случайных соседних узлов и направляет ему некоторое сообщение. Так делает каждый узел, который уже получил обновления. Когда все узлы направили сообщение, завершается первый раунд обмена. Раунды проходят до тех пор, пока обновление «не потеряет актуальность». Сообщения содержат не только полезные данные, но и информацию о сети, которой обладает узел. Если проще — каждая нода направляет список соседей, о которых знает она сама. Если долго передавать такую информацию, рано или поздно все ноды сети будут знать о существовании всех узлов. Удобно. В некоторых вариантах gossip информация о других нодах сети — это и есть вся полезная нагрузка.
Киллер фича алгоритмов именно в случайном выборе соседней ноды. Именно случайность позволят gossip алгоритму работать даже при отказах значительной части сети. Почему используется слово «протокол», а не «алгоритм» определить сложно. Возможно это связано с тем, что исторически gossip использовался как низкоуровневый подход для обнаружения топологий в огромных сетях. Сетевики вообще любят всё вокруг называть протоколами.
Семейство gossip это десятки вариаций очень похожих алгоритмов, поэтому разумно выделить их общие характеристики:
- Периодический, попарной обмен данными между узлами сети.
- При обмене данных передаётся небольшое количество информации. Gossip протокол в идеальном мире не должен съедать всю пропускную способность сети.
- Обмен данными происходит редко. «Редко» в данном случае значит сильно реже чем средние задержки (latency) в сети. Идеальный gossip не создаёт значимой нагрузки на сеть узлов. Это позволяет использовать gossip, как дополнение к другим алгоритмам обмена данными.
- Надежный канал связи не требуется. Более того, новые узлы могут вступать в сеть даже во время работы алгоритма.
- При взаимодействии между узлами A и B, либо один из них, либо оба сразу меняют своё состояние. Кинуть пинг другому узлу это ещё не gossip.
- Соседние ноды выбираются случайным образом. В идеальном мире с равномерно распределенной вероятностью. В реальности правда достичь её всё равно не удастся, об этом тоже ниже.
- Время распространения обновления по всем узлам сопоставимо с O(log(n)).
Обмен данными между случайными нодами приводит к тому, что gossip протоколы дают только вероятностью консистентность. Здесь речь идёт не столько о вероятности того, что система перейдёт в консистентное состояния, сколько о времени, когда это произойдет — большинство вариаций практически гарантированно смогут распространить данные по сети когда-нибудь. В случае с gossip консистентность можно объяснить фразой на подобии «с вероятностью 99%, через 30 раундов каждая нода в сети получит обновления». Так сказать, how eventual is eventually consistent?
#shark_whitepaper
Gossip — ещё одно слово, часто встречающиеся в литературе и бложиках на медиуме, которое скрывает за собой бесконечные пласты статей разных умных дядек. В качестве знакомства, я осилил четыре из них, но расскажу о трёх, а по четвертой пройдусь вскользь, так как она оказалась супер специфичной. Исторически, gossip появился из дремучей работы 1987 году про эпидемические алгоритмы, о которой я писал тут. Информация оттуда не нужна, чтобы понять этот пост, но может быть интересно. Пост из четырёх частей, так что устраивайтесь поудобнее. В первой введение, затем описание самого протокола на псевдокоде, далее работа gossip в очень больших сетях и в завершении, практические применения и проблемы.
Семейство протоколов gossip — это специфичный набор алгоритмов по обмену данными в сети узлов. Идея в следующем: пусть каждый узел раз в промежуток времени находит один из случайных соседних узлов и направляет ему некоторое сообщение. Так делает каждый узел, который уже получил обновления. Когда все узлы направили сообщение, завершается первый раунд обмена. Раунды проходят до тех пор, пока обновление «не потеряет актуальность». Сообщения содержат не только полезные данные, но и информацию о сети, которой обладает узел. Если проще — каждая нода направляет список соседей, о которых знает она сама. Если долго передавать такую информацию, рано или поздно все ноды сети будут знать о существовании всех узлов. Удобно. В некоторых вариантах gossip информация о других нодах сети — это и есть вся полезная нагрузка.
Киллер фича алгоритмов именно в случайном выборе соседней ноды. Именно случайность позволят gossip алгоритму работать даже при отказах значительной части сети. Почему используется слово «протокол», а не «алгоритм» определить сложно. Возможно это связано с тем, что исторически gossip использовался как низкоуровневый подход для обнаружения топологий в огромных сетях. Сетевики вообще любят всё вокруг называть протоколами.
Семейство gossip это десятки вариаций очень похожих алгоритмов, поэтому разумно выделить их общие характеристики:
- Периодический, попарной обмен данными между узлами сети.
- При обмене данных передаётся небольшое количество информации. Gossip протокол в идеальном мире не должен съедать всю пропускную способность сети.
- Обмен данными происходит редко. «Редко» в данном случае значит сильно реже чем средние задержки (latency) в сети. Идеальный gossip не создаёт значимой нагрузки на сеть узлов. Это позволяет использовать gossip, как дополнение к другим алгоритмам обмена данными.
- Надежный канал связи не требуется. Более того, новые узлы могут вступать в сеть даже во время работы алгоритма.
- При взаимодействии между узлами A и B, либо один из них, либо оба сразу меняют своё состояние. Кинуть пинг другому узлу это ещё не gossip.
- Соседние ноды выбираются случайным образом. В идеальном мире с равномерно распределенной вероятностью. В реальности правда достичь её всё равно не удастся, об этом тоже ниже.
- Время распространения обновления по всем узлам сопоставимо с O(log(n)).
Обмен данными между случайными нодами приводит к тому, что gossip протоколы дают только вероятностью консистентность. Здесь речь идёт не столько о вероятности того, что система перейдёт в консистентное состояния, сколько о времени, когда это произойдет — большинство вариаций практически гарантированно смогут распространить данные по сети когда-нибудь. В случае с gossip консистентность можно объяснить фразой на подобии «с вероятностью 99%, через 30 раундов каждая нода в сети получит обновления». Так сказать, how eventual is eventually consistent?
🔥1
Введение в семейство алгоритмов Gossip (2/4)
Gossip — это не только удивительно полезные, но и достаточно простые алгоритмы. Каждая нода в сети может исполнять один и тот же код обмена, состоящий из двух тредов: активный занимается отправкой данных узлам сети, а пассивный их обработкой.
Работать алгоритмы могут не только в
Шаг «обработать сообщения» может включать много разных действий. Например, алгоритм обычно следит за тем, получал ли он уже одно и тоже обновление и сколько раз, а также как далеко (далеко в количество прыжков, например) находятся узлы, от которых или к котором прилетают сообщения.
Напомню, что ноды обмениваются информацией только о тех соседях, о которых они знают. Сложности наступают, когда количество узлов в сети начинает переваливать за пару тысяч. Во-первых, с таким количеством нод, передать информацию о всех соседях становится решительно невозможным — слишком много данных в одном сообщении. Во-вторых, в большой сети постоянно отваливаются и появляются новые узлы, их как-то тоже нужно включать в алгоритм. В-третьих, топология становится достаточно сложной, чтобы в один прыжок нельзя было добраться до любого соседа. Соответственно появляется выбор: отправить ближайшему соседу, так как это близко или всё равно пытаться переслать сообщение подальше. Всё это приводит к тому, что равномерно распределенный выбора случайного соседа перестаёт быть равномерным.
Gossip — это не только удивительно полезные, но и достаточно простые алгоритмы. Каждая нода в сети может исполнять один и тот же код обмена, состоящий из двух тредов: активный занимается отправкой данных узлам сети, а пассивный их обработкой.
Работать алгоритмы могут не только в
push режиме, когда ноды направляют свои сообщения соседям, но также и в pull, когда узлы наоборот «затягивают» сообщения от соседей. Может быть также и pull-push модель, когда один узёл делает и то, и другое. Очень упрощенно, алгоритм выглядит так:
Активный тред:
1. Выбрать соседний узел
2. Если push
2.1. выбрать сообщения для отправки
2.2. направить в выбранный узел
3. Если pull
3.1. получить сообщения от узла
3.2. обработать сообщения
Пассивный тред:
1. Получить сообщение
2. Если pull
2.1. выбрать сообщения для отправки
2.2. направить в выбранный узел
3. обработать сообщения.
Шаг «обработать сообщения» может включать много разных действий. Например, алгоритм обычно следит за тем, получал ли он уже одно и тоже обновление и сколько раз, а также как далеко (далеко в количество прыжков, например) находятся узлы, от которых или к котором прилетают сообщения.
Напомню, что ноды обмениваются информацией только о тех соседях, о которых они знают. Сложности наступают, когда количество узлов в сети начинает переваливать за пару тысяч. Во-первых, с таким количеством нод, передать информацию о всех соседях становится решительно невозможным — слишком много данных в одном сообщении. Во-вторых, в большой сети постоянно отваливаются и появляются новые узлы, их как-то тоже нужно включать в алгоритм. В-третьих, топология становится достаточно сложной, чтобы в один прыжок нельзя было добраться до любого соседа. Соответственно появляется выбор: отправить ближайшему соседу, так как это близко или всё равно пытаться переслать сообщение подальше. Всё это приводит к тому, что равномерно распределенный выбора случайного соседа перестаёт быть равномерным.
🔥1
Введение в семейство алгоритмов Gossip (3/4)
Для решения всех этих проблем часто используется абстракция под названием peer sampling service. Идея такая: давайте хранить только некое число
Более формально, с peer sampling service алгоритмы gossip разделяются по трём параметрам.
1. Peer selection. Периодически узел берёт из своего списка
--- rand. Выбор случайного узла.
--- head. Выбор самого близкого узла.
--- tail. Выбор самого дальнего узла.
2. View selection. После обмена информацией о соседях, на узле находятся два списка соседей. Один, который был на узле изначально, и второй, пришедший от соседа. Их нужно соединить, учитывая ограничение в
--- rand. Общий список
--- head. Списки объединяются, а затем остаются только
--- tail. Списки объединятся, а затем остаются только
3. View propagation. Определяет алгоритм, которым обмениваются узлы обмениваются информацией. Об этом уже было выше. Есть 3 способа:
--- push. Узел направляет свое состояние соседям.
--- pull. Узел забирает состояние от соседей.
--- push-pull. Объединение двух способов. Например сначала направляет, потом забирает.
Таким образом, работу peer sampling service можно описать кортежем из трёх элементов (ps, vs, vp). Разумеется можно придумать и другие, гибридные алгоритмы для ps и vs, например, но пока нам хватит самых простых. Реальные алгоритмы это к примеру (head, tail, push-pull) или (rand, rand, push).
Тут встаёт логичный вопрос, какой из 27 вариантов самый лучший? Как обычно, самого лучшего во всех ситуациях нет, всё трейдофф и мы обречены на несовершенные решения. Но отдельно взятые сочетания всё-таки выделяются перед другими.
Больше половины алгоритмов можно отбросить сразу, поскольку они стабильно приводят к нежелательным ситуациям:
- (head, *, *). Если выбирать для отправки только ближайшие ноды, в сети узлов будут образовываться кластеры. Это нежелательно, так как кластеры нод менее устойчивы к разделению. К тому же любые не-случайные топологии ухудшают вероятностные гарантии gossip.
- (*, tail, *). Если при отбрасывании нод из списка соседей всегда оставлять только самые дальние, новые ноды попросту не смогут стать частью топологии. Я очень долго думал, почему это так, но всё-таки дошло. Понадобилось всего 2 страницы рисования картинок...
- (*, *, pull). Проблема с этими вариантами очень похожа на первый, но немного по-другому. Модель pull приводит к образованию звездообразных топологий. Такая же проблема с гарантиями, как в первом пункте.
Из хороших алгоритмом можно выделить следующие:
- (*, *, push) хуже со сходимостью, чем у аналогов, но push протоколы лучше всего восстанавливаются при массовых отказах сети. При чём для ненормального математика отказ — это сразу -50% нод или больше. Кстати, процент узлов, при отключении которого практически гарантировано произойдёт разделение сети, ведёт себя в случае со случайными алгоритмами как percolation threshold. Больше математики!
- (*, *, pushpull) в среднем лучше по всем показателям, кроме восстановления при отказах.
- (rand, head, *) создают полное покрытие быстрее и равномернее, чем аналоги. Сеть, построенная такие алгоритмом, сложнее всего располовинить.
- (tail, *, *) немного больше случайности и немного медленнее сходимость чем другие. Но с tail надо быть осторожным, так как например (tail, rand, push) медленно увеличивает количество мёртвых нод, потому что рано или поздно в списке соседей остаются только самые дальние ноды.
Для решения всех этих проблем часто используется абстракция под названием peer sampling service. Идея такая: давайте хранить только некое число
c «соседних узлов». Тогда при получении нового сообщения со списком узлов, нужно проводить некую агрегацию двух состояний — того, которое есть на ноде приёмнике и того, которое пришло с ноды передатчика. Наличия ограничения в c также значит, что фраза «отправить случайно ноде» меняет свой смысла. Случайных всего c и из них нужно выбрать какую-то из нод.Более формально, с peer sampling service алгоритмы gossip разделяются по трём параметрам.
1. Peer selection. Периодически узел берёт из своего списка
c одного соседа, с которым он обменяется состоянием. Можно выделить 3 основные способа, как это делается:--- rand. Выбор случайного узла.
--- head. Выбор самого близкого узла.
--- tail. Выбор самого дальнего узла.
2. View selection. После обмена информацией о соседях, на узле находятся два списка соседей. Один, который был на узле изначально, и второй, пришедший от соседа. Их нужно соединить, учитывая ограничение в
c соседей. Делается это тоже одним из трёх способов:--- rand. Общий список
c соседей формируется из произвольных узлов.--- head. Списки объединяются, а затем остаются только
c самых близких к текущему узлу соседей.--- tail. Списки объединятся, а затем остаются только
c самых дальних от текущего узла соседа.3. View propagation. Определяет алгоритм, которым обмениваются узлы обмениваются информацией. Об этом уже было выше. Есть 3 способа:
--- push. Узел направляет свое состояние соседям.
--- pull. Узел забирает состояние от соседей.
--- push-pull. Объединение двух способов. Например сначала направляет, потом забирает.
Таким образом, работу peer sampling service можно описать кортежем из трёх элементов (ps, vs, vp). Разумеется можно придумать и другие, гибридные алгоритмы для ps и vs, например, но пока нам хватит самых простых. Реальные алгоритмы это к примеру (head, tail, push-pull) или (rand, rand, push).
Тут встаёт логичный вопрос, какой из 27 вариантов самый лучший? Как обычно, самого лучшего во всех ситуациях нет, всё трейдофф и мы обречены на несовершенные решения. Но отдельно взятые сочетания всё-таки выделяются перед другими.
Больше половины алгоритмов можно отбросить сразу, поскольку они стабильно приводят к нежелательным ситуациям:
- (head, *, *). Если выбирать для отправки только ближайшие ноды, в сети узлов будут образовываться кластеры. Это нежелательно, так как кластеры нод менее устойчивы к разделению. К тому же любые не-случайные топологии ухудшают вероятностные гарантии gossip.
- (*, tail, *). Если при отбрасывании нод из списка соседей всегда оставлять только самые дальние, новые ноды попросту не смогут стать частью топологии. Я очень долго думал, почему это так, но всё-таки дошло. Понадобилось всего 2 страницы рисования картинок...
- (*, *, pull). Проблема с этими вариантами очень похожа на первый, но немного по-другому. Модель pull приводит к образованию звездообразных топологий. Такая же проблема с гарантиями, как в первом пункте.
Из хороших алгоритмом можно выделить следующие:
- (*, *, push) хуже со сходимостью, чем у аналогов, но push протоколы лучше всего восстанавливаются при массовых отказах сети. При чём для ненормального математика отказ — это сразу -50% нод или больше. Кстати, процент узлов, при отключении которого практически гарантировано произойдёт разделение сети, ведёт себя в случае со случайными алгоритмами как percolation threshold. Больше математики!
- (*, *, pushpull) в среднем лучше по всем показателям, кроме восстановления при отказах.
- (rand, head, *) создают полное покрытие быстрее и равномернее, чем аналоги. Сеть, построенная такие алгоритмом, сложнее всего располовинить.
- (tail, *, *) немного больше случайности и немного медленнее сходимость чем другие. Но с tail надо быть осторожным, так как например (tail, rand, push) медленно увеличивает количество мёртвых нод, потому что рано или поздно в списке соседей остаются только самые дальние ноды.
🔥1
Введение в семейство алгоритмов Gossip (4/4)
Кажется осталось только поговорить о самом главном... Где, собственно, gossip используется, а где лучше не стоит. Для начала практические применения:
- Распространение обновления данных по сети (data dissemination). Самое банальное и логичное применение. Ещё когда слова gossip не было, эпидемические алгоритмы использовались как раз для распространения данных.
- Создание топологий. Один из интересных подходов — сначала построить по сети случайное дерево, и пускать обновления уже по нему. Наличие фиксированной структуры резко увеличивает скорость сходимости, так как алгоритм фактически может стать детерминированным, вместо вероятностного. В некоторых сетях важно просто иметь более-менее актуальную информацию о топологии, например в сети маломощных устройств, коммуницирующих через какой-нибудь wifi. Для слабых устройств gossip очень хорошо подходит ещё и из-за малого размера сообщений и нагрузок на сеть.
- Мониторинг доступности. Gossip можно использовать для пресловутого failure detection. Вообще мониторинг доступности в распределенных системах — это большая тема, в которой не всё так однозначно. Отложим её до одного из следующих циклов.
- Подсчёт агрегатов. Внезапно, gossip подходит и для поиска сумм, средних и прочих агрегатов. Работает это за счёт немного хитрых алгоритмов и передаваемой в сообщении полезной нагрузки. Снизу приложу статью почитать поподробнее.
- Resource allocation. Gossip можно применять, чтобы отсортировать всё узлы в большой сети по некоторому показателю (например cpu, memory, network). Такая сортировка подходит для решения задачи: «как разделить X задач по Y машинам, чтобы всем хватило ресурсов»
Но не все так гладко. Поскольку gossip «медленно и верно» докатывается до сходимости, есть ситуации, в которых следует подумать о целесообразности его использования:
⁃ Большое количество изменений, каждое из которых распространяется по протоколу. Всё дело в том, что полное распространение происходит за O(log(n)). Если в системе живут одновременно несколько событий, они и распространяются одновременно. Либо сразу все вместе. В первом случае, это много трафика, во втором, сообщения большого размера. И то, и другое — вещи, которых gossip пытается избежать.
⁃ Не подходит для быстрой синхронизации данных, так как сама суть gossip в том, что раунды происходят редко, по сравнению со временем сетевых задержек.
⁃ Любые гарантии в gossip имеют вероятностный характер. Иногда таких гарантий может быть недостаточно, особенно когда важна производительность высоких процентилей задержек.
⁃ Мало информации о том, как gossip работает в системе, предполагающей Byzantine fault. Всё-таки это система, основанная на том, что соседние ноды не пытаются вредить.
⁃ В маленьких сетях с редкой сменой количества участников броадкаст/алгоритмы консенсуса могут работать и быстрее, и эффективнее.
⁃ Если gossip используется в качестве механизма уменьшения энтропии, нужно всегда отдавать себе отчёт, почему энтропия возникла. Бороться нужно с причиной, а не следствием. Gossip подходит как механизм для обхода редких отказов детерминированного алгоритма. Как магическая пуля для исправления любых отказов даже он не справиться.
Источники:
- Про плюсы и минусы: Birman, Ken. 2007. "The promise, and limitations, of gossip protocols"
- Про peer sampling service: Mark Jelasity, Rachid Guerraoui, Anne-Marie Kermarrec, and Maarten van Steen. "The Peer Sampling Service: Experimental Evaluation of Unstructured Gossip-Based Implementations".
- Где используется gossip: Kermarrec, Anne-Marie, and Maarten van Steen. "Gossiping in distributed systems."
- Про агрегаты на gossip: David Kempe, Alin Dobra, and Johannes Gehrke. "Gossip-Based Computation of Aggregate Information."
Кажется осталось только поговорить о самом главном... Где, собственно, gossip используется, а где лучше не стоит. Для начала практические применения:
- Распространение обновления данных по сети (data dissemination). Самое банальное и логичное применение. Ещё когда слова gossip не было, эпидемические алгоритмы использовались как раз для распространения данных.
- Создание топологий. Один из интересных подходов — сначала построить по сети случайное дерево, и пускать обновления уже по нему. Наличие фиксированной структуры резко увеличивает скорость сходимости, так как алгоритм фактически может стать детерминированным, вместо вероятностного. В некоторых сетях важно просто иметь более-менее актуальную информацию о топологии, например в сети маломощных устройств, коммуницирующих через какой-нибудь wifi. Для слабых устройств gossip очень хорошо подходит ещё и из-за малого размера сообщений и нагрузок на сеть.
- Мониторинг доступности. Gossip можно использовать для пресловутого failure detection. Вообще мониторинг доступности в распределенных системах — это большая тема, в которой не всё так однозначно. Отложим её до одного из следующих циклов.
- Подсчёт агрегатов. Внезапно, gossip подходит и для поиска сумм, средних и прочих агрегатов. Работает это за счёт немного хитрых алгоритмов и передаваемой в сообщении полезной нагрузки. Снизу приложу статью почитать поподробнее.
- Resource allocation. Gossip можно применять, чтобы отсортировать всё узлы в большой сети по некоторому показателю (например cpu, memory, network). Такая сортировка подходит для решения задачи: «как разделить X задач по Y машинам, чтобы всем хватило ресурсов»
Но не все так гладко. Поскольку gossip «медленно и верно» докатывается до сходимости, есть ситуации, в которых следует подумать о целесообразности его использования:
⁃ Большое количество изменений, каждое из которых распространяется по протоколу. Всё дело в том, что полное распространение происходит за O(log(n)). Если в системе живут одновременно несколько событий, они и распространяются одновременно. Либо сразу все вместе. В первом случае, это много трафика, во втором, сообщения большого размера. И то, и другое — вещи, которых gossip пытается избежать.
⁃ Не подходит для быстрой синхронизации данных, так как сама суть gossip в том, что раунды происходят редко, по сравнению со временем сетевых задержек.
⁃ Любые гарантии в gossip имеют вероятностный характер. Иногда таких гарантий может быть недостаточно, особенно когда важна производительность высоких процентилей задержек.
⁃ Мало информации о том, как gossip работает в системе, предполагающей Byzantine fault. Всё-таки это система, основанная на том, что соседние ноды не пытаются вредить.
⁃ В маленьких сетях с редкой сменой количества участников броадкаст/алгоритмы консенсуса могут работать и быстрее, и эффективнее.
⁃ Если gossip используется в качестве механизма уменьшения энтропии, нужно всегда отдавать себе отчёт, почему энтропия возникла. Бороться нужно с причиной, а не следствием. Gossip подходит как механизм для обхода редких отказов детерминированного алгоритма. Как магическая пуля для исправления любых отказов даже он не справиться.
Источники:
- Про плюсы и минусы: Birman, Ken. 2007. "The promise, and limitations, of gossip protocols"
- Про peer sampling service: Mark Jelasity, Rachid Guerraoui, Anne-Marie Kermarrec, and Maarten van Steen. "The Peer Sampling Service: Experimental Evaluation of Unstructured Gossip-Based Implementations".
- Где используется gossip: Kermarrec, Anne-Marie, and Maarten van Steen. "Gossiping in distributed systems."
- Про агрегаты на gossip: David Kempe, Alin Dobra, and Johannes Gehrke. "Gossip-Based Computation of Aggregate Information."
🔥2
Введение в семейство алгоритмов Gossip -> первый из четырёх постов
https://xn--r1a.website/shark_in_it/79
https://xn--r1a.website/shark_in_it/79
Telegram
Акула (в) IT
Введение в семейство алгоритмов Gossip (1/4)
#shark_whitepaper
Gossip — ещё одно слово, часто встречающиеся в литературе и бложиках на медиуме, которое скрывает за собой бесконечные пласты статей разных умных дядек. В качестве знакомства, я осилил четыре…
#shark_whitepaper
Gossip — ещё одно слово, часто встречающиеся в литературе и бложиках на медиуме, которое скрывает за собой бесконечные пласты статей разных умных дядек. В качестве знакомства, я осилил четыре…
🔥1
Впервые в жизни зарегистрировался на серьёзное мероприятие с кучей статей: https://www.hotstorage.org/2021/attend.html
Программа тут. Всё бесплатно, приходите тоже!
Ожидание: ничего не пойму.
Как минимум один пейпер будет не адово хардкорный. Почему важно измерять не только абсолютную производительность, но и эффективность на примере алгоритмов консенсуса. Краткое содержание есть в статье: http://charap.co/scalable-but-wasteful-or-why-fast-replication-protocols-are-actually-slow/
Программа тут. Всё бесплатно, приходите тоже!
Ожидание: ничего не пойму.
Как минимум один пейпер будет не адово хардкорный. Почему важно измерять не только абсолютную производительность, но и эффективность на примере алгоритмов консенсуса. Краткое содержание есть в статье: http://charap.co/scalable-but-wasteful-or-why-fast-replication-protocols-are-actually-slow/
www.hotstorage.org
HOTSTORAGE 2021
HOTSTORAGE'21: 13th ACM Workshop on Hot Topics in Storage and File Systems
🔥1
FoundationDB: A Distributed Unbundled Transactional Key Value Store
#shark_whitepaper
Пока я пытаюсь осилить ARIES, немного ненапряжного и очень свежего case-study от июня 2021 года. Работа про распределенное KV хранилище FoundationDB. Всех авторов перечислять не буду, так как это 21 человек. Оригинал можно почитать по первой ссылке здесь.
FoundationDB (FDB) была разработана более 10 лет назад, и с тех пор используется в Apple, как одно из основных хранилищ данных, а с 2017 года проект доступен на github. Это NewSQL хранилище, т.е. помимо гибкости и средств для масштабирование, свойственных NoSQL решениям, FDB также поддерживает транзакционность аж до strict serializability, но не без ограничений, конечно же.
Обычно базы данных предоставляют все свои компоненты в виде одного процесса. Т.е. условный инстанс postgres — это одновременно и транспортный слой, и оптимизатор запросов, и execution engine, и storage engine. FDB идёт другим путем, используя опыт современных cloud-first подходов к созданию хранилищ данных. Она основана на unbundled architecture, т.е. база данных — это не один процесс, а несколько взаимодействующих процессов, каждый из которых может быть запущен на отдельном сервере и масштабироваться независимо. Такой подход позволяет подстраивать БД под профиль нагрузки по чтению и записи.
FoundationDB позиционирует себя, как фундамент, поверх которого можно реализовать дополнительную логику. Например, на основе FDB работает и графовый движок JanusGraph, и record-layer — очень упрощенный вариант реляционной БД, и даже прямо сейчас происходят попытки перевести CouchDB на FDB.
FDB логически состоит из двух слоёв: управляющий слой (Control Plane) и слой данных (Data Plane). Слой данных дополнительно делится ещё на три компонента: Transaction System (TS), Log System (LS) и Storage System (SS).
При чтении, клиент запрашивает версию записи в TS, а потом идёт напрямую в Storage System. При записи, запрос попадает в TS, который обеспечивает транзакционность через сочетание optimistic concurrency control (OCC) и multi-version concurrent control (MVCC). Всё происходит lock-free прямо в памяти. Далее запрос записывается в Log System, где хранится Write-Ahead Log (WAL), после чего ответ возвращается клиенту. Обновления WAL затем агрессивно считываются компонентами Storage System. Сейчас SS представляет собой инстансы SQLite (а я думал она нигде не используется...), но в планах заменить их на RocksDB. Кстати период MVCC насильно установлен в пять секунд. По словам авторов, это заставляет клиентов больше думать над тем, как правильно составлять запросы, что в целом звучит как правильный путь для OLTP хранилищ. Скалировать много маленьких запросов проще, чем подстраиваться и под тяжёлые, и под легкие запросы одновременно.
Ещё одной особенностью FDB является процесс восстановления при сбоях, называемый реконфигурацией. Когда Control Plane обнаруживает ошибки в TS/LS или просто попытку развернуть новую версию БД, он просто останавливает старые инстансы и запускает новые. Весь процесс занимает до пяти секунд. Это позволяет использовать реконфигурацию как для обновлений, так и для восстановления при ошибках. Более того, настолько быстрый процесс восстановления — то что доктор прописал для нестабильной cloud-based среды.
И последняя убер фича FDB — это simulation фреймворк, который писался ещё до начала работы над самой БД. Дело в том, что тестировать базы данных довольно тяжело. Здесь часто не помогают просто «юнит-тесты», так как проверить, что база всегда выполняет свои гарантии консистентности или durability очень сложно. Количество кейсов практически неограниченно. Симуляционный фреймворк позволяет производить сотни запусков компонентов БД в минуту, вносить произвольные ошибки на разных уровнях (сеть, диски, запросы и т.д.) и проверять, работает ли FDB, как ожидается. Более того, неудачные запуски всегда можно переиграть, так как сам фреймворк детерминированный.
#shark_whitepaper
Пока я пытаюсь осилить ARIES, немного ненапряжного и очень свежего case-study от июня 2021 года. Работа про распределенное KV хранилище FoundationDB. Всех авторов перечислять не буду, так как это 21 человек. Оригинал можно почитать по первой ссылке здесь.
FoundationDB (FDB) была разработана более 10 лет назад, и с тех пор используется в Apple, как одно из основных хранилищ данных, а с 2017 года проект доступен на github. Это NewSQL хранилище, т.е. помимо гибкости и средств для масштабирование, свойственных NoSQL решениям, FDB также поддерживает транзакционность аж до strict serializability, но не без ограничений, конечно же.
Обычно базы данных предоставляют все свои компоненты в виде одного процесса. Т.е. условный инстанс postgres — это одновременно и транспортный слой, и оптимизатор запросов, и execution engine, и storage engine. FDB идёт другим путем, используя опыт современных cloud-first подходов к созданию хранилищ данных. Она основана на unbundled architecture, т.е. база данных — это не один процесс, а несколько взаимодействующих процессов, каждый из которых может быть запущен на отдельном сервере и масштабироваться независимо. Такой подход позволяет подстраивать БД под профиль нагрузки по чтению и записи.
FoundationDB позиционирует себя, как фундамент, поверх которого можно реализовать дополнительную логику. Например, на основе FDB работает и графовый движок JanusGraph, и record-layer — очень упрощенный вариант реляционной БД, и даже прямо сейчас происходят попытки перевести CouchDB на FDB.
FDB логически состоит из двух слоёв: управляющий слой (Control Plane) и слой данных (Data Plane). Слой данных дополнительно делится ещё на три компонента: Transaction System (TS), Log System (LS) и Storage System (SS).
При чтении, клиент запрашивает версию записи в TS, а потом идёт напрямую в Storage System. При записи, запрос попадает в TS, который обеспечивает транзакционность через сочетание optimistic concurrency control (OCC) и multi-version concurrent control (MVCC). Всё происходит lock-free прямо в памяти. Далее запрос записывается в Log System, где хранится Write-Ahead Log (WAL), после чего ответ возвращается клиенту. Обновления WAL затем агрессивно считываются компонентами Storage System. Сейчас SS представляет собой инстансы SQLite (а я думал она нигде не используется...), но в планах заменить их на RocksDB. Кстати период MVCC насильно установлен в пять секунд. По словам авторов, это заставляет клиентов больше думать над тем, как правильно составлять запросы, что в целом звучит как правильный путь для OLTP хранилищ. Скалировать много маленьких запросов проще, чем подстраиваться и под тяжёлые, и под легкие запросы одновременно.
Ещё одной особенностью FDB является процесс восстановления при сбоях, называемый реконфигурацией. Когда Control Plane обнаруживает ошибки в TS/LS или просто попытку развернуть новую версию БД, он просто останавливает старые инстансы и запускает новые. Весь процесс занимает до пяти секунд. Это позволяет использовать реконфигурацию как для обновлений, так и для восстановления при ошибках. Более того, настолько быстрый процесс восстановления — то что доктор прописал для нестабильной cloud-based среды.
И последняя убер фича FDB — это simulation фреймворк, который писался ещё до начала работы над самой БД. Дело в том, что тестировать базы данных довольно тяжело. Здесь часто не помогают просто «юнит-тесты», так как проверить, что база всегда выполняет свои гарантии консистентности или durability очень сложно. Количество кейсов практически неограниченно. Симуляционный фреймворк позволяет производить сотни запусков компонентов БД в минуту, вносить произвольные ошибки на разных уровнях (сеть, диски, запросы и т.д.) и проверять, работает ли FDB, как ожидается. Более того, неудачные запуски всегда можно переиграть, так как сам фреймворк детерминированный.
🔥1
Спасибо https://xn--r1a.website/lilfunctor за репост и привет всем новоприбывшим! Приятно проснуться знаменитым 😎 Небольшой пост про ожидания и что ещё почитать.
Я пытался, но в итоге отказался придерживаться какого-либо графика постов, поэтому контент появляется внезапно и в любой момент промежутка неделя - месяц от предыдущего. Обычно это разборы статей по распределенным системам / хранилищам, но бывает разное, в том числе и мысли вслух, и отзывы на книжки.
Дисклеймер: я не эксперт в распределённых системах. В обычной жизни я перекладываю XML'ки и реже JSON'ы на Java. Поэтому ничто здесь не является советом! Всегда рад любым уточнениям, исправлениям или дополнительному материалу. Велком в комментарии.
Из интересных постов, пока можно почитать что-нибудь из списка:
- История CAP теоремы. Гайд на 18к символов, как перестать называть БД AP/CP и начать жить.
- Эпидемические алгоритмы и их развитие — протокол/алгоритм Gossip. Госсипов сотни вариаций, здесь разбор основных идей.
- Алгоритм кэширования TinyLFU. Кеширование это не только «положить данные поближе». Иногда нужно знать, что класть.
- Немного токсичный пост про понятие Real-Time. Спойлер: «Быстро» != "Real Time"
Я пытался, но в итоге отказался придерживаться какого-либо графика постов, поэтому контент появляется внезапно и в любой момент промежутка неделя - месяц от предыдущего. Обычно это разборы статей по распределенным системам / хранилищам, но бывает разное, в том числе и мысли вслух, и отзывы на книжки.
Дисклеймер: я не эксперт в распределённых системах. В обычной жизни я перекладываю XML'ки и реже JSON'ы на Java. Поэтому ничто здесь не является советом! Всегда рад любым уточнениям, исправлениям или дополнительному материалу. Велком в комментарии.
Из интересных постов, пока можно почитать что-нибудь из списка:
- История CAP теоремы. Гайд на 18к символов, как перестать называть БД AP/CP и начать жить.
- Эпидемические алгоритмы и их развитие — протокол/алгоритм Gossip. Госсипов сотни вариаций, здесь разбор основных идей.
- Алгоритм кэширования TinyLFU. Кеширование это не только «положить данные поближе». Иногда нужно знать, что класть.
- Немного токсичный пост про понятие Real-Time. Спойлер: «Быстро» != "Real Time"
🔥1
Акула (в) IT pinned «Спасибо https://xn--r1a.website/lilfunctor за репост и привет всем новоприбывшим! Приятно проснуться знаменитым 😎 Небольшой пост про ожидания и что ещё почитать. Я пытался, но в итоге отказался придерживаться какого-либо графика постов, поэтому контент появляется внезапно…»
HotStorage 2021
Сходил я тут месяц недели назад на HotStorage 2021. Так сходил, что IT пузырь вокруг в очередной раз надорвался. В мире снова интересного сильно больше, чем можно выучить за одну жизнь. В первой части личный опыт о том, чем «конференции с пейперами» отличаются от обычных IT конференции, почему это безумно интересно, а также как их найти. Далее большая часть про то, как работают SSD. Это здоровенный кусок, поэтому с подборкой крутейших докладов с конфы я приду через несколько дней. Всё равно чтобы понять градус безумия нужно сначала прочитать про SSD.
Для начала программа и сами работы. Конференция в основном про новинки в области SDD и способов хранения. Удивительное отличие от обычных IT конференций — 10-15 минутные записи выступлений. Записи можно объяснить ковидом, но 10 минут на довольно сложные работы? Что ещё интереснее, за эти 10 минут в принципе удаётся что-то понять.
Вторая удивительная вещь. Представленные работы это не теоретический бред магов в башнях из слоновой кости, которые JSON в своей жизни не видели, а совершенно наоборот. Чуть ли не главный вопрос после любой работы — что там с использованием / adoption фичей и технологий, так как у SSD с этим проблемы.
SSD — технология молодая, развивается стремительно, но индустрия софта подстраивается под эти новинки за пару тройку лет, а за это время появляется уже что-нибудь новенькое и нужно подстраиваться заново. Не помогает и тот факт, что в Software индустрии как-то принято пихать везде вариации "Computer As A Service" подхода, когда компьютер это какое-то количество процессоров, объём RAM и объём дисков, а не конкретные характеристики оборудования. SSD же наоборот сложная железяка, с которой нужен особый подход, но и прирост производительности от них можно получить на порядок, а то и больше.
Если всё ещё не убедил, то очень рекомендую посмотреть час кейноута (или полчаса на х2 скорости!). Это самый крутой кейноут, который я видел. Называется он I/O Acceleration from the Bottom Up, а рассказывает SVP storage в Samsung, а так же доктор CS Sangyeun Cho. Ссылка.
Топ 4 забавных факта с этого выступления:
- Количество памяти, которое можно впихнуть на 1 квадратный миллиметр SSD (Areal Density) растёт на 80% в год. Тренд продолжается последние 20 лет.
- Некоторые SSD настолько быстрые, что для них бутылочным горлышком выступает скорость PCI / SAS / SATA интерфейса.
- В 2017 году Samsung выпустил SSD на 16 TB под названием PM1633a. На момент выпуска это самый объёмный диск среди одновременно и SSD, и HDD в мире. Стоил в то время он дороже, чем слиток золота такой же массы.
- За счёт обработки данных ближе к SSD (Для гугления это называется Near-data processing) можно иногда получить х166 к скорости выполнения сложных join'ов на MariaDB. Подробнее о том как это работает в пейпере.
В целом, мне очень понравился формат, буду ходить ещё. На HotStorage 2021 я вышел через блог Aleksey Charapko, у которого там был пейпер в соавторстве. У него, кстати, есть еженедельная reading group, очень рекомендую, если интересно. Там часто выступают сами авторы работ, например как в работе про FoundationDB, о которой я писал тут. Можно просто читать, если ходить нет сил.
К сожалению, я не нашёл единый сайт со всеми конференциями такого рода, скажите, если знаете. Пока работает только магия твиттера, поскольку почти у всех конференций есть там профили. На кого подписаться: во-первых, профили ассоциаций-организаторов конференций USENIX и ACM как правило репостят что-то новенькое. Во-вторых, можно найти конкретные конференции, например тот же HotStorage или вот недавно прошёл ESEC/FSE.
Сходил я тут месяц недели назад на HotStorage 2021. Так сходил, что IT пузырь вокруг в очередной раз надорвался. В мире снова интересного сильно больше, чем можно выучить за одну жизнь. В первой части личный опыт о том, чем «конференции с пейперами» отличаются от обычных IT конференции, почему это безумно интересно, а также как их найти. Далее большая часть про то, как работают SSD. Это здоровенный кусок, поэтому с подборкой крутейших докладов с конфы я приду через несколько дней. Всё равно чтобы понять градус безумия нужно сначала прочитать про SSD.
Для начала программа и сами работы. Конференция в основном про новинки в области SDD и способов хранения. Удивительное отличие от обычных IT конференций — 10-15 минутные записи выступлений. Записи можно объяснить ковидом, но 10 минут на довольно сложные работы? Что ещё интереснее, за эти 10 минут в принципе удаётся что-то понять.
Вторая удивительная вещь. Представленные работы это не теоретический бред магов в башнях из слоновой кости, которые JSON в своей жизни не видели, а совершенно наоборот. Чуть ли не главный вопрос после любой работы — что там с использованием / adoption фичей и технологий, так как у SSD с этим проблемы.
SSD — технология молодая, развивается стремительно, но индустрия софта подстраивается под эти новинки за пару тройку лет, а за это время появляется уже что-нибудь новенькое и нужно подстраиваться заново. Не помогает и тот факт, что в Software индустрии как-то принято пихать везде вариации "Computer As A Service" подхода, когда компьютер это какое-то количество процессоров, объём RAM и объём дисков, а не конкретные характеристики оборудования. SSD же наоборот сложная железяка, с которой нужен особый подход, но и прирост производительности от них можно получить на порядок, а то и больше.
Если всё ещё не убедил, то очень рекомендую посмотреть час кейноута (или полчаса на х2 скорости!). Это самый крутой кейноут, который я видел. Называется он I/O Acceleration from the Bottom Up, а рассказывает SVP storage в Samsung, а так же доктор CS Sangyeun Cho. Ссылка.
Топ 4 забавных факта с этого выступления:
- Количество памяти, которое можно впихнуть на 1 квадратный миллиметр SSD (Areal Density) растёт на 80% в год. Тренд продолжается последние 20 лет.
- Некоторые SSD настолько быстрые, что для них бутылочным горлышком выступает скорость PCI / SAS / SATA интерфейса.
- В 2017 году Samsung выпустил SSD на 16 TB под названием PM1633a. На момент выпуска это самый объёмный диск среди одновременно и SSD, и HDD в мире. Стоил в то время он дороже, чем слиток золота такой же массы.
- За счёт обработки данных ближе к SSD (Для гугления это называется Near-data processing) можно иногда получить х166 к скорости выполнения сложных join'ов на MariaDB. Подробнее о том как это работает в пейпере.
В целом, мне очень понравился формат, буду ходить ещё. На HotStorage 2021 я вышел через блог Aleksey Charapko, у которого там был пейпер в соавторстве. У него, кстати, есть еженедельная reading group, очень рекомендую, если интересно. Там часто выступают сами авторы работ, например как в работе про FoundationDB, о которой я писал тут. Можно просто читать, если ходить нет сил.
К сожалению, я не нашёл единый сайт со всеми конференциями такого рода, скажите, если знаете. Пока работает только магия твиттера, поскольку почти у всех конференций есть там профили. На кого подписаться: во-первых, профили ассоциаций-организаторов конференций USENIX и ACM как правило репостят что-то новенькое. Во-вторых, можно найти конкретные конференции, например тот же HotStorage или вот недавно прошёл ESEC/FSE.
🔥1
Как работают SSD (1/3)
Структура SSD и особенности работы.
Теперь о том, как SSD в принципе работают. Здесь самое понятное «объяснение для программистов», которое я только находил. Если хочется посмотреть на более хардкорный материал про внутренности, то здесь есть ещё один очень хороший пост. Что первая ссылка, что вторая — посты из шести частей. В каждом огромное количество ссылок на работы и другие посты, читать не перечитать.
SSD состоят из нескольких компонентов. Само хранилище основано на flash-памяти, т.е. набора определенным образом соединенных транзисторов, которое можно программировать и стирать. «Программировать» в данном случае значит «записывать», но так уж устоялась терминология. По-английски это называется Program/Erase cycle или просто P/E цикл.
Биты памяти хранятся в ячейках, которые, собственно, состоят из транзисторов. Есть две схемы подключения транзисторов — NOR и NAND. Про отличия можно почитать тут, главное запомнить, что большая часть SSD в компьютерах и серверах построены по технологии NAND. Ячейки в NAND flash памяти не вечные, и их ресурс стремительно уменьшается с каждым P/E циклом, об этом будет ещё ниже.
Самый простой вид ячеек это SLC — Single level cell. Хранят 1 бит, очень быстрый доступ (latency), живут долго. Level здесь обозначает уровень зарядка. Здесь либо заряд есть, либо его нет.
Следующий тип это MLC — Multi level cell. "Multi-level" здесь говорит о том, что такая ячейка не просто хранит или не хранит заряд. Она может хранить один из «определенных уровней заряда». Условно — не заряжена, немного заряжена, средне заряжена, полностью заряжена. Таких определенных уровней может быть 4 — тогда можно представить 2 бита. А может быть 8 — тогда ячейка называется TLC — Triple-level cell и хранит она 3 бита.
Чем больше уровней, тем сложнее доступ к информации, т.е. растёт latency и уменьшается время жизни ячейки. При этом чем больше уровень, тем больший объём информации можно запихнуть в одно и тоже количество транзисторов, т.е. есть трейдофф. Либо быстрые, долговечные и малообъёмные SLC, либо медленные и менее долговечные, но зато большие MLC/TLC. Большая часть современных компьютеров и значительная часть серверов использует SSD с ячейками MLC/TLC. SLC применяются в ентрепрайзных серверах и стоят астрономические деньги.
Вне зависимости от типа ячейки, следующим уровнем иерархии является страница, состоящая из ячеек. Страницы бывают разного размера в разных моделях SSD от 2 КБ до 16 КБ. Несколько страниц объединяются в блок. В одном блоке как правило 128 или 256 страниц. Таким образом в зависимости от объёма страницы, объём блока будет как правило от 256 КБ до 4 МБ.
Иерархия
- Во-первых, считать или записать можно только страницу целиком. Надо вам прочитать 2 байта — читаете всю страницу на 16 КБ. Неприятно, но что делать.
- Во-вторых, удаление данных (E — erase в P/E цикле) происходит по-блочно. Нельзя удалить только одну страницу, только все 128/256 страниц в блоке целиком.
- В-третьих, страницы нельзя перезаписывать. Однажды записанная страница остаётся неизменной, пока блок (со всеми страница) не будем удалён. Отсюда, собственно и P/E цикл.
Структура SSD и особенности работы.
Теперь о том, как SSD в принципе работают. Здесь самое понятное «объяснение для программистов», которое я только находил. Если хочется посмотреть на более хардкорный материал про внутренности, то здесь есть ещё один очень хороший пост. Что первая ссылка, что вторая — посты из шести частей. В каждом огромное количество ссылок на работы и другие посты, читать не перечитать.
SSD состоят из нескольких компонентов. Само хранилище основано на flash-памяти, т.е. набора определенным образом соединенных транзисторов, которое можно программировать и стирать. «Программировать» в данном случае значит «записывать», но так уж устоялась терминология. По-английски это называется Program/Erase cycle или просто P/E цикл.
Биты памяти хранятся в ячейках, которые, собственно, состоят из транзисторов. Есть две схемы подключения транзисторов — NOR и NAND. Про отличия можно почитать тут, главное запомнить, что большая часть SSD в компьютерах и серверах построены по технологии NAND. Ячейки в NAND flash памяти не вечные, и их ресурс стремительно уменьшается с каждым P/E циклом, об этом будет ещё ниже.
Самый простой вид ячеек это SLC — Single level cell. Хранят 1 бит, очень быстрый доступ (latency), живут долго. Level здесь обозначает уровень зарядка. Здесь либо заряд есть, либо его нет.
Следующий тип это MLC — Multi level cell. "Multi-level" здесь говорит о том, что такая ячейка не просто хранит или не хранит заряд. Она может хранить один из «определенных уровней заряда». Условно — не заряжена, немного заряжена, средне заряжена, полностью заряжена. Таких определенных уровней может быть 4 — тогда можно представить 2 бита. А может быть 8 — тогда ячейка называется TLC — Triple-level cell и хранит она 3 бита.
Чем больше уровней, тем сложнее доступ к информации, т.е. растёт latency и уменьшается время жизни ячейки. При этом чем больше уровень, тем больший объём информации можно запихнуть в одно и тоже количество транзисторов, т.е. есть трейдофф. Либо быстрые, долговечные и малообъёмные SLC, либо медленные и менее долговечные, но зато большие MLC/TLC. Большая часть современных компьютеров и значительная часть серверов использует SSD с ячейками MLC/TLC. SLC применяются в ентрепрайзных серверах и стоят астрономические деньги.
Вне зависимости от типа ячейки, следующим уровнем иерархии является страница, состоящая из ячеек. Страницы бывают разного размера в разных моделях SSD от 2 КБ до 16 КБ. Несколько страниц объединяются в блок. В одном блоке как правило 128 или 256 страниц. Таким образом в зависимости от объёма страницы, объём блока будет как правило от 256 КБ до 4 МБ.
Иерархия
ячейка < страница < блок очень важна для SSD из-за фундаментальных особенностей их работы:- Во-первых, считать или записать можно только страницу целиком. Надо вам прочитать 2 байта — читаете всю страницу на 16 КБ. Неприятно, но что делать.
- Во-вторых, удаление данных (E — erase в P/E цикле) происходит по-блочно. Нельзя удалить только одну страницу, только все 128/256 страниц в блоке целиком.
- В-третьих, страницы нельзя перезаписывать. Однажды записанная страница остаётся неизменной, пока блок (со всеми страница) не будем удалён. Отсюда, собственно и P/E цикл.
🔥1
Как работают SSD (2/3)
Сборка мусора и не верь бенчмаркам своим.
Приведу пример. Пусть у вас есть крошечный SSD с двумя блоками, каждый из которых состоит из двух страниц.
1. Скажем SSD записать любое значение, например
2. Затем скажем записать
3. Наконец скажем записать
Программистам на memory managed языках этот алгоритм может показаться очень похожим. В действительности, в SSD происходит процесс «сборки мусора». Мусор накапливается, а значит его нужно удалять. В хорошей ситуации он удаляется где-нибудь в бекграунд процессе, в плохой — перед вставкой данных.
Есть и ещё одна особенность. У данных в SSD нет никаких «областей видимости» или количества ссылок, как в языках программирования. В общем случае, SSD даже не знает, что данные перестали использоваться. Он может это узнать, если поверх тех же данных пойдёт новая запись. Для решения этой проблемы используется два подхода. Во-первых, многие операционные системы поддерживают команду TRIM, задача которой — сообщить SSD, о том что блок памяти больше не нужен, а значит его можно отчистить. Во-вторых, на многих SSD выделяют физически доступной памяти на 15-25% больше, чем логически адресуемой. Это называется over-provisioning. Поскольку эту память не видит операционная система, но видит SSD, её можно иногда использовать при повышении нагрузок для временного хранения блоков, например.
Плохие новости для программист здесь заключаются в том, что из-за сборки мусора бенчмарки производительности SSD несут очень спорную информацию. Просто замерить, как там новенький диск записывает 20 минут данные — недостаточно. Нужно понагружать его хотя бы пару часов под нагрузкой из и чтений, и записей, чтобы вообще увидеть эффект от сборки мусора, особенно когда там агрегат на 16 ТБ. При этом паттерн нагрузки от производителя может вообще не соответствовать данным реального приложения.
Вторая опасность бенчей SSD — замер только одного показателя, как правило общей производительности (throughput). Это, конечно, не то что нам нужно при наличии сборки мусора, потому что процесс сборки может случиться внезапно, что влияет на задержки (latency). А ещё есть такой показатель, как количество операций чтения/записи в секунду IOPS (Input/Output Operations Per Second). Он тоже не какая-то фундаментальная характеристика, а параметр, зависящий от нагрузки. Конечно, чем больше IOPS тем лучше, но зависит от данных. 10к IOPS где каждая операция передаёт 1 КБ дают меньшую производительность, чем 5к IOPS с 4 КБ данных в каждом запросе.
Как обычно бывает с бенчмарками, лучший вариант — делать бенчи самому на своих данных.
Сборка мусора и не верь бенчмаркам своим.
Приведу пример. Пусть у вас есть крошечный SSD с двумя блоками, каждый из которых состоит из двух страниц.
1. Скажем SSD записать любое значение, например
X=5. Оно попадает в первую страницу первого блока.2. Затем скажем записать
X=6. Запись X=5 не может поменяться, она остаётся, но рядом появится ещё одна запись X=6 уже на второй странице первого блока, которая и будет актуальной. Таким образом у вас как бы тратиться в два раза больше места на хранение «мусора».3. Наконец скажем записать
X=7. SSD запишет её на первую страницу уже второго блока, а первый блок полностью очиститься от данных. Мусор удалён.Программистам на memory managed языках этот алгоритм может показаться очень похожим. В действительности, в SSD происходит процесс «сборки мусора». Мусор накапливается, а значит его нужно удалять. В хорошей ситуации он удаляется где-нибудь в бекграунд процессе, в плохой — перед вставкой данных.
Есть и ещё одна особенность. У данных в SSD нет никаких «областей видимости» или количества ссылок, как в языках программирования. В общем случае, SSD даже не знает, что данные перестали использоваться. Он может это узнать, если поверх тех же данных пойдёт новая запись. Для решения этой проблемы используется два подхода. Во-первых, многие операционные системы поддерживают команду TRIM, задача которой — сообщить SSD, о том что блок памяти больше не нужен, а значит его можно отчистить. Во-вторых, на многих SSD выделяют физически доступной памяти на 15-25% больше, чем логически адресуемой. Это называется over-provisioning. Поскольку эту память не видит операционная система, но видит SSD, её можно иногда использовать при повышении нагрузок для временного хранения блоков, например.
Плохие новости для программист здесь заключаются в том, что из-за сборки мусора бенчмарки производительности SSD несут очень спорную информацию. Просто замерить, как там новенький диск записывает 20 минут данные — недостаточно. Нужно понагружать его хотя бы пару часов под нагрузкой из и чтений, и записей, чтобы вообще увидеть эффект от сборки мусора, особенно когда там агрегат на 16 ТБ. При этом паттерн нагрузки от производителя может вообще не соответствовать данным реального приложения.
Вторая опасность бенчей SSD — замер только одного показателя, как правило общей производительности (throughput). Это, конечно, не то что нам нужно при наличии сборки мусора, потому что процесс сборки может случиться внезапно, что влияет на задержки (latency). А ещё есть такой показатель, как количество операций чтения/записи в секунду IOPS (Input/Output Operations Per Second). Он тоже не какая-то фундаментальная характеристика, а параметр, зависящий от нагрузки. Конечно, чем больше IOPS тем лучше, но зависит от данных. 10к IOPS где каждая операция передаёт 1 КБ дают меньшую производительность, чем 5к IOPS с 4 КБ данных в каждом запросе.
Как обычно бывает с бенчмарками, лучший вариант — делать бенчи самому на своих данных.
🔥1
Как работают SSD (3/3)
FTL и старение.
SSD довольно быстро захватили несколько рынков у HDD во многом потому что используют те же самые интерфейсы. Но в HDD нет никаких проблем с перезаписью данных, а SSD так физически не могут работать из-за того что страницы не перезаписывают, а ещё из-за постоянного процесса сборки мусора. Всё дело в том что операционная система при работе с SSD видит только логическое пространство адресов памяти, физическое же пространство скрыто. За преобразование логического адреса в физический отвечает компонент под названием Flash Translation Layer (FTL).
Но тут тоже есть проблемы. Нельзя просто так соотнести логические адреса на физические по нескольким причинам:
- Ячейки в SSD «стареют» с каждым P/E циклом, поэтому по-хорошему перезаписей должно быть настолько мало, насколько это возможно.
- Некоторые данные изменяются часто, а другие практически никогда. Опять-таки со стороны «старения» ячеек это нежелательная характеристика. Нам бы хотелось, чтобы диск устаревал более-менее равномерно. А значит... данные нужно периодически передвигать.
- Очистка данных происходит по-блочно. Если в блоке есть часть нужных и часть ненужных данных, нужные сначала придётся переместить, а лишь затем очистить блок. Если операционная система будет писать данные как попало, таких перезаписей будет слишком много. Одновременно с этим, отчистка данных — долгая операция. Она в несколько раз медленнее записи.
- Чтение и запись возможна только по странице. Запись исправить довольно просто — вставить буфер размера, равного размеру страницы, а вот с чтением тяжелее. Кажется здесь магии особой нет и нужно просто записывать «похожие» данные рядом.
Поэтому в SSD в качестве алгоритма для FTL часто применяет подход под названием log-block mapping, даже пейпер есть. По своей сути он немного напоминает алгоритмы работы LSM хранилищ. Идея в том, чтобы хранить записи в виде «лога», а затем сливать данные нескольких блоков в один.
Алгоритм приблизительно следующий:
1. На SSD заводится таблица маппинга логических блоков в физические. Помимо маппинга блоков, внутри каждого блока отдельно заводится по таблице маппинга страниц в физические страницы. Один блок помечается как log, остальные как data блоки.
2. Операционная система выдаёт записи по произвольным адресам. Например сначала 3, потом 7, потом 13 и так далее.
3. Записи по этим адресам, возможно, уже существуют в каких-то других data блоках. Это всегда можно определить по таблице маппинга страниц внутри блока.
4. SSD записывает новые записи последовательно в log блок.
5. Когда log блок заполняется, его содержимое сливается (merge) вместе с каким-нибудь из data блоков, а результат записывается в свободный блок. Таким образом создаётся новый data блок, и возможно, удаляется старый.
6. На место log блока назначается новый.
Такой подход, во-первых, позволяет уменьшить количество лишних данных, которые нужно бессмысленно переносить, с другой, позволяет более равномерно «состаривать» ячейки SSD.
В заключении, ещё несколько слов:
- SSD — удивительная технология. Например они поддерживают просто невероятный уровень параллелизма для практически всех операций. Подробнее можно почитать в Design Tradeoffs for SSD Performance (ссылка). Или в ссылках тут. Я лишь поскрёб вершину айсберга.
- Оптимизация программ под SSD — это фактически выбор конкретных объёмов на чтение/запись в зависимости от размера составных блоков SSD, таких как страницы и блоки. Проблема в том, что просто подобрать размер страницы тут не получится, всё сильно сложнее.
- Бенчмарки это всё ещё сложно. Особенно бенчмарки SSD.
- В мире за пределами software пузыря происходят удивительные вещи.
FTL и старение.
SSD довольно быстро захватили несколько рынков у HDD во многом потому что используют те же самые интерфейсы. Но в HDD нет никаких проблем с перезаписью данных, а SSD так физически не могут работать из-за того что страницы не перезаписывают, а ещё из-за постоянного процесса сборки мусора. Всё дело в том что операционная система при работе с SSD видит только логическое пространство адресов памяти, физическое же пространство скрыто. За преобразование логического адреса в физический отвечает компонент под названием Flash Translation Layer (FTL).
Но тут тоже есть проблемы. Нельзя просто так соотнести логические адреса на физические по нескольким причинам:
- Ячейки в SSD «стареют» с каждым P/E циклом, поэтому по-хорошему перезаписей должно быть настолько мало, насколько это возможно.
- Некоторые данные изменяются часто, а другие практически никогда. Опять-таки со стороны «старения» ячеек это нежелательная характеристика. Нам бы хотелось, чтобы диск устаревал более-менее равномерно. А значит... данные нужно периодически передвигать.
- Очистка данных происходит по-блочно. Если в блоке есть часть нужных и часть ненужных данных, нужные сначала придётся переместить, а лишь затем очистить блок. Если операционная система будет писать данные как попало, таких перезаписей будет слишком много. Одновременно с этим, отчистка данных — долгая операция. Она в несколько раз медленнее записи.
- Чтение и запись возможна только по странице. Запись исправить довольно просто — вставить буфер размера, равного размеру страницы, а вот с чтением тяжелее. Кажется здесь магии особой нет и нужно просто записывать «похожие» данные рядом.
Поэтому в SSD в качестве алгоритма для FTL часто применяет подход под названием log-block mapping, даже пейпер есть. По своей сути он немного напоминает алгоритмы работы LSM хранилищ. Идея в том, чтобы хранить записи в виде «лога», а затем сливать данные нескольких блоков в один.
Алгоритм приблизительно следующий:
1. На SSD заводится таблица маппинга логических блоков в физические. Помимо маппинга блоков, внутри каждого блока отдельно заводится по таблице маппинга страниц в физические страницы. Один блок помечается как log, остальные как data блоки.
2. Операционная система выдаёт записи по произвольным адресам. Например сначала 3, потом 7, потом 13 и так далее.
3. Записи по этим адресам, возможно, уже существуют в каких-то других data блоках. Это всегда можно определить по таблице маппинга страниц внутри блока.
4. SSD записывает новые записи последовательно в log блок.
5. Когда log блок заполняется, его содержимое сливается (merge) вместе с каким-нибудь из data блоков, а результат записывается в свободный блок. Таким образом создаётся новый data блок, и возможно, удаляется старый.
6. На место log блока назначается новый.
Такой подход, во-первых, позволяет уменьшить количество лишних данных, которые нужно бессмысленно переносить, с другой, позволяет более равномерно «состаривать» ячейки SSD.
В заключении, ещё несколько слов:
- SSD — удивительная технология. Например они поддерживают просто невероятный уровень параллелизма для практически всех операций. Подробнее можно почитать в Design Tradeoffs for SSD Performance (ссылка). Или в ссылках тут. Я лишь поскрёб вершину айсберга.
- Оптимизация программ под SSD — это фактически выбор конкретных объёмов на чтение/запись в зависимости от размера составных блоков SSD, таких как страницы и блоки. Проблема в том, что просто подобрать размер страницы тут не получится, всё сильно сложнее.
- Бенчмарки это всё ещё сложно. Особенно бенчмарки SSD.
- В мире за пределами software пузыря происходят удивительные вещи.
🔥1
Конфиги будущего (1/2)
Мне всегда казалось, что настройка параметров конфигурации, влияющих на производительность, это игра в которой человек не способен найти оптимальное решение. Посмотрите сами. Пусть у нас есть практически любая база данных или система обмена сообщениями. Сколько в ней есть разных конфигов?
- Во-первых, параметры самого приложения. К примеру postgresql.conf для посгри или несколько десятков, а то и сотен конфигов для kafka.
- Во-вторых, если приложение работает на VM — ещё сотня-другая параметров сверху. Даже если VM нет, часто разные флажки конфигурации, компиляции или самого процесса могут влиять на производительность.
- В-третьих, в любом случае запускать процесс придётся поверх операционной системы. Очередная сотня конфигурируемых параметров на нетворкинг, на работу с памятью и на файловую систему.
При этом оптимальный конфиг зависит от паттерна нагрузки, который меняется со временем и в целом может быть уникальным для приложения. А ещё сами конфигурируемые продукты не стоят на месте. Пока выучил 500 параметров на всех уровнях, новые версии принесли ещё 200.
Даже если каким-то образом всё-таки положить себе в голову абсолютно все параметры системы, задача не решится. Замеры производительности никогда не бывают однозначными. Всё есть тредофф. В одном месте выиграл, в другом проиграл. Проверить все кейсы просто невозможно за обозримый промежуток времени.
К тому же специалистов, разбирающихся во всем, можно пересчитать по пальцам. Поэтому часть компаний просто берёт и использует весь стек от ОС до БД с параметрами конфигурации по-умолчанию. Рискну предположить, что таких даже большинство. Подход практичный, рабочий, но ведь можно и лучше.
Первый шаг — перестать конфигурировать каждую систему руками. Пусть сами себя конфигурируют! Это можно сделать, например, при помощи достаточно быстрого алгоритма машинного обучения в ядре ОС, как в работе A Machine Learning Framework to Improve Storage System Performance (acm). Называется этот ML фреймворк KML и на некоторых нагрузка с RocksDB он показывает х2 производительности... правда из работы не совсем понятно по сравнению с чем. Думаю верно предположить, что сравнение идёт с ОС без каких-либо ручных изменений конфигурации. Здесь рассматривается только абсолютное количество операций с KML, и например ни слова не говорится про средние задержки, но надо же с чего-то начинать.
Идея следующая: оптимизировать I/O нагрузку можно за счёт правильных вызовов и конфигурации readahead. Трассировку, сбор данных и выделение памяти можно оставить в kernel space, там же реализовать примитивы для построения ML алгоритмов, нейросетей и работы с плавающей точкой. Для удобства, обучать модель можно как в kernel space, так и в user space. Можно обучить на известной заранее нагрузке, а затем положить модель в ядро. Обучение и переобучение также по последнему слову техники: хоть онлайн, хоть офлайн, синхронно, асинхронно, в общем, как угодно. Работа не зря называется фреймворк для улучшение производительности. Ещё бы ссылку на гитхаб приложили, но видимо не всё сразу.
Если KML запущен в kernel space, он гипотетически может переобучаться под нагрузку прямо в режиме онлайн, но в работе рассматривается немного другой путь. Авторы сначала замеряют четыре разные вида нагрузки на RocksDB (различаются по количеству чтений и записей), а затем строят классификатор. Его задача — проанализировать текущую неизвестную нагрузку и найти похожую из четырёх уже известных конфигураций.
В дальнейшем при помощи того же фреймворка авторы обещают оптимизировать и I/O шедуллер, и работу с сетью и работу с кешем страниц и вообще весь мир. Звучит очень интересно, посмотрим что получится.
Мне всегда казалось, что настройка параметров конфигурации, влияющих на производительность, это игра в которой человек не способен найти оптимальное решение. Посмотрите сами. Пусть у нас есть практически любая база данных или система обмена сообщениями. Сколько в ней есть разных конфигов?
- Во-первых, параметры самого приложения. К примеру postgresql.conf для посгри или несколько десятков, а то и сотен конфигов для kafka.
- Во-вторых, если приложение работает на VM — ещё сотня-другая параметров сверху. Даже если VM нет, часто разные флажки конфигурации, компиляции или самого процесса могут влиять на производительность.
- В-третьих, в любом случае запускать процесс придётся поверх операционной системы. Очередная сотня конфигурируемых параметров на нетворкинг, на работу с памятью и на файловую систему.
При этом оптимальный конфиг зависит от паттерна нагрузки, который меняется со временем и в целом может быть уникальным для приложения. А ещё сами конфигурируемые продукты не стоят на месте. Пока выучил 500 параметров на всех уровнях, новые версии принесли ещё 200.
Даже если каким-то образом всё-таки положить себе в голову абсолютно все параметры системы, задача не решится. Замеры производительности никогда не бывают однозначными. Всё есть тредофф. В одном месте выиграл, в другом проиграл. Проверить все кейсы просто невозможно за обозримый промежуток времени.
К тому же специалистов, разбирающихся во всем, можно пересчитать по пальцам. Поэтому часть компаний просто берёт и использует весь стек от ОС до БД с параметрами конфигурации по-умолчанию. Рискну предположить, что таких даже большинство. Подход практичный, рабочий, но ведь можно и лучше.
Первый шаг — перестать конфигурировать каждую систему руками. Пусть сами себя конфигурируют! Это можно сделать, например, при помощи достаточно быстрого алгоритма машинного обучения в ядре ОС, как в работе A Machine Learning Framework to Improve Storage System Performance (acm). Называется этот ML фреймворк KML и на некоторых нагрузка с RocksDB он показывает х2 производительности... правда из работы не совсем понятно по сравнению с чем. Думаю верно предположить, что сравнение идёт с ОС без каких-либо ручных изменений конфигурации. Здесь рассматривается только абсолютное количество операций с KML, и например ни слова не говорится про средние задержки, но надо же с чего-то начинать.
Идея следующая: оптимизировать I/O нагрузку можно за счёт правильных вызовов и конфигурации readahead. Трассировку, сбор данных и выделение памяти можно оставить в kernel space, там же реализовать примитивы для построения ML алгоритмов, нейросетей и работы с плавающей точкой. Для удобства, обучать модель можно как в kernel space, так и в user space. Можно обучить на известной заранее нагрузке, а затем положить модель в ядро. Обучение и переобучение также по последнему слову техники: хоть онлайн, хоть офлайн, синхронно, асинхронно, в общем, как угодно. Работа не зря называется фреймворк для улучшение производительности. Ещё бы ссылку на гитхаб приложили, но видимо не всё сразу.
Если KML запущен в kernel space, он гипотетически может переобучаться под нагрузку прямо в режиме онлайн, но в работе рассматривается немного другой путь. Авторы сначала замеряют четыре разные вида нагрузки на RocksDB (различаются по количеству чтений и записей), а затем строят классификатор. Его задача — проанализировать текущую неизвестную нагрузку и найти похожую из четырёх уже известных конфигураций.
В дальнейшем при помощи того же фреймворка авторы обещают оптимизировать и I/O шедуллер, и работу с сетью и работу с кешем страниц и вообще весь мир. Звучит очень интересно, посмотрим что получится.
🔥2
Конфиги будущего (2/2).
Идея применять машинное обучение для оптимизации хранения и выпиливания всяких сложных эвристик довольно популярная, и в последнее время исследований становится всё больше. Вот ещё работа: Automatic I/O stream management based on file characteristics (acm). Здесь рассматривается, как при помощи ML в SSD можно уменьшить write amplification — «лишние» операции записи, необходимые из-за особенностей организации SSD. По замерам получилось в среднем улучшение на 21.6%. Немного магии, и ваш SSD работает на 1/5 дольше и чуть-чуть быстрее.
А в From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees (usenix) оптимизируются LSM деревья, которые являются одной из базовых структур данных для построения хранилищ. Здесь прирост составляет 23% - 78%.
Даже в среде распределенных алгоритмов кеширования ML находит себе место, как в Stacker: an autonomic data movement engine for extreme-scale data staging-based in-situ workflows (acm). Здесь речь про кеш, а значит в качестве важнейшней характеристики используют среднее время ответа (latency). Прирост составляет в среднем ~27%.
Есть даже целые базы данных, такие как SageDB (ссылка не пейпер внутри), которые базируются на автопостроении индексов и машинном обучении для оптимизации планов выполнения запросов.
Самое-то красивое: из раза в раз оказывается, что накладные расходы на поддержку ML алгоритма отбиваются приростом производительности, который он предоставляет. И это лишь вершина айсберга! Очень интересно, к чему в итоге лет через 15 придут хранилища и операционные системы, когда в мире существуют такие исследования. Нужен ли вообще будет программист для настройки системы или оно само там всё решит и выдаст оптимальный конфиг.
Ещё интересные, какие новые подводные камни и уязвимости мы получим от запихивания ML алгоритмов прямо в ядро. Не перерастёт ли проблема «выучить 500 параметров конфигурации ОС и БД» в проблему «выучить 500 параметров конфигурации ML алгоритма».
И уже по традиции. Немного шагнув в сторону из привычного IT пузыря, открывается просто необъятно интересный мир. И если вы думали начать учить ML и ждали знак, то вот он. А я тем временем прихожу в норму и постараюсь в следующий раз вернуться как можно раньше с разбором ARIES — одной из важнейших работ для современных транзакционных систем.
Идея применять машинное обучение для оптимизации хранения и выпиливания всяких сложных эвристик довольно популярная, и в последнее время исследований становится всё больше. Вот ещё работа: Automatic I/O stream management based on file characteristics (acm). Здесь рассматривается, как при помощи ML в SSD можно уменьшить write amplification — «лишние» операции записи, необходимые из-за особенностей организации SSD. По замерам получилось в среднем улучшение на 21.6%. Немного магии, и ваш SSD работает на 1/5 дольше и чуть-чуть быстрее.
А в From WiscKey to Bourbon: A Learned Index for Log-Structured Merge Trees (usenix) оптимизируются LSM деревья, которые являются одной из базовых структур данных для построения хранилищ. Здесь прирост составляет 23% - 78%.
Даже в среде распределенных алгоритмов кеширования ML находит себе место, как в Stacker: an autonomic data movement engine for extreme-scale data staging-based in-situ workflows (acm). Здесь речь про кеш, а значит в качестве важнейшней характеристики используют среднее время ответа (latency). Прирост составляет в среднем ~27%.
Есть даже целые базы данных, такие как SageDB (ссылка не пейпер внутри), которые базируются на автопостроении индексов и машинном обучении для оптимизации планов выполнения запросов.
Самое-то красивое: из раза в раз оказывается, что накладные расходы на поддержку ML алгоритма отбиваются приростом производительности, который он предоставляет. И это лишь вершина айсберга! Очень интересно, к чему в итоге лет через 15 придут хранилища и операционные системы, когда в мире существуют такие исследования. Нужен ли вообще будет программист для настройки системы или оно само там всё решит и выдаст оптимальный конфиг.
Ещё интересные, какие новые подводные камни и уязвимости мы получим от запихивания ML алгоритмов прямо в ядро. Не перерастёт ли проблема «выучить 500 параметров конфигурации ОС и БД» в проблему «выучить 500 параметров конфигурации ML алгоритма».
И уже по традиции. Немного шагнув в сторону из привычного IT пузыря, открывается просто необъятно интересный мир. И если вы думали начать учить ML и ждали знак, то вот он. А я тем временем прихожу в норму и постараюсь в следующий раз вернуться как можно раньше с разбором ARIES — одной из важнейших работ для современных транзакционных систем.
🔥3