Для чого використовувалася пам'ять Linux? Низький кеш, низький буфер, не VM


11

Перш за все, так, я прочитав LinuxAteMyRAM , який не пояснює мою ситуацію.

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Як показано вище, -/+ buffers/cache:рядок, що показує, вказує, що частота використовуваної пам'яті дуже висока. Однак, з виходу top, я не бачу жодного процесу, що використовував би більше 100 Мб пам'яті.

Отже, для чого використовувалася пам'ять?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

Це машина x86_64 (не сервер загальної марки), на якій працює x84_64 Linux, а не контейнер у віртуальній машині. Ядро ( uname -a):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Вміст /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dfповідомляє про відсутність великого споживання пам'яті з tmpfsфайлових систем.


2
Який результат ps -eo pid,user,args,pmem --sort pmem?
Брайам

Тут вставили посилання , кілька разів спробували, отримали той самий вихід.
Джейсон

3
Не використовуйте head! Я хочу повного виводу повної команди. Якби я хотів, щоб ти використовував, headя би поставив це до своєї команди. Будь ласка, завжди надайте повний висновок команди, яку запитують люди.
Брайам

3
По телефону не пам’ятайте синтаксис у верхній частині моєї голови, але перевірте, чи є спільна пам'ять sysv. Команда - ipcs, я думаю.
дероберт

5
Ви коли-небудь знаходили рішення для цього? - У мене тут подібне питання: superuser.com/questions/793192/…
Hackeron

Відповіді:


4

Пам'ять у Linux може бути дивним звіром для діагностики та розуміння.

При звичайній роботі більшості, якщо не всій, ваша пам'ять буде розподілена на те чи інше завдання. Деякі будуть виділені під поточні процеси переднього плану. Деякі будуть зберігати дані, кешовані з диска. Деякі будуть зберігати дані, пов'язані з процесами, які активно не виконуються в цей конкретний момент часу.

Процес в Linux має власний віртуальний адресний простір (VIRT на виході top). Тут містяться всі дані, пов’язані з процесом, і можна вважати, наскільки "великий" процес. Однак рідко ця пам'ять є активною частиною "реальної" карти пам'яті (ВДЕ на виході top). ВДЕ або пам'ять резидента - це дані, які безпосередньо доступні в оперативній пам'яті в даний момент часу. Тоді також є спільна пам'ять (SHR). Це можна поділити між декількома екземплярами одного і того ж процесу. Таким чином, пам'ять, яка використовується процесом, знаходиться у будь-який момент часу RES плюс SHR, але якщо є більше одного екземпляра процесу, що використовує спільну пам'ять, використання є RES плюс RES RES плюс RES ... plus SHR.

То чому ж різниця між ВДЕ та ВІРТ? Безумовно, якщо процес має блок виділеної пам'яті, йому виділена пам'ять, чи не так? Ні. Пам’ять розподіляється на сторінках, а сторінки можуть бути або Активними, або Неактивними. Активні - це те, що є у ВДЕ. Неактивними є "решта". Вони можуть бути відсунуті в один бік, оскільки до них зараз немає доступу. Це означає, що вони можуть бути замінені на диск, якщо об'єм пам'яті. Але вони не просто йдуть прямо на диск. Спочатку вони сідають у схованку. Ви не хочете постійно обмінюватися, тому між програмою та місцями для розміщення є буфер. Ці буфери постійно змінюються, коли своппер вибирає інший процес для виконання та різні сторінки стають активними та неактивними. І все, що відбувається - спосіб швидкого посту простого людини, щоб не відставати.

І на вершині всього, що є дисковими буферами. Мало того, що неактивна пам'ять переходить у кеш, але коли цей кеш поміняється на диск, він спочатку переходить до дискового буфера, який буде поставлений у чергу для запису. Отже, це другий шар кешу в суміші. Ці дискові буфери також використовуються іншими частинами системи для загального буферизації IO. Тож вони теж постійно змінюються.

Отже, те, що ви бачите в таких речах, як topі freeт. Д., Це або миттєві знімки поточного стану машини, або узагальнена статистика за певний проміжок часу. На той момент, коли ви прочитали дані, вони застаріли.

Будь-який процес може отримати доступ до великої кількості пам'яті, але це рідко доцільно. У будь-якому випадку він не може отримати доступ до всієї пам'яті одразу, тому пам'ять, на яку вона зараз не дивиться, переміщується в кеш, якщо спеціально не позначена як "заблокована в ядрі".

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

Через швидкісний характер звіра та те, що цифри постійно змінюються, цифри можуть навіть змінити частково шляхом обчислення того, що вони є, тому ніколи не можна точно сказати "саме стільки використовується пам'ять" від перспектива користувача. Meminfo - це моментальний знімок, який надає ядро, але оскільки це ядро ​​виконує, то воно не обов'язково показує реальний стан використання будь-яких процесів використання пам'яті, так як жоден процес не виконується активно в цей час - це між процесами.

Як я вже сказав, все це дуже заплутано.

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


6
Це дійсно цікаво, але не відповідає на питання, чому ОП дотримується цієї специфічної невідповідності.
тердон

Я думаю, що єдине реальне невідповідність полягає в очікуванні ОП і тим, що надає Linux. Тобто значення, які надає Linux, просто не складаються, і це тому, що вони вже змінилися.
Majenko

Оскільки ОП насправді не розуміє питання, яке він задає, я не бачу, як можна вибрати "правильну" відповідь. Ми можемо пояснити, як працює система, поки ми не будемо сині в обличчі, але якщо він не зможе зрозуміти ці основи і зрозуміти, що його питання насправді безглуздо, ми ніколи не матимемо «правильної» відповіді.
Majenko

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

5
Ви повинні опублікувати це у своєму блозі. Це добре, але це не актуально тут. Щось дивне відбувається (і я маю на увазі дивне, що йде від того, хто розуміє, що ви написали), оскільки VIRT процесів не враховує все використання оперативної пам'яті, і система не змінюється, незважаючи на тиск.
Жиль

0

Це одна частина відповіді:

Існує різниця між тим, що позначається як "Використовувана" пам'ять (в команді "вільний") і "Пам'ять, виділена активним процесам (користувачеві)" (в / proc / meminfo). Гаразд, тобі ваша система має 48149 Мбайт (приблизно 47 Гбіт)

Якщо ви подивитесь на свою / proc / meminfo, ви побачите: Неактивний: 17296272 kB = (приблизно 16,5 Gb) - неактивна пам'ять може бути від процесів, які закінчилися. Це також може бути пам'ять, яка тривалий час не використовується активним процесом. Пам'ять не "звільняється" лише тому, що процес припинився. Чому? тому що його більше роботи. Ця ж сторінка пам'яті може бути використана знову, тому ядро ​​Linux просто залишає там дані в "неактивному" списку, поки процес не потребує цього.

Ця сторінка пояснює деякі з цього. http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Прочитайте розділ про PFRA (алгоритм відшкодування кадру сторінки), що використовується ядром Linux: "Сторінки, що містяться в кешах диска та пам'яті, на які не посилається жоден процес, повинні бути відтворені перед сторінками, що належать до адресних просторів адресного режиму Користувальницького режиму" "Відновлення" означає перенести їх із "використаних" (неактивних + активних) та "вільних".

Це пояснює управління пам’яттю більш детально: як працюють активні та неактивні списки, і як сторінки переміщуються між ними https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

Я вважаю, що є також пам'ять, яка використовується ядром для структур даних, і що це відображається як "плита 1049464 кб" (~ 1 Гб), я вважаю, але не впевнений, що це рахується окремо.


Просто хотів додати, що в минулому я мав досвід роботи з системою, в якій не вистачало пам'яті через погано написане додаток, який виділяв сегменти спільної пам'яті, але не випускав їх. Сегменти спільної пам’яті зберігалися навіть тоді, коли всі процеси з їх використанням загинули. Це не був Linux, але це може бути правдою і для Linux. як було сказано вище, див. ipcs для отримання інформації про це. див. makelinux.net/alp/035 Тут йдеться про те, що вам потрібно чітко розподілити спільну пам'ять.
ssl

1
Я не розумію всього, про що йдеться у вашій відповіді, але "Неактивна пам'ять могла бути від завершених процесів", безумовно, неправильна. Пам'ять користувача використовується у двох варіантах: картографічна або анонімна. Картована пам'ять завжди може бути відновлена, оскільки дані можуть бути перезавантажені з файлу. Анонімну пам'ять можна повернути, якщо її замінити. Неактивна пам’ять - це пам'ять, яка є хорошим кандидатом на відшкодування; однак вміст має бути у файлі чи десь помінятись, оскільки ця пам'ять все ще використовується. Коли процес вмирає, його пам’ять стає вільною і більше не обліковується в активному + неактивному.
Жиль

1
Деякі посилання: Що може спричинити збільшення неактивної пам'яті та як відновити її? за помилкою сервера; старі, але все ще застосовні поради від Red Hat . І статтю Бхавіна Туракії, яку ви цитуєте; це не є явним у цьому питанні, але він пояснює анонімні та відображені на сторінці сторінки у розділі "Розуміння PFRA".
Жиль

Я роздумував над неактивними сторінками, на які не посилається процес з цієї статті: kernel.org/doc/gorman/html/understand/understand013.html Хоча я вважаю, що це можуть бути сторінки, звільнені процесом, який все ще працює. розділ «Відновлення сторінок зі списків LRU»
ssl

Але, можливо, це стосується лише сторінок у кеш-програмі swap?
ssl

-2

Ви взагалі використовуєте NFS?
Можливо, варто бігти в slabtop -oбудь-якому випадку, nfs_inode_cacheможе вийти з рук.


-4

Цифра, яку ви повинні дивитись, використовується свопом , у вашому виході є "0", це означає, що у вас НЕ закінчилася оперативна пам'ять. Поки ваша система не обміняється пам'яттю, ви не повинні турбуватися про інші цифри, які важко інтерпретувати все одно.

Редагувати: Гаразд, здається, що моя відповідь розглядається як дурний, а не стислий. Тож дозвольте мені детальніше.

Я думаю, головна проблема тут полягає в інтерпретації результатів top / ps, що не дуже точно. Наприклад, багаторазове використання одних і тих же спільних бібліотек не обчислюється так, як ви очікували, див., Наприклад, http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html

Однак мертвим є те, що якщо розмір swap точно дорівнює нулю, то у вашої системи не вистачало пам'яті (поки що). Звичайно, це дуже твердження про курс, але для профілювання вашої системи фактичного використання пам’яті топ не буде правильною справою. (А якщо поглянути зверху, принаймні сортуйте висновок для virt або% mem.)

Дивіться також http://elinux.org/Runtime_Memory_Measurement


1
Ви не повинні турбуватися, якщо ваша система теж заміняється, це нормально. Ви повинні турбуватися, якщо ваша система заміняється занадто часто (що не те саме, що у великого використовуваного місця для заміни). Той факт, що використаний своп 0, сам по собі дивний, маючи так мало вільної фізичної пам'яті.
Жил

добре, його результат свідчить про те, що його система взагалі не проводила заміни. Це, безумовно, оптимальна швидкість заміни. Я не сказав, що невеликий розмір swap - це гарна річ, але нульовий розмір, безумовно, є. І поки в системі фактично не вистачає вільної пам'яті, навіщо їй починати мінятись?
Ехігатор

Ні, відсутність заміни - далеко не оптимальна. Пам'ять програм, які не звикають на даний момент, слід міняти, щоб звільнити місце кеш-диска для часто використовуваних файлів. Що стосується біту, який ви тільки що додали про вихідний результат free, я думаю, ви мали на увазі, top- але навіть тоді сума може бути лише більшою, ніж загальна (бо загальна пам'ять рахується кілька разів), не менше.
Жиль

що ви маєте на увазі під сумою може бути тільки більше не менше? Вгорі відображається лише стільки процесів, скільки вміщено на екрані, я впевнений, що вищезгадані не всі запущені процеси, отже, вони не сортуються за допомогою використання пам'яті, цей фрагмент виводу є досить марним для питання "що використовувало пам'ять" .
Ехігатор

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