Через що підвищене споживання пам’яті на 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, критичний при форці). Ось приблизно те саме в цій ситуації і відбувається.