Одна из самых главных методик для меня, когда я готовлюсь к дизайн интервью, я читаю Post-mortems. Нет ничего приятнее, захватывающее и полезнее, чем смотреть как падают системы, с грохотом, по разным причинам. Они читаются как страшилки, а то и хорошие сказки на ночь. Хорошая коллекция есть у Dan Luu (https://github.com/danluu/post-mortems). Один из моих любимых это
Pentium division bug
Процессор неправильно делил очень редкие числа. Баг был в том, что часть таблицы для деления неправильно подгружалась в Programmable Lookup Array. Тестирование из-за симметричности таблицы было сделано только на первой её половине, а неправильные значения подгружались только во второй.
Но, наверное, хочется поделиться своей, одной из самых запоминающихся историй, когда я работал в Яндекс.Поиске (публикую с разрешения своего бывшего тех лида)
Я помню возвращался из универа, чтобы вечером поработать, позакрывать баги и пописать немного кода. Я одним глазком решил посмотреть на состояние поиска, в целом всё было стабильно, запросы отвечались, пользователи приходили, а вечером немножко уходили, ведь семья, телевизор, кино, это нормально, в поиске к вечеру меньше траффика.
Один из графиков показывал редкие падения, ну бывает, машин же много, что-то не работает из-за железа, особо никто не обращает внимание, это нормально, пара шардов не повлияют на результаты, всегда же есть репликация.
Случайно нажал на группировку по хостам, и увидел, что за последний день два хоста падают, одни и те же. И вроде бы даже машинки здоровые, не поломаные, диски, CPU, RAM, всё работает как часы.
Зашёл на машинку, увидел, что coredump отложился. Взял его, подключился к монитору, налил кофе и решил посмотреть, что сломалось.
Падало где-то в кишках итераторов, которые ищут по предложениям, "Интересно", -- подумал я, этот код оттестирован лучше всего в поиске, что же пошло не так.
Шарды, хранящие кусочек интернета, как правило имеют одним из индексов обычный из слов в номера предложений и позиций. Индекс важный, крупный, здоровый.
Потыкался минут 5-10 в gdb, отковырял запрос, он был что-то в духе "ящерица аброния". "Хороший запрос", -- подумал я тогда. И даже как-то захотелось дальше копать.
Начал смотреть, где падает, итератор попытался поискать слово синоним "ящурный", и почему-то не нашёл, хотя слово точно есть в индексе.
Дальше я ушел, погулял по практически пустому офису в 10 вечера. Так и не понял в чём проблема, создал баг, пошёл спать.
На утро я проснулся со странным ощущением в голове. Далее прям похожая картинка из мультфильма Рататуй, когда Эго попробовал блюда, что-то меня осенило с утра. "Это же последнее слово из толкового словаря Даля", -- вспомнил я. Как-то в детстве просто любил листать словари, интересно, что было в конце. И у меня тогда родилась идея :)
Так получилось из-за скорости, что индекс хранил 29 бит для индексации слов, а 35 бит были для всего остального. Да вроде всё хорошо, уже пару лет в проде, должно работать как следует. Тем не менее, полмиллиарда уникальных слов не хватило для нескольких миллионов документов и 29 бит переполнились. В итоге позиции предложений для нулевых индексов стали содержать позиции предложений переполненных, и так как некоторые предложения не существовали (слова не сходились), то всё съезжало.
Баг не всегда воспроизводился, но в данном случае произошло, что
ящерица находится очень в конце индекса
аброния находится очень в начале
Понятное дело, что и после ящурный и до абронии было много других странных несуществующих слов, но этого хватило, чтобы найти переполнение и соответственно баг в индексаторе.
Слава богу таким эффектом пострадали только десяток шардов, и это было не очень незначительным. Через пару месяцев после перестройки всех индексов панелька с падениями всё так же показывала редкие значения, но на этот раз это всё были машинки, которым стало просто плохо.
Я вспоминаю поиск, где мне было весело. В Google всё как-то стабильно работает, таких историй намного меньше
Pentium division bug
Процессор неправильно делил очень редкие числа. Баг был в том, что часть таблицы для деления неправильно подгружалась в Programmable Lookup Array. Тестирование из-за симметричности таблицы было сделано только на первой её половине, а неправильные значения подгружались только во второй.
Но, наверное, хочется поделиться своей, одной из самых запоминающихся историй, когда я работал в Яндекс.Поиске (публикую с разрешения своего бывшего тех лида)
Я помню возвращался из универа, чтобы вечером поработать, позакрывать баги и пописать немного кода. Я одним глазком решил посмотреть на состояние поиска, в целом всё было стабильно, запросы отвечались, пользователи приходили, а вечером немножко уходили, ведь семья, телевизор, кино, это нормально, в поиске к вечеру меньше траффика.
Один из графиков показывал редкие падения, ну бывает, машин же много, что-то не работает из-за железа, особо никто не обращает внимание, это нормально, пара шардов не повлияют на результаты, всегда же есть репликация.
Случайно нажал на группировку по хостам, и увидел, что за последний день два хоста падают, одни и те же. И вроде бы даже машинки здоровые, не поломаные, диски, CPU, RAM, всё работает как часы.
Зашёл на машинку, увидел, что coredump отложился. Взял его, подключился к монитору, налил кофе и решил посмотреть, что сломалось.
Падало где-то в кишках итераторов, которые ищут по предложениям, "Интересно", -- подумал я, этот код оттестирован лучше всего в поиске, что же пошло не так.
Шарды, хранящие кусочек интернета, как правило имеют одним из индексов обычный из слов в номера предложений и позиций. Индекс важный, крупный, здоровый.
Потыкался минут 5-10 в gdb, отковырял запрос, он был что-то в духе "ящерица аброния". "Хороший запрос", -- подумал я тогда. И даже как-то захотелось дальше копать.
Начал смотреть, где падает, итератор попытался поискать слово синоним "ящурный", и почему-то не нашёл, хотя слово точно есть в индексе.
Дальше я ушел, погулял по практически пустому офису в 10 вечера. Так и не понял в чём проблема, создал баг, пошёл спать.
На утро я проснулся со странным ощущением в голове. Далее прям похожая картинка из мультфильма Рататуй, когда Эго попробовал блюда, что-то меня осенило с утра. "Это же последнее слово из толкового словаря Даля", -- вспомнил я. Как-то в детстве просто любил листать словари, интересно, что было в конце. И у меня тогда родилась идея :)
Так получилось из-за скорости, что индекс хранил 29 бит для индексации слов, а 35 бит были для всего остального. Да вроде всё хорошо, уже пару лет в проде, должно работать как следует. Тем не менее, полмиллиарда уникальных слов не хватило для нескольких миллионов документов и 29 бит переполнились. В итоге позиции предложений для нулевых индексов стали содержать позиции предложений переполненных, и так как некоторые предложения не существовали (слова не сходились), то всё съезжало.
Баг не всегда воспроизводился, но в данном случае произошло, что
ящерица находится очень в конце индекса
аброния находится очень в начале
Понятное дело, что и после ящурный и до абронии было много других странных несуществующих слов, но этого хватило, чтобы найти переполнение и соответственно баг в индексаторе.
Слава богу таким эффектом пострадали только десяток шардов, и это было не очень незначительным. Через пару месяцев после перестройки всех индексов панелька с падениями всё так же показывала редкие значения, но на этот раз это всё были машинки, которым стало просто плохо.
Я вспоминаю поиск, где мне было весело. В Google всё как-то стабильно работает, таких историй намного меньше