Сервіс споживає забагато RAM: як знайти зайві байти й перевірити оптимізацію

профілювання пам’ятіbackendоптимізація кешу

Як розкласти витрати пам’яті одного кеш-запису, безпечно перевірити одну зміну та не пожертвувати швидкодією чи коректністю заради меншого показника RAM

Коли RAM росте без аварії

Сервіс не падає, але кожен новий мільйон кешованих записів збільшує споживання RAM — обмеженої оперативної пам’яті сервера. Згодом доводиться брати потужніший сервер або дорожчий хмарний тариф, хоча самі збережені відповіді здаються невеликими.

Профілювання пам’яті показує, на які дані й службові структури програма витрачає RAM. Розробники серверної частини використовують його, щоб знайти зайві витрати в кешах і довготривалих сервісах, а потім вимірюванням перевірити запропоновану оптимізацію.

27 серпня 2026 року Cloudflare описала п’ять змін у своєму DNS-кеші. За вимірами компанії, вони зменшили обсяг пам’яті на запис на 56% і вивільнили приблизно 100 ТБ RAM. Це приклад методу, а не прогноз: інший сервіс матиме інші дані, структури й навантаження.

З чого складається один кеш-запис

Кеш — це тимчасове сховище готових відповідей. Наприклад, DNS-кеш зберігає відповідь про домен і строк її дії. Поки запис чинний, сервіс може не виконувати той самий пошук знову.

Корисна відповідь — лише частина запису. Розміщення структури даних описує, як її поля й пов’язані ділянки лежать у пам’яті. Розширювана колекція може резервувати порожні місця. Вказівник зберігає адресу іншої ділянки. Отримання такої окремої ділянки називають виділенням пам’яті, а механізм розподілу — алокатором. Між полями також можуть з’являтися проміжки для вирівнювання, потрібного процесору.

Уявімо навчальний запис:

  • відповідь — 120 байтів, строк дії — 8;
  • резервна місткість — 64 байти;
  • вказівники — 16 байтів;
  • проміжки вирівнювання — 8 байтів.

Корисні дані й потрібні метадані займають 128 байтів, а весь запис — 216 без можливих додаткових витрат алокатора. Для мільйона записів це 216 МБ замість 128 МБ, якщо рахувати мільйон байтів за мегабайт. Решта 88 МБ — накладні витрати на місткість, вказівники й вирівнювання. Приклад синтетичний і не описує конкретну мову чи бібліотеку.

Що шукати у власній структурі

Cloudflare зберігає понад 250 млрд кеш-записів. За такого масштабу навіть один зайвий байт на запис потребує понад 250 ГБ пам’яті в усьому парку серверів. Для меншого сервісу важливе не це число, а послідовність запитань:

  1. Чи потрібен запас місткості після створення запису? Якщо дані більше не ростуть, незмінна колекція може бути компактнішою.
  2. Чи можна скоротити кількість виділень? Менше окремих ділянок часто означає менше вказівників і службових витрат алокатора.
  3. Чи можна об’єднати кілька списків? Один список із перевіреними зсувами або індексами економить місце, але ускладнює код.
  4. Чи відповідає розмір поля можливим значенням? Вужчі поля й бітові прапорці безпечні лише тоді, коли охоплюють увесь допустимий діапазон і не приховують зміст.

У бенчмарку повного шляху кешу Cloudflare також виміряла зростання швидкості вставлення на 43% і зменшення затримки пошуку на 19%. Це результат конкретних змін у конкретному навантаженні, а не обіцянка, що компактніша структура завжди буде швидшою.

Як довести, що зміна допомогла

Контрольований бенчмарк — однаковий повторюваний тест до і після однієї зміни. Cloudflare заповнювала тестовий кеш випадково згенерованими записами, які лише приблизно відтворювали розподіл виробничого трафіку. Власний алокатор підраховував кількість і розмір виділень. Такий тест допомагає пояснити механізм, але не охоплює всю пам’ять процесу.

Резидентний набір пам’яті, або RSS, показує обсяг сторінок процесу, що на момент вимірювання перебувають у фізичній RAM. До нього можуть входити код, спільні сторінки, буфери й пам’ять, яку алокатор залишив для повторного використання. RSS ближчий до того, що бачить оператор сервісу, але не відокремлює один кеш-запис. Тому Cloudflare додатково спостерігала за RSS робочих екземплярів під час розгортання.

Найкраще поєднати обидва рівні: бенчмарк перевіряє гіпотезу, а RSS показує, чи видно ефект у цілому процесі.

Безпечний цикл роботи з ШІ

ШІ може допомагати на кожному етапі, але спочатку людина має зрозуміти показники й межі експерименту.

  1. Зрозуміти. Дайте асистентові лише визначення та синтетичний приклад вище. Дозвольте пояснити складові й арифметику; забороніть припускати ваш стек або обіцяти економію. Зупиніться при невідомому терміні чи одиниці. Артефакт — схема «дані + накладні витрати»; перевірка — власноруч скласти й помножити байти.

  2. Оглянути. Передайте знеособлений звіт профайлера, підсумок виділень або тестовий бенчмарк. Дозвольте лише читання й групування витрат; не передавайте дампи робочої системи, секрети чи реальні DNS-запити й не дозволяйте команд або змін коду. Зупиніться при чутливих даних, невідомих одиницях чи браку повних початкових даних. Артефакт — нотатка з базовими числами та гіпотезами; перевірка — звірення з інструментом і повторний запуск.

  3. Спланувати. Надайте перевірений базовий вимір, опис навантаження, тест коректності й межу затримки. Дозвольте спланувати одну зміну, метрики та відкат; забороніть поєднувати оптимізації або планувати пряме розгортання. Зупиніться, якщо початковий результат не відтворюється. Артефакт — картка експерименту; перевірка — перегляд гіпотези, команд і порогів людиною.

  4. Діяти. Використовуйте синтетичні дані, одноразове середовище або ізольовану тестову гілку. Дозвольте редагувати лише її та запускати погоджені тести; забороніть доступ до робочого середовища, секретів, живого трафіку й руйнівних команд. Зупиніться при помилці тесту, зростанні RAM або перевищенні межі затримки. Артефакт — малий перелік змін і журнал запусків; перевірка — повторення в чистому середовищі.

  5. Перевірити. Передайте парні результати за однакових умов. Дозвольте обчислити різницю, розкид і регресії; забороніть відбирати лише вигідні запуски або вважати відповідь ШІ доказом. Зупиніться, якщо різняться дані чи середовище або повторів замало. Артефакт — таблиця RAM, виділень, затримки, швидкості й коректності; перевірка — новий запуск без асистента та повний набір тестів.

  6. Пояснити. Надайте перевірені таблиці, перелік змін і джерело. Дозвольте скласти коротке рішення; забороніть переносити 56% або 100 ТБ Cloudflare на ваш сервіс. Зупиніться, якщо твердження не має виміру чи джерела. Артефакт — рішення «залишити, відхилити або продовжити» з межами й відкатом; перевірка — власник сервісу звіряє числа з журналами.

Контрольний список

  • Початковий результат відтворюється за тих самих умов.
  • Експеримент містить одну зміну, умови зупинки та відкат.
  • RAM або кількість виділень зменшилися без неприйнятного погіршення коректності, затримки чи швидкості.
  • Людина переглянула зміни й незалежно повторила тест.

Компактна структура — лише гіпотеза. Оптимізацію залишають тоді, коли однакові повторні вимірювання підтверджують користь саме для цього сервісу.

Джерела