Doom на телефонной книге интернета. Инженер Кори Куинн заставил DNS считать и запустил культовый шутер

5895
Doom на телефонной книге интернета. Инженер Кори Куинн заставил DNS считать и запустил культовый шутер

Около 6,4 млн записей заменили арифметические схемы, регистры и часть логики процессора.

image

Инженер Кори Куинн заставил DNS участвовать в вычислениях Doom и получил рабочую, хотя почти неиграбельную версию культового шутера. После серии оптимизаций обработка нажатия клавиши сократилась с 577 до 54,4 секунды, тогда как Doom в нормальном режиме выполняет 35 игровых тактов в секунду.

Куинн использовал необычное свойство DNS. Система доменных имен представляет собой распределенную базу данных, поэтому способна не только сопоставлять домены с IP-адресами, но и хранить заранее подготовленные значения. Инженер записал в DNS около 6,4 млн строк с таблицами истинности для арифметических и логических операций.

На получившейся системе работает 32-битная архитектура RISC-V. Сам BIND не исполняет машинные инструкции и не превращается в процессор: компилятор заранее декодирует команды, небольшая управляющая программа связывает операции и задает такт, а DNS-сервер получает ключи, возвращает подготовленные ответы и хранит состояние машины.

Главной проблемой стала скорость. BIND отвечает примерно за семь микросекунд по TCP и четыре микросекунды по UDP, но даже простые операции требуют нескольких обращений. 32-битное сложение обходится в четыре DNS-запроса, условный переход требует пяти, а формирование кадра создает около 6,6 млн DNS-транзакций.

Первая попытка обработать нажатие клавиши Right заняла 577 секунд. Куинн перешел на UDP, добавил конвейерную обработку, плотнее упаковал регистры, сократил число обращений и стал реже записывать состояние обратно в DNS. Время снизилось сначала до 146,3 секунды, затем до 54,4 секунды, суммарное ускорение достигло 10,6 раза.

Даже теоретический предел остается слишком далеко от нормальной игры. Один игровой такт Doom должен занимать около 28,6 миллисекунды. Текущая реализация требует примерно 54 тыс. миллисекунд, поэтому до приемлемой скорости не хватает около трех порядков производительности.

Для сохранения состояния Куинн применил DNS UPDATE из RFC 2136. Запись проходит только при совпадении предыдущего состояния с ожидаемым значением, что позволяет обнаруживать конфликтующие изменения. Соавтор RFC 2136 и архитектор BIND 8 Пол Викси назвал работу лучшим применением DNS UPDATE, которое ему доводилось видеть.

Эксперимент запускается на стандартном BIND 9.20 из Debian внутри контейнера с отключенной сетью, поэтому миллионы запросов не уходят в интернет. Для демонстрации используется заранее подготовленная контрольная точка Doom: полная загрузка игры через DNS заняла бы несколько часов, а первоначальная загрузка 6,4 млн записей занимает около минуты.

Рекламодатель
Реклама. АО «Позитив Текнолоджиз». ИНН 7718668887. 18+
Сайт рекламодателя: ptsecurity.com↗
АО «Позитив Текнолоджиз»