Запуск 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