Linux не звільняє кеш-пам'ять великого диска, коли попит на пам'ять зростає


24

Запуск Ubuntu на ядрі 2.6.31-302 x86-64. Загальна проблема полягає в тому, що у мене є пам'ять у категорії "кешування", яка продовжує зростати і не буде звільнена або використана навіть тоді, коли наша програма потребує цього.

Тож ось що я виходжу з команди «вільний». Нічого з цього на перший погляд не виглядає звичайним.

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

Перше, що хтось скаже - "Не хвилюйтеся, Linux керує цією пам'яттю автоматично". Так, я знаю, як повинен працювати менеджер пам'яті; проблема полягає в тому, що це не правильно робити. "Кешований" 1,4 Гб тут, схоже, зарезервований і непридатний для використання.

Мої знання Linux говорять мені про те, що 3 ГБ "безкоштовно"; але поведінка системи говорить інакше. Коли під час пікового використання використовується 1,6 ГБ реальної вільної пам'яті, як тільки вимагається більше пам’яті (а «вільний» у першій колонці наближається до 0), вбивця OOM викликається, процеси вбиваються, і проблеми починають виникати незважаючи на те, що "вільний" у рядку - / + буфер / кеш все ще містить близько 1,4 ГБ "безкоштовно".

Я налаштував значення oom_adj на ключові процеси, щоб вона не приводила систему на коліна, але навіть тоді важливі процеси будуть вбиті, і ми ніколи не хочемо досягти цієї точки. Особливо, коли теоретично 1,4 Гб все ще є "вільним", якби він лише витягнув дисковий кеш.

Хтось має уявлення, що тут відбувається? Інтернет заповнений тупими питаннями про команду "вільне" Linux та "чому я не маю вільної пам'яті", і через це я нічого не можу знайти з цього приводу.

Перше, що спливає мені в голову, - це те, що своп вимкнено. Ми маємо сисадмін, який неприхильний до цього; Я відкритий для пояснень, якщо вони є резервними копіями. Чи може це спричинити проблеми?

Ось безкоштовно після запуску echo 3 > /proc/sys/vm/drop_caches:

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5731688    1626804          0        524    1406000
-/+ buffers/cache:    4325164    3033328
Swap:            0          0          0

Як бачимо, деяка мізерна кількість кешу фактично звільнена, але близько 1,4 ГБ, здається, "застрягло". Інша проблема полягає в тому, що ця величина, здається, з часом зростає. На іншому сервері застрягло 2,0 ГБ.

Мені б дуже хотілося повернути цю пам'ять ... будь-яка допомога була б дуже вдячна.

Ось cat /proc/meminfoякщо варто чогось:

# cat /proc/meminfo 
MemTotal:        7358492 kB
MemFree:         1472180 kB
Buffers:            5328 kB
Cached:          1435456 kB
SwapCached:            0 kB
Active:          5524644 kB
Inactive:          41380 kB
Active(anon):    5492108 kB
Inactive(anon):        0 kB
Active(file):      32536 kB
Inactive(file):    41380 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               320 kB
Writeback:             0 kB
AnonPages:       4125252 kB
Mapped:            42536 kB
Slab:              29432 kB
SReclaimable:      13872 kB
SUnreclaim:        15560 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3679244 kB
Committed_AS:    7223012 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7696 kB
VmallocChunk:   34359729675 kB
DirectMap4k:     7340032 kB
DirectMap2M:           0 kB

3
Я не маю жодних пояснень щодо вашого кешу (хоча я підозрюю, що файли mmap'd, ймовірно, потрапляють у нього), але для блага людства візьміть лопату та трохи негашеного вапна та позбудьтесь "вам не потрібен своп якщо у вас багато оперативної пам'яті! " бустер. Вони не застраховані від раціонального обговорення, і вони небезпечно помиляються. Те, що убивця ООМ переслідує вас, - лише один із симптомів цього.
живіт

Мої думки точно. Дякую за пораду. Чи знаєте ви якісь хороші статті чи аргументи щодо того, чому потрібен своп?
trisweb

6
Тому що якщо у вас немає своп, такі речі трапляються. Але не турбуйтеся намагатися посперечатися зі своїм заперечувачем своп; або перервіть негашене вапно, або скажіть, "якщо ви не хочете тут міняти місцями, ви виправляєте цей безлад, який ви наполягали на створенні". Вони або зрештою самі передумають, або помруть, намагаючись. Проблема вирішена в будь-якому випадку.
жіноча

Відмінно, дякую за поради. Ви, до речі, мали рацію щодо файлів mmap'd - швидкий lsof показав гіги файлів журналів, що займають пам'ять. Видалення їх вирішило питання.
trisweb

Проблема полягає в тому, що без свопінгу, перевиконання результатів у запуску вбивці OOM і не перевищення результатів в системі, яка не може запустити процеси. Для ефективного використання оперативної пам’яті вам потрібен своп.
Девід Шварц

Відповіді:


8

Я знайшов відповідь на власне запитання - завдяки допомозі жінки (подайте відповідь, якщо вам подобається).

lsof -s показує ручки файлів, які використовуються, і виявляється, було кілька гігабайт файлів журналу mmap'd, що займають кеш.

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

Я також повторно включу своп, щоб у нас більше не було проблем із вбивцею OOM. Спасибі.


2
Сторінки mmap'd не можна видалити, тому не слід спричиняти закріплення кешу. Ви використовуєте рамбу?
psusi

Привіт, вибачте, що викопав стару тему, але наразі я стикаюся з тією самою проблемою і lsof -sне показую жодного незвичного використання. Однак я використовую рамковий файл, як ви сказали [та ядро ​​2.6.10, яке не має функції drop_caches]. Як ви вважаєте, що це підозрюваний?
Рам

1
Дякую за пораду! Я зараз додаю lsof -s | sort -rnk 7 | lessдо своєї панелі інструментів. Примітка для інших читачів: це можуть бути великі записи /proc/net/rpc/nfs4.nametoid/channel, але вони не виявилися винуватцями в моєму випадку.
Миколай

переконайтеся, що у великих файлах чи програмах не використовується mlock. в /proc/meminfoпогляді на «Unevictable» сторінок.
Майкл Мартинес

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