Коли RAM росте без аварії
Сервіс не падає, але кожен новий мільйон кешованих записів збільшує споживання RAM — обмеженої оперативної пам’яті сервера. Згодом доводиться брати потужніший сервер або дорожчий хмарний тариф, хоча самі збережені відповіді здаються невеликими.
Профілювання пам’яті показує, на які дані й службові структури програма витрачає RAM. Розробники серверної частини використовують його, щоб знайти зайві витрати в кешах і довготривалих сервісах, а потім вимірюванням перевірити запропоновану оптимізацію.
27 серпня 2026 року Cloudflare описала п’ять змін у своєму DNS-кеші. За вимірами компанії, вони зменшили обсяг пам’яті на запис на 56% і вивільнили приблизно 100 ТБ RAM. Це приклад методу, а не прогноз: інший сервіс матиме інші дані, структури й навантаження.
З чого складається один кеш-запис
Кеш — це тимчасове сховище готових відповідей. Наприклад, DNS-кеш зберігає відповідь про домен і строк її дії. Поки запис чинний, сервіс може не виконувати той самий пошук знову.
Корисна відповідь — лише частина запису. Розміщення структури даних описує, як її поля й пов’язані ділянки лежать у пам’яті. Розширювана колекція може резервувати порожні місця. Вказівник зберігає адресу іншої ділянки. Отримання такої окремої ділянки називають виділенням пам’яті, а механізм розподілу — алокатором. Між полями також можуть з’являтися проміжки для вирівнювання, потрібного процесору.
Уявімо навчальний запис:
- відповідь — 120 байтів, строк дії — 8;
- резервна місткість — 64 байти;
- вказівники — 16 байтів;
- проміжки вирівнювання — 8 байтів.
Корисні дані й потрібні метадані займають 128 байтів, а весь запис — 216 без можливих додаткових витрат алокатора. Для мільйона записів це 216 МБ замість 128 МБ, якщо рахувати мільйон байтів за мегабайт. Решта 88 МБ — накладні витрати на місткість, вказівники й вирівнювання. Приклад синтетичний і не описує конкретну мову чи бібліотеку.
Що шукати у власній структурі
Cloudflare зберігає понад 250 млрд кеш-записів. За такого масштабу навіть один зайвий байт на запис потребує понад 250 ГБ пам’яті в усьому парку серверів. Для меншого сервісу важливе не це число, а послідовність запитань:
- Чи потрібен запас місткості після створення запису? Якщо дані більше не ростуть, незмінна колекція може бути компактнішою.
- Чи можна скоротити кількість виділень? Менше окремих ділянок часто означає менше вказівників і службових витрат алокатора.
- Чи можна об’єднати кілька списків? Один список із перевіреними зсувами або індексами економить місце, але ускладнює код.
- Чи відповідає розмір поля можливим значенням? Вужчі поля й бітові прапорці безпечні лише тоді, коли охоплюють увесь допустимий діапазон і не приховують зміст.
У бенчмарку повного шляху кешу Cloudflare також виміряла зростання швидкості вставлення на 43% і зменшення затримки пошуку на 19%. Це результат конкретних змін у конкретному навантаженні, а не обіцянка, що компактніша структура завжди буде швидшою.
Як довести, що зміна допомогла
Контрольований бенчмарк — однаковий повторюваний тест до і після однієї зміни. Cloudflare заповнювала тестовий кеш випадково згенерованими записами, які лише приблизно відтворювали розподіл виробничого трафіку. Власний алокатор підраховував кількість і розмір виділень. Такий тест допомагає пояснити механізм, але не охоплює всю пам’ять процесу.
Резидентний набір пам’яті, або RSS, показує обсяг сторінок процесу, що на момент вимірювання перебувають у фізичній RAM. До нього можуть входити код, спільні сторінки, буфери й пам’ять, яку алокатор залишив для повторного використання. RSS ближчий до того, що бачить оператор сервісу, але не відокремлює один кеш-запис. Тому Cloudflare додатково спостерігала за RSS робочих екземплярів під час розгортання.
Найкраще поєднати обидва рівні: бенчмарк перевіряє гіпотезу, а RSS показує, чи видно ефект у цілому процесі.
Безпечний цикл роботи з ШІ
ШІ може допомагати на кожному етапі, але спочатку людина має зрозуміти показники й межі експерименту.
-
Зрозуміти. Дайте асистентові лише визначення та синтетичний приклад вище. Дозвольте пояснити складові й арифметику; забороніть припускати ваш стек або обіцяти економію. Зупиніться при невідомому терміні чи одиниці. Артефакт — схема «дані + накладні витрати»; перевірка — власноруч скласти й помножити байти.
-
Оглянути. Передайте знеособлений звіт профайлера, підсумок виділень або тестовий бенчмарк. Дозвольте лише читання й групування витрат; не передавайте дампи робочої системи, секрети чи реальні DNS-запити й не дозволяйте команд або змін коду. Зупиніться при чутливих даних, невідомих одиницях чи браку повних початкових даних. Артефакт — нотатка з базовими числами та гіпотезами; перевірка — звірення з інструментом і повторний запуск.
-
Спланувати. Надайте перевірений базовий вимір, опис навантаження, тест коректності й межу затримки. Дозвольте спланувати одну зміну, метрики та відкат; забороніть поєднувати оптимізації або планувати пряме розгортання. Зупиніться, якщо початковий результат не відтворюється. Артефакт — картка експерименту; перевірка — перегляд гіпотези, команд і порогів людиною.
-
Діяти. Використовуйте синтетичні дані, одноразове середовище або ізольовану тестову гілку. Дозвольте редагувати лише її та запускати погоджені тести; забороніть доступ до робочого середовища, секретів, живого трафіку й руйнівних команд. Зупиніться при помилці тесту, зростанні RAM або перевищенні межі затримки. Артефакт — малий перелік змін і журнал запусків; перевірка — повторення в чистому середовищі.
-
Перевірити. Передайте парні результати за однакових умов. Дозвольте обчислити різницю, розкид і регресії; забороніть відбирати лише вигідні запуски або вважати відповідь ШІ доказом. Зупиніться, якщо різняться дані чи середовище або повторів замало. Артефакт — таблиця RAM, виділень, затримки, швидкості й коректності; перевірка — новий запуск без асистента та повний набір тестів.
-
Пояснити. Надайте перевірені таблиці, перелік змін і джерело. Дозвольте скласти коротке рішення; забороніть переносити 56% або 100 ТБ Cloudflare на ваш сервіс. Зупиніться, якщо твердження не має виміру чи джерела. Артефакт — рішення «залишити, відхилити або продовжити» з межами й відкатом; перевірка — власник сервісу звіряє числа з журналами.
Контрольний список
- Початковий результат відтворюється за тих самих умов.
- Експеримент містить одну зміну, умови зупинки та відкат.
- RAM або кількість виділень зменшилися без неприйнятного погіршення коректності, затримки чи швидкості.
- Людина переглянула зміни й незалежно повторила тест.
Компактна структура — лише гіпотеза. Оптимізацію залишають тоді, коли однакові повторні вимірювання підтверджують користь саме для цього сервісу.