Разработчики, сопровождающие git.kernel.org, давно жаловались на «AI-краулеров», но теперь появились конкретные цифры, показывающие масштаб проблемы. Ситуация достаточно серьёзная, чтобы создавать постоянный «фоновый шум» нагрузки на систему — часть вычислительной мощности перманентно занята производством вывода, полезного ровно для одной цели: скармливания обучающим моделям.

Если коротко: на рендеринг коммитов для скраперов тратится больше процессорных циклов, чем на все остальные виды легитимного доступа вместе взятые, включая git clone. В любой момент времени на 5 геораспределённых узлах 14 процессорных ядер заняты исключительно тем, что рендерят git-коммиты в html.

CPU background radiation

Почему git.kernel.org «интересен» краулерам

Разработка Linux ведётся открыто — от git-репозиториев, которые можно клонировать, до архивов обсуждений, которые можно отслеживать в реальном времени. Для большой языковой модели это золотая жила обучающих данных: всё это не только сразу доступно, но и легко отфильтровать, чтобы гарантировать чистый, не тронутый AI контент. Обучение LLM на контенте, произведённом другой LLM, даёт эквивалент цифровой прионной болезни, так что источник, гарантированно свободный от следов LLM — как вся история коммитов ядра — стоит на вес золота как источник обучающих данных.

Самый глупый способ это сделать

Практически всё сделано клонируемым, потому что — ну а вдруг проект не будет существовать вечно, так что вот, клонируйте репозитории. Клонируйте и архивы тоже. Заберите себе копию, чтобы данные были не только у нас. Серьёзно, достаточно одной команды «git clone» — и вся история у вас в руках.

Например, можно клонировать целиком весь LKML и делать с ним что угодно. Это просто git-репозитории, и так до бесконечности.

Логично было бы предположить, что нечто, претендующее на звание «искусственного интеллекта», использует самый эффективный способ забрать эти данные для обучения. Клонировать репозитории, пройтись по каждому коммиту. Готово.

Но нет — выбран, по сути, самый глупый из возможных способов: рендерить всё в HTML коммит за коммитом, а затем парсить результат.

The stupidest way of doing it

На момент написания заметки linux.git насчитывает около 1,48 миллиона коммитов. И ещё есть около 922 форков этого репозитория на git.kernel.org — но не переживайте, на бэкенде это чрезвычайно эффективно, поскольку в большинстве форков используются одни и те же объекты.

Если, конечно, вы не скрапер — тогда у вас, о, несколько МИЛЛИАРДОВ валидных URL для скрапинга, которые в итоге дают лишь 922 дубликата одних и тех же 1,48 миллиона коммитов. Именно этим скраперы и занимаются.

Но дело не только в самих коммитах. Можно запросить патчи, обычные рендеры, диффы между произвольными коммитами — cgit с радостью это предоставит, что было прекрасно во времена, когда интернет был для людей или для краулеров, соблюдающих robots.txt, и стало УЖАСНО прямо сейчас, потому что можно сгенерировать 1,2 МЕТРИЧЕСКОГО БИЛЛИОНА валидных URL для одного-единственного форка linux.git.

How many valid URLs is linux.git?

Банить их

Изначально решение выглядело так — смотреть логи, находить IP, явно принадлежащие ботам, и банить через fail2ban. Сначала это было легко, потому что боты услужливо сообщали, кто они, через user-agent. Потом они поумнели и начали притворяться обычными браузерами.

Тогда началась блокировка по IP — в конце концов, несложно понять, что IP-адрес, пытающийся выкачать каждый возможный коммит в заброшенном 8-летнем форке linux, вряд ли действительно принадлежит одинокому пользователю Chrome на Windows, яростно кликающему по каждой ссылке на экране.

Боты начали расползаться по целым подсетям, но это тоже не спасало, потому что IP из Google Compute очевидно лишь притворяется пользователем Firefox. Блокировка целых ASN была оправдана, даже если иногда под неё попадал случайный легитимный экземпляр, автоматизирующий проверку ссылок в коммитах.

А вот и... ваш телевизор?

И вот тогда всё стало по-настоящему, по-настоящему плохо. Внезапно краулеры начали приходить с миллионов случайных домашних или мобильных IP-адресов, каждый из которых притворялся случайным современным браузером. Такой IP делал 4-5 запросов и больше никогда не появлялся в логах. Банить их не имело смысла — к тому моменту, когда становилось понятно, что это боты, они уже заканчивали свою работу. Оставалось лишь бессмысленно раздувать набор правил файрвола адресами, которые больше никогда не вернутся.

Они налетали, как рой саранчи, били сильно и быстро, пока система не падала, а затем переключались на следующую цель — до тех пор, пока система не восстанавливалась. Потом возвращались снова. И по кругу.

Так происходит и сейчас — добро пожаловать в удивительный мир «монетизации proxy SDK». Это большой бизнес, и ваш телевизор, скорее всего, в нём участвует.

Заставить их платить

Когда проблема впервые дала о себе знать, где-то год назад, была наивная надежда, что её можно остановить. Достаточно заставить ботов выполнять задачу, которая перевернёт экономику всего процесса — заставит их тратить циклы на бессмысленную математику. Например, вычислить строку, которая в комбинации с их собственным IP и секретом, предоставленным сервером, даёт sha256-сумму с 4 ведущими нулями.

Иными словами, перед всем поставили Anubis.

Anubis painfulness graph

Эффект был мгновенным — боты просто сдались. Несколько месяцев царило блаженство: боты блокировались на периметре и уходили искать более лёгкие цели; пользователи были слегка раздражены, но терпели, а стек Anubis было достаточно просто развернуть повсеместно.

Через несколько месяцев боты вернулись, решая сложность 4. Не проблема, подумали тогда — поднимем сложность до 5.

Легитимные пользователи стали раздражаться сильнее. Сложность 5 занимает несколько секунд на мобильном устройстве, а телефон при этом неприятно нагревается от вычислений. Тем не менее это работало и купило ещё несколько месяцев спокойствия.

А потом... боты начали решать сложность 5.

Где мы сейчас

Anatomy of git.kernel.org requests

Сегодня git.kernel.org получает около 6 миллионов ежедневных запросов, требующих показать произвольные коммиты. Из них 66% по-прежнему сразу отбиваются челленджем Anubis, но 33% теперь решают математическую задачу и проходят на основной сайт — судя по всему, то, что там есть, стоит того, чтобы тратить кучу циклов на вычисление Anubis-челленджа.

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

При щедрых допущениях легитимные запросы составляют лишь около 2% трафика git.kernel.org — всё остальное — скраперы.

Насколько всё плохо?

Hits vs. bytes

Пока система не совсем захлёбывается — при заходе на git.kernel.org сайт, скорее всего, будет отзывчивым и быстрым. Обычно систему кладут не боты-скраперы, а плохо спроектированные CI-системы, пытающиеся сделать что-то вроде shallow-clone stable.git одновременно с 20 разных узлов. (Shallow-клоны — это ужасно. Если собираетесь заниматься подобными вещами, разверните собственное зеркало.)

Тем не менее, стоит знать: из 90 ядер, распределённых по 5 геораспределённым узлам, 14-16 ядер постоянно заняты исключительно рендерингом коммитов для скраперов. В среднем это 20% всей вычислительной мощности — хотя на деле рой накатывает волнами, и реальный график выглядит куда более рваным, чем ровная линия на уровне 20%.

Что дальше

Неясно. Возможно, пузырь AI лопнет, и внезапно резко сократится число компаний, пытающихся обучать свои модели. Либо они станут умнее и перестанут потреблять данные самым тупым из возможных способов.

Что касается конкретных мер — отключаются функции, чтобы сократить число URL, доступных для обхода, и закрываются действия, дорогие в исполнении. Стоит ожидать потери части функциональности, по крайней мере при анонимном доступе к ресурсам. Это раздражает не меньше, чем пользователей, но на данный момент это необходимость.

Хуже всего то, что простых решений проблемы не существует. Компании, предлагающие свои «AI»-модели, продолжают появляться каждый день, и все они голодны до обучающих данных. Разработчики приложений всё ещё ищут способы монетизации, а значит продолжат превращать бытовую технику в векторы атак.

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

Извините. (Обязательная канадская фраза.)