Безплатен DNS, скъпи заявки: Защо вашият резолвер прекалява
Скритите разходи на "безплатния" DNS: Защо вашият resolver надрусва със заявки
Помните ли поговорката за безплатните неща? Е, в света на DNS тя придобива много конкретен смисъл — и сметката се плаща от операторите на authorative nameservers.
Трагедията на общото, пренесена върху DNS
Концепцията за "трагедията на общото" описва как споделените ресурси биват експлоатирани, когато на потребителите не им се налага да ги пазят. Представете си пасище, което всички ползват без ограничения — докато не свърши тревата. Оказва се, че същото се случва непрекъснато в DNS резолюцията, само на мащаб, който повечето хора не виждат.
Какво точно става: когато recursive resolver трябва да намери даден домейн, той изпраща UDP заявки към authorative nameservers. UDP е бърз и лек, но не гарантира доставка. И тук започва интересното — поне за тези, които плащат сметките.
Защо resolver-ите спамят с еднакви заявки
Recursive resolver-ите са разработили стратегия, която от тяхна гледна точка изглежда умна: прекомерно изпращане на заявки. Ако resolver-ът не получи отговор достатъчно бързо, той не чака търпеливо. Вместо това праща същата заявка отново. И пак. Понякога десетки пъти, преди оригиналната заявка изобщо да е имала шанс да успее.
Защо постъпват така? Две основни причини:
- Издръжливост: Ако първата заявка се е загубила по пътя, бързо преповтаряне може да успее
- Скорост: Чакането на пълен timeout е бавно; бързите преповторения са по-бързи
Resolver-ът печели от по-бързо време за отговор, но има уловка: authorative сървърът понася цената за генериране на всички тези дублиращи се отговори. Тъй като DNS заявките са безплатни за resolver-ите, те нямат никаква мотивация да бъдат пестеливи.
Това е класически пример за externalities — разходите се понасят от някой друг, а не от този, който взима решенията.
Числата са стряскащи
Скорошно проучване на APNIC Labs разгледа дублирането на заявки в различни региони, като резултатите са доста притеснителни. Методологията им беше хитра: използваха уеб реклами, за да разпространят измервателни задачи, като всяка заявка имаше уникално DNS име, за да заобиколят кеширането. Това им позволи да видят точно какви заявки стигат до authorative сървърите.
Средният процент на дублиране във всички региони е 38% — което означава, че повече от една трета от всички комбинации query name/type са дубликати. Но това е само средната стойност.
Разбивка по региони:
| Регион | Процент дублирани заявки | |--------|-------------------------| | Индийски субконтинент | 61% | | Китай/Хонконг | 47% | | Северна Америка | 28% | | Европа | 27% |
Индийският и китайският регион показват драматично по-високи нива на дублиране в сравнение с тези в Северна Америка и Европа. Това подсказва, че resolver софтуерът в тези региони е по-агресивен с преповторенията, мрежовите условия там изискват по-активно поведение, или и двете заедно.
Какво означава това за операторите на инфраструктура
Ако поддържате authorative nameservers — независимо дали за собствените си домейни или като част от DNS услуга — вероятно обработвате много повече заявки, отколкото реално ви трябва. Това има конкретни последици:
- По-високи разходи за bandwidth и изчисления
- По-голямо натоварване върху инфраструктурата
- Повече напрежение върху upstream мрежовите връзки
За стартъпи и растящи компании това прахосано трафик се натрупва. Всяка ненужна заявка, която вашата DNS инфраструктура обработва, е капацитет, който можеше да обслужва легитимен трафик, или пари, които можеха да останат във вашия джоб.
Гледната точка на разработчика
Като разработчици често не се замисляме какво се случва "под капака" на DNS резолюцията. Нашият код извиква getaddrinfo() или еквивалент, и магията се случва. Но разбирането на тези динамики има значение, особено ако сте:
- Дебъгвате проблеми с DNS производителността (тези мистериозни таймаути може да са бури от преповторения на resolver-и)
- Създавате DNS-интензивни приложения (знаейки реалния обем заявки помага за планиране на капацитета)
- Оценявате DNS доставчици (някои се справят с това по-добре от други)
В NameOcean виждаме това редовно, когато помагаме на клиенти да оптимизират DNS настройките. Разбирането, че DNS не е толкова "безплатен", колкото изглежда, помага да се обясни защо качествената DNS инфраструктура — тази, която се справя грациозно с преповторенията, прилага правилно кеширане и минимизира ненужните заявки — всъщност има значение за надеждността и производителността на вашето приложение.
Има ли решение?
Коренът на проблема е липсата на ценово сигнализиране в DNS. Resolver-ите могат да бъдат агресивни, защото не плащат за това. Няколко подхода биха помогнали:
- По-добри resolver имплементации с по-интелигентна логика за преповторение и по-дълги първоначални таймаути
- Anycast внедряване за намаляване на латентността и загубата на пакети, което намалява нужнодата от агресивни преповторения
- EDNS0 буфер size оптимизация за намаляване на загубите от фрагментация
- TCP fallback за проблематични заявки (макар че това добавя overhead)
За повечето разработчици и бизнеси посланието е по-просто: избирайте вашия DNS доставчик и конфигурацията на resolver-а разумно. Не всяка DNS инфраструктура е еднаква, и разбирането на скритите разходи на "безплатните" заявки ви помага да вземете по-добри решения за това къде да хоствате домейните си и как да конфигурирате вашия resolution stack.
DNS инфраструктурата в интернет е споделен ресурс. И както всички споделени ресурси, тя работи най-добре, когато всички играят честно — дори когато няма ясна цена за егоистично поведение.
Имате въпроси относно оптимизацията на вашата DNS настройка? Ние сме тук да помогнем. В NameOcean вярваме в прозрачна инфраструктура, която работи ефективно — не само на ниво приложение, но чак до ниво пакети.