Через що підвищене споживання пам’яті на VPS

З чого можна зробити 2 висновки: 1) хостер некоректно вважає пам'ять (наприклад, вважає так звану віртуальну пам'ять, якій для форка php потрібно дійсно мегабайт 200). При тому, що у випадку нормальної роботи ядра (на фізичній машині, всередині KVM, в openvz з vswap і коректними лімітами) можна зробити allocate на кілька петабайт пам'яті (або скільки там дозволяє 64-бітна архітектура) і вам за це нічого не буде, крім місця, яке у пам'яті займе вказівку на allocate. Грубо кажучи, ядро ​​хостера замість підрахунку пам'яті для віртуалки просто складає одне із значень зайнятої пам'яті (RSS або VIRT, якщо зовсім не пощастило) всім її процесів. При тому, що і RSS, і VIRT не мають жодного стосунку до реального споживання "залізної" пам'яті. І навіть математика із застосуванням SHR не допоможе. 2) у хостера стоїть низький ліміт на якусь із крутилок в openvz. Найбільш популярні - kmemsize ("пиздец апачу") і tcpsockets ("пиздець всім додаткам, що працюють з мережею").

І так. Все це зроблено на основі фрази "сервак падав" і 5 років колупання з різними системами віртуалізації - OOM рознесе всю машину на шматки, але вона пінгуватиметься і по ssh відповідати, якщо пам'яті не буде. Але падати вона нікуди не збереться.

@opium було б дивним, якби графік хостера показував незайняту пам'ять, а в людини було б "ааа, у мене немає пам'яті!". Хостеру довелося б лагодити таку поведінку. Повторюся – проблема у некоректній роботі з пам'яттю. Система думає, що в неї ще є пам'ять (фізична), але за фактом при спробі аллокувати пам'ять ядро ​​хостера каже гостьовій системі "йди в дупу, ти своє з'їла". При тому що гостьова система все одно не усвідомлює, що пам'яті немає і продовжує дурні спробиаллокувати ще. І, звісно ж, не вивільняє пам'ять під нові процеси, оскільки вважає, що вона ще дохрена пам'яті.

Робота з пам'яттю в KVM/Xen виглядає інакше. Системі говорять "на тобі одну плашку фізичної пам'яті на гігабайт і розбирайся сама". У цьому випадку гостьова система здатна коректно працювати з пам'яттю, звільняти її вчасно, алоцірувати ті самі петабайти. Але, якщо прийти і пустотливими ручками обмежити процес віртуалки на 512 мегабайт в dom0-системі (а віртуалка продовжить думати, що у неї гігабайт, як написано в конфізі гіпервізора) - то будуть ті ж самі cannot fork, коли машина впорається в реально зайняті .

Простий приклад для порівняння. До Вас приходять і кажуть – тримай мільйон доларів і витрачай на що хочеш. Купуєш квартиру, підписуєш договір. І тут раптом вриваються дядьки з автоматами і кладуть тебе спати. Виявляється, що на житло з них ти можеш витратити лише 5% (славнозвісний kmemsize, критичний при форці). Ось приблизно те саме в цій ситуації і відбувається.