Сбой 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
| Когда | Что произошло |
|---|---|
| 2003 | Knight перестаёт пользоваться функцией 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 июля 2013 | Knight Capital Group и GETCO объединяются в KCG Holdings |
| 16 октября 2013 | SEC признаёт нарушение правила о доступе к рынку (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. Семь серверов из восьми работали правильно. Почему восьмой смог натворить столько бед?
- На нём была другая база данных
- На нём остался старый код, и флаг с новым смыслом включил Power Peg, который не умел останавливаться
- Его взломали
- Биржа неправильно обработала заявки
Показать ответ
Верный ответ — 2. Флаг значил разное на разных версиях кода, а старая функция не проверяла, исполнена ли родительская заявка. Стоп-крана на выходе SMARS не было, и один сервер набрал позиции на миллиарды.
Вопрос 2. Во время сбоя новый код удалили с семи исправных серверов. Почему стало хуже?
- Удаление кода перегрузило серверы
- Заявки с флагом продолжали приходить, и теперь на всех восьми серверах флаг включал Power Peg
- Биржа заблокировала Knight
- Откат занял слишком много времени
Показать ответ
Верный ответ — 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.
Начать можно бесплатно: тест навыков и первые задания первого месяца.
Источники
- SEC. Order Instituting Administrative and Cease-and-Desist Proceedings: In the Matter of Knight Capital Americas LLC, Release No. 34-70694, 16.10.2013 — хронология, SMARS, Power Peg, 97 писем, PMON, нарушения и штраф.
- SEC. SEC Charges Knight Capital With Violations of Market Access Rule, пресс-релиз 2013-222, 16.10.2013.
- Knight Capital Group. Пресс-релиз от 2 августа 2012 года (приложение к форме 8-K) — оценка убытка около 440 млн долларов.
- Knight Capital Group. Пресс-релиз от 6 августа 2012 года о финансировании на 400 млн долларов (приложение к форме 8-K).