У вас виникає проблема Linux Ate My Ram .
Не панікуйте.
Це НЕ проблема.
Ваша система працює як розроблено.
Проблема не у вашій ОС - проблема полягає у вашому розумінні того, що таке "вільна" пам'ять.
Системи Unix використовують пам'ять для більше ніж просто запущених програм. Пам'ять може використовуватися для:
- Запуск програм (активних / використовуваних)
- Дані буферизації під час транзиту (буфери)
- Дані кешування, недавно прочитані з / записані на диск (кеш)
- Абсолютно нічого (безкоштовно)
Далі йде короткий (і значною мірою неповний) огляд того, як сучасні системи Unix повідомляють про використання оперативної пам'яті.
Що таке вільна пам'ять (визначення ОС) ?
Коли система Unix повідомляє про оперативну пам’ять як про вільну, це означає, що "я не використовую цю оперативну пам'ять ні для чого".
Безкоштовна оперативна пам’ять фактично не потрібна - вона не робить вашу систему швидшою, вона просто сидить там, будучи "вільною", якщо щось потрібно. Щось може бути будь-яким із трьох інших пунктів, про які я згадував вище.
Що таке пам'ять кешу та буфера?
Кеш і буферна пам'ять - це оперативна пам’ять, яку використовує операційна система, щоб зробити вашу систему швидшою.
Ця пам'ять зараз не потрібна для запуску програм , тому ваша ОС використовує її для зберігання даних, які їй часто потрібні - наприклад, бібліотека C (потрібна майже для кожної запущеної програми) майже завжди зберігається в cache
пам'яті, тому Системі не потрібно йти на диск, щоб знайти інструкції, необхідні для друку на екрані "Hello World".
Насправді це набагато складніше, ніж це - є спільна пам'ять, провідна пам'ять тощо - але для наших цілей це просте пояснення є адекватним.
Що таке активна пам'ять?
Активна пам'ять - це частина, яку ми розуміємо як "використану" пам'ять - оперативну пам'ять, яку програми використовують для будь-якого, що вони роблять - сортування електронних таблиць, обслуговування веб-сторінок, редагування графіки тощо.
"Активна" пам'ять була "активною" останнім часом - - програма, яка стверджує, що використовувала її вміст (читання чи запис), і не вважається вдалим кандидатом для заміни.
Що таке неактивна пам'ять?
Як і активна пам'ять, неактивна пам'ять - це оперативна пам’ять, яку програми використовують для будь-якого, що вони роблять. Різниця в тому, що до цієї пам’яті не було доступно деякий час, тому, якщо натиснути, щоб підштовхнути ОС, він вважає, що її можна перенести на диск і (з невеликою долею) програма, яка стверджує, що не запитуватиме її знову, так що ніколи не помітить.
Що таке "використовувана" пам'ять (визначення ЛЮДИНИ)
Те, що ми з вами вважаємо «використаною» пам’яттю, це, по суті, сума активної та неактивної пам’яті. Вся оперативна пам’ять, на яку зараз заявлені заявки на їх використання.
Поки ви маєте більше встановленої оперативної пам’яті, ніж сума активної та неактивної пам’яті (плюс хороший запас міцності, скажімо, 512-1024 Мб вгорі), ви знаходитесь в хорошому місці: ваша ОС, ймовірно , не вдарятиметься свопом і не знищує продуктивність .
Що таке "Вільна" пам'ять (визначення ЛЮДИНИ) ?
Те, що ми з вами вважаємо "вільною" пам'яттю, - це пам'ять, доступна для запуску програм.
Це трохи складніше, ніж просто цифра "Безкоштовно", про яку повідомляє ваша ОС. Коли програма запитує оперативну пам'ять, операційна система намагатиметься отримати цю оперативну пам'ять якнайменше руйнівно:
- Якщо є вільна пам'ять (сидіти, не роблячи нічого), буде виділена оперативна пам'ять.
- Якщо немає вільної пам'яті, ОС може канібалізувати простір кешу та буфера: Найменше нещодавно / найменш часто доступні речі в буферному пулі будуть викинуті, а оперативна пам'ять надана програмі.
- Якщо оперативної пам’яті Buffer / Cache немає для канібалізації своппа, він перегляне неактивну пам’ять і вибере регіони, які, на його думку, є найменш вірогідними. Ці дані будуть створені під час завантаження підкачки (диск), а щойно звільнена оперативна пам'ять передана програмі.
- Якщо всі неактивні оперативні пам’яті будуть замінені, він замінить активну оперативну пам’ять на диск.
(Йдеться про те, де продуктивність зазвичай досягає собак. Кожен раз, коли програма отримує свою чергу на процесорі, її замінені біти потрібно повернути в оперативну пам’ять, а це означає, що деякі активні пам'яті програми повинні бути замінені - високий оборот у свопі називається обмолотом )
- Якщо система замінила все, що може (і заповнив розділ swap), або якщо ви працюєте з системою без swap-розділу, погані речі трапляються. У цей момент відбудеться одна з двох речей:
malloc()
не вдасться. Це поведінка, що відповідає POSIX - операційна система скаже програмі просити оперативної пам'яті, що вона не може задовольнити запит.
Програма може або просити менше оперативної пам’яті, або якщо вона не може зробити з меншим шматком пам’яті, вона може очистити та вийти. (Якщо програма погано написана, вона просто вийде з ладу.)
- Якщо ви перебуваєте у вікні Linux, OOM-Killer може продовжувати керувати стилем банди, вбиваючи штрих, припиняючи інші процеси, щоб спробувати звільнити достатню кількість оперативної пам’яті для задоволення запиту.
Якщо ви не можете сказати тут за моїм описом та моєю відповіддю на пов'язане питання, я думаю, що це жахливий спосіб вирішити цю проблему.
Чому безкоштовна оперативна пам’ять піднімається під час видалення файлів?
У прикладі з наведеного тут питання ви помітили, що можна "звільнити" оперативну пам'ять, видаливши файл резервної копії - пояснення цього досить просте: оскільки цей файл нічого не використовує (немає відкритих файлів) і він більше не доступний з файлова система (без зв’язку) ОС знає, що ніхто більше ніколи не матиме доступу до цих даних, і вона очищає дані з кешу файлової системи.
Це робить звіт ОС більше вільною пам'яттю, але не впливає на продуктивність системи.