Чому дивно звітує Linux про "вільну" пам'ять?


44

Це канонічне питання про те, як операційні системи Unix повідомляють про використання пам'яті.
Подібні запитання:

У мене є сервер виробництва, на якому працює Debian 6.0.6 Squeeze

# ім'я -а

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Кожен день cron виконує резервний скрипт як root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Все працює чудово, але я помічаю, що графік пам'яті Муніна показує збільшення кешу та буферів після резервного копіювання.

Тоді я просто завантажую резервні файли та видаляю їх. Після видалення графік пам'яті Муніна повертає кеш і буфери до стану, який був до резервного копіювання.

Ось графік Муніна:

Зовнішнє розміщене зображення було мертвою ланкою.


3
Вітаємо, це питання канонізовано (це як 6-ий сьогодні, про це питають, і, буває, є найцікавіший і найкрасивіший приклад :-)
voretaq7

Відповіді:


27

Це та сама «проблема», що і сервер відмовляється використовувати swap-розділ та кілька інших подібних питань на цьому сайті. ( Велике використання пам'яті на Linux сервері , Використання пам'яті в LINUX , Веб-сервер із низьким обсягом пам'яті тощо)

Зверніть увагу на те, що витрата пам'яті відбувається з кешу . Це означає, що це збереження файлу в пам'яті. Кешована пам'ять - це "вільна" пам'ять. Замість того, щоб залишити блок пам'яті порожнім, ваша ОС зберігає нещодавно прочитані файли в цьому просторі. Якщо програмі потрібна ця пам'ять, вона буде використана програмою. До цього часу є шанс врятувати від необхідності повторного читання файлу з диска, якщо на нього часто посилаються.

Відповідно до цього графіка, ваше ефективне споживання пам’яті взагалі не змінилося протягом усієї тривалості графіка.


Чи можна доручити серверу не кешувати ці файли? Я думаю, я повинен бігти sync; echo 3 > /proc/sys/vm/drop_cachesпісля резервного копіювання?

13
@ stan31337 Так, можливо, ні, не варто цього робити. Мати цей файл у пам'яті нічого не коштує. Якщо ви очистите всі свої кеші, кожен файл, який кешується і повинен бути прочитаний знову з диска, просто сповільнить вашу систему. Нехай це робить те, що було призначено робити.
Джефф Ферланд

2
@ stan31337 Коли ви видаляєте резервний файл, ОС автоматично виводить його з кеша (саме тому вільна пам'ять знову скаче після видалення) - Linux досить розумний, щоб знати, що файл не відкритий і не може щоб дістатися до дерева файлової системи більше ніколи не отримають доступ. Як Джефф сказав, що ви точно не хочете скидати весь кеш-пам'ять FS (системі просто доведеться перечитувати та пере кешувати ці дані з диска, що фактично зробить ваш сервер на деякий час повільнішим)
voretaq7

61

У вас виникає проблема Linux Ate My Ram .

Не панікуйте.

Це НЕ проблема.

Ваша система працює як розроблено.

Проблема не у вашій ОС - проблема полягає у вашому розумінні того, що таке "вільна" пам'ять.


Системи Unix використовують пам'ять для більше ніж просто запущених програм. Пам'ять може використовуватися для:

  • Запуск програм (активних / використовуваних)
  • Дані буферизації під час транзиту (буфери)
  • Дані кешування, недавно прочитані з / записані на диск (кеш)
  • Абсолютно нічого (безкоштовно)

Далі йде короткий (і значною мірою неповний) огляд того, як сучасні системи Unix повідомляють про використання оперативної пам'яті.

Що таке вільна пам'ять (визначення ОС) ?

Коли система Unix повідомляє про оперативну пам’ять як про вільну, це означає, що "я не використовую цю оперативну пам'ять ні для чого".
Безкоштовна оперативна пам’ять фактично не потрібна - вона не робить вашу систему швидшою, вона просто сидить там, будучи "вільною", якщо щось потрібно. Щось може бути будь-яким із трьох інших пунктів, про які я згадував вище.

Що таке пам'ять кешу та буфера?

Кеш і буферна пам'ять - це оперативна пам’ять, яку використовує операційна система, щоб зробити вашу систему швидшою.
Ця пам'ять зараз не потрібна для запуску програм , тому ваша ОС використовує її для зберігання даних, які їй часто потрібні - наприклад, бібліотека C (потрібна майже для кожної запущеної програми) майже завжди зберігається в cacheпам'яті, тому Системі не потрібно йти на диск, щоб знайти інструкції, необхідні для друку на екрані "Hello World".
Насправді це набагато складніше, ніж це - є спільна пам'ять, провідна пам'ять тощо - але для наших цілей це просте пояснення є адекватним.

Що таке активна пам'ять?

Активна пам'ять - це частина, яку ми розуміємо як "використану" пам'ять - оперативну пам'ять, яку програми використовують для будь-якого, що вони роблять - сортування електронних таблиць, обслуговування веб-сторінок, редагування графіки тощо.
"Активна" пам'ять була "активною" останнім часом - - програма, яка стверджує, що використовувала її вміст (читання чи запис), і не вважається вдалим кандидатом для заміни.

Що таке неактивна пам'ять?

Як і активна пам'ять, неактивна пам'ять - це оперативна пам’ять, яку програми використовують для будь-якого, що вони роблять. Різниця в тому, що до цієї пам’яті не було доступно деякий час, тому, якщо натиснути, щоб підштовхнути ОС, він вважає, що її можна перенести на диск і (з невеликою долею) програма, яка стверджує, що не запитуватиме її знову, так що ніколи не помітить.

Що таке "використовувана" пам'ять (визначення ЛЮДИНИ)

Те, що ми з вами вважаємо «використаною» пам’яттю, це, по суті, сума активної та неактивної пам’яті. Вся оперативна пам’ять, на яку зараз заявлені заявки на їх використання.
Поки ви маєте більше встановленої оперативної пам’яті, ніж сума активної та неактивної пам’яті (плюс хороший запас міцності, скажімо, 512-1024 Мб вгорі), ви знаходитесь в хорошому місці: ваша ОС, ймовірно , не вдарятиметься свопом і не знищує продуктивність .

Що таке "Вільна" пам'ять (визначення ЛЮДИНИ) ?

Те, що ми з вами вважаємо "вільною" пам'яттю, - це пам'ять, доступна для запуску програм.
Це трохи складніше, ніж просто цифра "Безкоштовно", про яку повідомляє ваша ОС. Коли програма запитує оперативну пам'ять, операційна система намагатиметься отримати цю оперативну пам'ять якнайменше руйнівно:

  • Якщо є вільна пам'ять (сидіти, не роблячи нічого), буде виділена оперативна пам'ять.
  • Якщо немає вільної пам'яті, ОС може канібалізувати простір кешу та буфера: Найменше нещодавно / найменш часто доступні речі в буферному пулі будуть викинуті, а оперативна пам'ять надана програмі.
  • Якщо оперативної пам’яті Buffer / Cache немає для канібалізації своппа, він перегляне неактивну пам’ять і вибере регіони, які, на його думку, є найменш вірогідними. Ці дані будуть створені під час завантаження підкачки (диск), а щойно звільнена оперативна пам'ять передана програмі.
  • Якщо всі неактивні оперативні пам’яті будуть замінені, він замінить активну оперативну пам’ять на диск.
    (Йдеться про те, де продуктивність зазвичай досягає собак. Кожен раз, коли програма отримує свою чергу на процесорі, її замінені біти потрібно повернути в оперативну пам’ять, а це означає, що деякі активні пам'яті програми повинні бути замінені - високий оборот у свопі називається обмолотом )
  • Якщо система замінила все, що може (і заповнив розділ swap), або якщо ви працюєте з системою без swap-розділу, погані речі трапляються. У цей момент відбудеться одна з двох речей:
    • malloc()не вдасться. Це поведінка, що відповідає POSIX - операційна система скаже програмі просити оперативної пам'яті, що вона не може задовольнити запит.
      Програма може або просити менше оперативної пам’яті, або якщо вона не може зробити з меншим шматком пам’яті, вона може очистити та вийти. (Якщо програма погано написана, вона просто вийде з ладу.)
    • Якщо ви перебуваєте у вікні Linux, OOM-Killer може продовжувати керувати стилем банди, вбиваючи штрих, припиняючи інші процеси, щоб спробувати звільнити достатню кількість оперативної пам’яті для задоволення запиту.
      Якщо ви не можете сказати тут за моїм описом та моєю відповіддю на пов'язане питання, я думаю, що це жахливий спосіб вирішити цю проблему.

Чому безкоштовна оперативна пам’ять піднімається під час видалення файлів?

У прикладі з наведеного тут питання ви помітили, що можна "звільнити" оперативну пам'ять, видаливши файл резервної копії - пояснення цього досить просте: оскільки цей файл нічого не використовує (немає відкритих файлів) і він більше не доступний з файлова система (без зв’язку) ОС знає, що ніхто більше ніколи не матиме доступу до цих даних, і вона очищає дані з кешу файлової системи.
Це робить звіт ОС більше вільною пам'яттю, але не впливає на продуктивність системи.


Тепер для мене це абсолютно зрозуміло ... Мій досвід Linux - це десь два місяці, все почалося з цього сервера Debian. Місяць тому я встановив Gentoo на свій домашній ноутбук, і був настільки вражений його продуктивністю, що повністю змінився від користувача Windows на користувача Linux навіть на моєму робочому комп'ютері. Приємно вивчати Linux за допомогою Gentoo, і все ж є багато чого навчитися.

@ stan31337 Ви не єдиний, для кого це незрозуміло - особливо важко людям, які походять з фонового режиму Windows, тому що якщо ви не просвердлите його, Windows не повідомляє про використання пам'яті з таким рівнем деталізації - це просто "Використовується" (програмами ) та "Безкоштовно" (для програм, які можна взяти). Користувачі Mac мають це трохи простіше, тому що Monitor Monitor - це в основному графічна версія topта повідомляє про вільну / провідну / активну / неактивну оперативну пам'ять.
voretaq7

Раніше я працював з Process Explorer у Windows, у ньому було багато предметів пам'яті, але більшість із них були мені настільки незрозумілими, що я насправді не дивився на них ...

2
Крім того, слід зазначити, що, хоча Windows зазвичай не показує це так докладно, він має дуже подібні налаштування.
Йоахім Зауер

Знаєте, навіть у Windows зчитування пам’яті заплутане. Це те, на що виробники ОС можуть хотіти зробити більше уваги, а то, що користувачі повинні менше дбати, ніж вони роблять зараз.
геп

2

Щось ще потрібно перевірити, якщо вищезгадане не вдається:

Перевірте використання кешу Slab ( Slab:, SReclaimable:і SUnreclaim:в /proc/meminfo). Це кеш структур даних в ядрі та є окремим від кешу сторінки, про який повідомляється free.

Якщо кеш-пам’ять відповідає великій частині вашої "відсутньої пам'яті", перевірте, /proc/slabinfoкуди він зник. Якщо це зуби чи вузол, ви можете sync ; echo 2 > /proc/sys/vm/drop_cachesїх позбутися.

Ви також можете скористатися slabtopінструментом для відображення поточного використання кешу Slab у дружньому форматі. cбуде сортувати список за поточним розміром кешу.

Від: https://stackoverflow.com/a/5467207

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.