Форму видно без профайлера. Сайт відповідає, за день один процес росте, сервер його вбиває, хтось піднімає знову, знову тихо, ріст починається спочатку. Разом з інцидентом приїжджає пропозиція купити пам’ять або переписати той сервіс, який якраз був запущений. Обидва витрачають гроші до того, як названо дію, яка пам’ять не відпускає.
Я ганявся за цим на довгоживучих процесах, поруч із повільними запитами, і це не одна знахідка. Запит може гальмувати і пам’ять віддавати. Процес може бути швидким і все одно лишати собі потроху після кожної задачі, поки коробка не скінчиться.
Пам’ять купувати розумно, коли процес повертається до звичного розміру, а те, що лишилось, — чесна робота. Це відстрочка, коли сайт зараз тримається на перезапуску.
1. Три факти, які зліпили в «треба більше RAM»
Ім’я процесу. Чи перезапуск повернув сайт. Скільки тривала тиша. Розведіть їх. Процес, який годину росте і потім убитий, — не той самий інцидент, що один важкий запит, який прийшов і пішов. Перезапуск, після якого тихо до обіду, — це набір. Перезапуск, після якого нічого не змінюється, — інший баг, і пам’ять його теж не пояснить.
Пишіть процес, не «сервер». PHP-запит, який умирає в кінці роботи, пам’ять зазвичай віддає, тому симптом ховається в тому, що живе далі: процес черги, процес на Node, планувальник, усе, що запустили і забули. Не знаєте, в кого стріляє вбивця, — зберетеся купити пам’ять на всю машину через одного невихованого мешканця.
Дивитися треба на копії. На живому сайті ви дізнаєтесь розмір у момент, коли процес уже мертвий, і дізнаєтесь це при клієнтах. Копії з правдоподібним обсягом вистачає. Порожня база ховає і важке читання, і витік: тримати нічого. Єдина жива копія — продакшен: скажіть це вголос і зніміть відновлення до експерименту. Експеримент — не покупка.
2. Одна дія двадцять разів, і три розміри
Візьміть одну дію. Екран, яким користуються, або одну задачу воркера. Розмір до, прогін, пік, розмір знову, коли дія скінчилась і процес стоїть. Повторіть двадцять разів. Вам потрібна сходинка, не графік, яким можна вразити.
Розмір виріс на час дії і спустився, коли дія скінчилась: дія важка. Вона тримала великий набір і відпустила. Це все ще може бути проблемою і причиною, чому один запит умирає, але це не витік. Лагодити — перестати тримати весь набір: читання вужче, потік, ліміт. Більше пам’яті дасть більшому набору пройти один раз і лишить форму на місці.
Розмір ступив угору і лишився після того, як робота скінчилась: щось це тримає. Двадцять повторів роблять драбину очевидною. Кеш, який лише вставляє. Список на процесі, який дописує і ніколи не викидає. Клієнт, буфер або рядок логу, які лишилися на довгоживучому об’єкті. Перезапуск «лагодить» це тим, що викидає драбину. Двадцять перший повтор будує першу сходинку знову.
Тиждень метрик для цього не потрібен. Потрібні база, пік і «після» на одній дії, повтореній. Розмір гуляє без зв’язку з дією — ви взяли не ту дію або не той процес. Це знахідка. Поправте ім’я в нотатці. Не усереднюйте це в рекомендацію купити залізо.
3. Де драбина зазвичай живе
Звичайний PHP-запит погано годиться для нічного витоку: запит скінчився, пам’ять пішла з ним. Спершу процеси, які переживають запит, потім день на одному контролері. Воркери черги і процеси на Node — звичайні мешканці. Їх же ставлять, коли намагаються зробити повільний клік «швидким на дотик», і так драбина з’являється поруч із лагодженням.
Запит усе ще може бути важкою дією. Класика — цикл, який затягує рядки в процес, по запиту на рядок або одним величезним списком, і тримає їх, поки не зібрано відповідь. Це видно і в часі, і в розмірі. Читайте це спершу як проблему запиту. Як групувати slow log і чому цикл легко недорахувати: slow log до того, як різати сервіс. Не переказуйте цю роботу як покупку пам’яті. Якщо після відповіді розмір повернувся, витоку немає. Є читання, яке тримає надто багато, і наступний інструмент — лог.
Розмір не повернувся — лишайтесь на довгоживучому процесі. Воркер, який кладе результат «на наступний раз» у словник без стелі, виглядає здоровим на двадцятому запиті і мертвим на двадцятитисячному. Процес на Node, який тягне буфер, сокет або зростаючий масив через задачі, робить те саме. Коли роботу взагалі варто відводити із запиту і коли повтор не повинен повторити побічний ефект — окреме рішення, воно в нотатці коли процес на Node стоїть поруч із Laravel. Черга не прощає словник, який нічого не забуває. Вона дає йому процес, у якому жити.
4. Чого зайва пам’ять не купує
Вона не називає дію. Вона відсуває вбивство. На тихому продукті це тиждень виглядає як ліки, поки драбина не впреться в нову стелю. На живішому — до завтрашнього вечора. В обох випадках ви поміняли годинник, не сходинку.
Вона не виправдовує переписування сервісу. Драбина часто — маленьке утримання в процесі, який ви якраз хотіли лишити: кеш, клієнт, якого відкривають на задачу і не закривають, масив, у який дописують заради звіту, який ніхто не читає. Новий сервіс, який копіює ці об’єкти, копіює драбину. Ріжте сервіс, коли причина — межа викладки. Не тому, що процес помер, а ім’я в юніт-файлі було незручним.
І вона не замінює копію. Додати пам’ять на живій машині і дивитися на клієнтів, поки гадаєте, — спосіб зустріти наступне вбивство посеред здогаду. Зніміть відновлення. Повторіть дію. Запишіть три числа. Потім вирішуйте, чи більший залишок, після того як процес віддав що міг, ніж машині варто тримати. Лише цей залишок — чесний аргумент за коробку більшу.
5. Порядок на наступний раз, коли «лікує» перезапуск
Назвіть процес, у який стріляють. Підтвердіть, що сайт повернув саме перезапуск, і запишіть, скільки тривала тиша. Підніміть копію з живими рядками. Візьміть одну дію. Розмір до, пік і після, двадцять разів. Спадає — це важке читання, ідіть у запити. Ступає і лишається — шукайте об’єкт, який переживає дію: кеш без стелі, клієнт на кожну задачу, масив, який лише росте. Полагодьте. Ті самі двадцять заміряйте знову. І лише потім говоріть про розмір машини.
Нотатку тримайте біля інциденту, словами, за якими черговий пройде вночі. «Перезапусти» перетворює це на ритуал. Три числа перетворюють це на зміну. Якщо дія — екран, на якому людина чекає, екрану все ще потрібні свої секунди. Пам’ять, яка повертається, може бути повільною відповіддю. Це два рядки однієї нотатки, не одна покупка.
Коли кликати другий погляд
Назвати процес і прогнати двадцять повторів можна без другої людини. Кличте, коли розмір лишається і не видно, хто тримає, коли драбина сидить у воркері, який страшно перезапускати, бо він же шле пошту або списує гроші, або коли єдине середовище — продакшен, а копії ще немає.
Таку роботу я беру: зрозуміти, чи віддає процес пам’ять, на системі, яка у вас уже крутиться, і змінити утримання до того, як хтось змінить розмір коробки. Послуги — така робота зі швидкістю на продакшені. Роботи тримають результат біля операції, а не роздувають один інцидент у розповідь про всю платформу. Якщо потрібен другий погляд, напишіть у LinkedIn ім’я процесу, дію, яку повторювали, і чи повернувся розмір униз. Паролі залиште в себе.