kai.kzLab

Сбой Knight Capital 1 августа 2012 года: забытый сервер, старый флаг и 460 млн долларов за 45 минут

Команда KAI Lab · · 9 мин чтения

1 августа 2012 года торговый маршрутизатор SMARS компании Knight Capital примерно за 45 минут отправил на биржи миллионы лишних заявок и получил более 4 млн исполнений на 397 млн с лишним акций; убыток превысил 460 млн долларов. Причина — ручной деплой: новый код не скопировали на один из восьми серверов, и переиспользованный флаг включил на нём старую функцию Power Peg, которой не пользовались с 2003 года.

Подробности — в решении Комиссии по ценным бумагам и биржам США (SEC) от 16 октября 2013 года, которая оштрафовала Knight на 12 млн долларов. Сбой стал учебным примером того, почему деплой должен быть автоматическим и проверяемым, а мёртвый код — удалённым.

Главное о сбое в одной таблице

ВопросОтвет
Когда1 августа 2012, с открытия торгов в 9:30 по нью-йоркскому времени, около 45 минут
Ктоброкер-дилер Knight Capital Americas, около 10% всей торговли акциями на биржах США
Какая системаSMARS — маршрутизатор, который делит «родительскую» заявку на «дочерние» и рассылает их по биржам
Что выкатываликод для программы NYSE Retail Liquidity Program (RLP), которая стартовала 1 августа
Что пошло не такна 1 из 8 серверов код не скопировали; флаг, который раньше включал Power Peg, теперь означал RLP
Масштаб212 клиентских заявок превратились в миллионы дочерних: более 4 млн исполнений в 154 акциях
Позициидлинная около 3,5 млрд долларов в 80 акциях, короткая около 3,15 млрд долларов в 74 акциях
Убытокбольше 460 млн долларов по данным SEC; сама Knight 2 августа оценила его примерно в 440 млн до налогов

Хронология сбоя Knight Capital

КогдаЧто произошло
2003Knight перестаёт пользоваться функцией Power Peg, но её код остаётся на рабочих серверах SMARS
2005Счётчик исполненных акций переносят в более раннюю точку кода SMARS. Power Peg после этого не перепроверяют
Октябрь 2011После учений по аварийному восстановлению одна из систем выставляет котировки по тестовым данным. Убыток почти 7,5 млн долларов
С 27 июля 2012Код RLP выкладывают на серверы SMARS поэтапно, по нескольку серверов в день
1 августа, с 8:01Внутренняя система рассылает письма «BNET rejects» с ошибкой «Power Peg disabled». До открытия торгов — 97 писем
9:30Открытие торгов. Восьмой сервер получает заявки с флагом и запускает Power Peg
Во время сбояНовый код удаляют с семи исправных серверов. Power Peg начинает срабатывать и на них
Около 45 минутKnight прекращает отправку заявок
6 августаИнвесторы, среди которых Jefferies, Blackstone и GETCO, вкладывают 400 млн долларов, и Knight продолжает работу
1 июля 2013Knight Capital Group и GETCO объединяются в KCG Holdings
16 октября 2013SEC признаёт нарушение правила о доступе к рынку (Rule 15c3-5): порицание и штраф 12 млн долларов

Как забытый сервер включил функцию девятилетней давности

Через SMARS проходил 1% или больше всей торговли акциями на биржах США. Для RLP в нём написали новый код. Он должен был заменить неиспользуемую функцию Power Peg, а флаг, которым раньше включали Power Peg, переиспользовали: значение «yes» теперь должно было запускать RLP.

У Power Peg была своя история. Когда им пользовались, счётчик исполненных акций останавливал отправку дочерних заявок, как только родительская исполнялась целиком. В 2005 году этот счётчик перенесли в другое место кода, а Power Peg не перепроверили. Функция перестала уметь останавливаться, но об этом никто не знал: её не вызывали.

Выкладка шла поэтапно, с 27 июля, но руками. Один техник не скопировал новый код на восьмой сервер. Второй человек деплой не проверял: такой процедуры не было.

Серверы 1–7 (новый код):  флаг = yes → логика RLP
Сервер 8 (старый код):    флаг = yes → Power Peg → дочерние заявки без остановки

Поэтапность ничего не проверила: новый код должен был заработать только с запуском RLP 1 августа, и до этого дня расхождение между серверами ничем себя не выдавало. 1 августа семь серверов обработали заявки RLP правильно, а восьмой на каждую родительскую заявку слал дочерние одну за другой, не глядя на исполнения.

Почему 45 минут никто не мог остановить

Проблему было видно до открытия. С 8:01 система слала письма «BNET rejects» с текстом «Power Peg disabled». Их не проектировали как алерты и обычно не читали, хотя, по оценке SEC, они давали шанс найти ошибку деплоя до 9:30.

В SMARS не было стоп-крана. Никакой контроль не сравнивал заявки на выходе маршрутизатора с заявками на входе, и не было процедуры остановить SMARS при аномальной активности. Ограничение цены в 9,5% от лучшей котировки не действовало для заявок на аукцион открытия, а все 212 заявок были именно такими.

Лимиты не были связаны с отправкой заявок. Лишние исполнения копились на служебном «счёте 33» с лимитом 2 млн долларов, но этот лимит не был связан ни с какой автоматикой. Там же лежали позиции из других источников, и люди не могли быстро понять, откуда растёт объём.

Мониторинг держался на людях. Система контроля рисков PMON показывала позиции после исполнения, не присылала алертов и не показывала лимиты. При больших объёмах, как 1 августа, она запаздывала.

Не было плана реагирования. Проблему искали инженеры прямо на живой торговле, и всё это время Knight оставалась подключённой к рынку. SEC пишет, что сотрудникам нужны были понятные правила, когда отключать неисправную систему от рынка.

«Откат», который всё ухудшил

Одной из попыток исправить ситуацию стало удаление нового кода RLP с семи серверов, где он был установлен правильно. Заявки с флагом продолжали приходить, и Power Peg заработал уже на всех восьми серверах.

Откатили код, но не входящие данные. Сочетание «старый код плюс заявки с новым смыслом флага» и было причиной сбоя, а откат размножил его на все серверы. Код, конфигурация, флаги и формат данных откатываются вместе. В плане отката стоит отдельно ответить на вопрос: что будет с запросами, которые уже несут новый формат.

Уроки для DevOps

1. Ручной деплой однажды пропустит сервер

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

# после выкладки: одна ли версия на всех хостах группы (хосты и версии условные)
$ ansible routers -m command -a 'cat /opt/router/VERSION' -o
router-01 | CHANGED | rc=0 | (stdout) 2012.07.27-rlp
router-02 | CHANGED | rc=0 | (stdout) 2012.07.27-rlp
...
router-08 | CHANGED | rc=0 | (stdout) 2012.06.14

Разные версии в выводе — повод остановить релиз, а не разбираться после открытия торгов.

2. Мёртвый код в проде — заряженное ружьё

Power Peg не использовали девять лет, но его можно было вызвать. В 2005 году его сломали, и никто не заметил: код, который не выполняется, никто не тестирует. Неиспользуемый код удаляют, а не оставляют на всякий случай.

3. Флаг не меняет смысл

Одно и то же значение флага на старом сервере значило Power Peg, на новом — RLP. Новой функциональности нужен новый флаг. Пока идёт выкладка, старая и новая версии работают вместе, и каждая должна понимать входящие данные одинаково или отказываться их обрабатывать.

4. Письмо, которое никто не читает, — не мониторинг

97 писем об ошибке пришли до открытия торгов и ничего не изменили. У GitLab в 2017 году письма о падении бэкапов тоже не доходили до людей, и база осталась без рабочих бэкапов. У ошибки на критичном пути должны быть алерт и владелец.

5. Стоп-кран должен срабатывать сам

Лимит, который только рисует график, ничего не остановит. Нужны автоматические стоп-критерии — доля ошибок, объём необычных действий, «хост перестал отвечать» — и заранее решённый вопрос, кто вправе отключить систему без совещаний. Как это выглядит для поэтапной раскатки, разобрано на примере сбоя CrowdStrike.

6. Разбирать класс проблем, а не один случай

После убытка в октябре 2011 года Knight исправила ровно тот сценарий, что произошёл. SEC называет такую реакцию узкой: никто не спросил, какие ещё системы могут отправить ошибочные заявки. Хороший постмортем заканчивается мерами против всего класса ошибок.

Что проверить у себя завтра:

  • проверяется ли версия на каждом хосте после выкладки;
  • какой код и какие флаги в проде никто не трогал больше года;
  • кто читает письма и логи с ошибками до релиза;
  • есть ли стоп-кран, который срабатывает без человека.

Реши сам

Вопрос 1. Семь серверов из восьми работали правильно. Почему восьмой смог натворить столько бед?

  1. На нём была другая база данных
  2. На нём остался старый код, и флаг с новым смыслом включил Power Peg, который не умел останавливаться
  3. Его взломали
  4. Биржа неправильно обработала заявки
Показать ответ

Верный ответ — 2. Флаг значил разное на разных версиях кода, а старая функция не проверяла, исполнена ли родительская заявка. Стоп-крана на выходе SMARS не было, и один сервер набрал позиции на миллиарды.

Вопрос 2. Во время сбоя новый код удалили с семи исправных серверов. Почему стало хуже?

  1. Удаление кода перегрузило серверы
  2. Заявки с флагом продолжали приходить, и теперь на всех восьми серверах флаг включал Power Peg
  3. Биржа заблокировала Knight
  4. Откат занял слишком много времени
Показать ответ

Верный ответ — 2. Откатили код, но не входящие данные. Прежде чем откатывать, надо понимать, в какое состояние вы возвращаете систему.

Частые вопросы

Сколько денег потеряла Knight Capital? По решению SEC — больше 460 млн долларов на позициях, набранных примерно за 45 минут. Сама Knight 2 августа 2012 года оценила реализованный убыток до налогов примерно в 440 млн долларов.

Что такое Power Peg? Старая функция маршрутизатора SMARS, которой Knight не пользовалась с 2003 года. Её код оставался на рабочих серверах. После изменения 2005 года она не останавливала отправку дочерних заявок, когда родительская была уже исполнена.

Что стало с компанией после сбоя? 6 августа 2012 года Knight получила 400 млн долларов от группы инвесторов и продолжила работу. 1 июля 2013 года Knight Capital Group объединилась с GETCO в KCG Holdings. В октябре 2013 года SEC оштрафовала Knight на 12 млн долларов.

При чём тут DevOps, если это биржа? Сбой вызвала не торговая стратегия, а инженерные практики: ручной деплой без второй проверки, мёртвый код в проде, переиспользованный флаг, непрочитанные письма об ошибках и отсутствие стоп-крана. Всё это бывает в любой компании с продом.

Пройти похожий сбой самому

В симуляторе DevOps KAI Lab разбор Knight Capital стоит в первом месяце. Рядом — тикет, где задачу закрыли по зелёному пайплайну, а новой версии на сайте нет, и надо выяснить, что на самом деле работает на проде. Разбор сбоя AWS S3, где одна команда из плейбука уронила хранилище в целом регионе, ждёт в модуле про Ansible.

Начать можно бесплатно: тест навыков и первые задания первого месяца.

Источники

Читать дальше