Безкоштовна оперативна пам'ять зникає - Витік пам'яті?


11

У freeновій запущеній системі, звіти про 1,5G використовували оперативну пам’ять (8G ОЗУ загалом, Ubuntu 12.04 з lightdm і плазмою робочого столу, запустилося одне вікно консолі). Маючи програми, які я використовую, він все ще споживає не більше 2G. Однак, коли система працює пару днів, все більше моєї вільної оперативної пам’яті зникає - не відображаючись у списку використовуваних додатків: тоді як smem --pie=nameзвіти менше ніж 20% використаних (і 80% доступні), все інше говорить по-різному. free -mнаприклад, звіти про 7 день:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

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

kernel: [856738.020829] VFS: file-max limit 752838 reached

Тому я закрив ті програми, які я зміг закрити, і вбив X за допомогою Ctrl-Alt-backspace. Після цього X намагався вийти з програмою failsafeX, але не зміг цього зробити, оскільки не міг більше визначити його конфігурацію. Тому я перейшов на консоль за допомогою Ctrl-Alt-F2, захопив усю інформацію, про яку я міг придумати (vmstat, free, smem proc/meminfo,, lsof, ps aux), і нарешті перезавантажив. X знову придумав failsafeX; цього разу я сказав йому «відновитись із резервної конфігурації», потім перейшов на консоль і успішно використовувався startxдля створення графічного середовища.

Я не маю реального поняття, що викликає цю проблему - хоча це має бути пов'язано або з самим X, або з деякими користувачами, що працюють на X - як після вбивства X, free -mрезультат виглядав так:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(~ 3,5 ГБ звільняється) - для порівняння з результатами після нового запуску:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

Ще два корисні результати надає компанія memstat -u. Незадовго до аварії:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

Після вбивства Х:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

І після перезавантаження, ще в X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

Використання файлової системи протягом одного тижня Використання ядра / процесора протягом тижня

Змінити: Щойно додано два графіки з моєї системи моніторингу. Цікаво побачити: щоразу, коли спостерігається «стрибок» споживання пам’яті, процесор також досягає піку. Щойно я знайшов це зараз - і це нагадує мені ще один показник, що вказує на саму X: Часто, повертаючись до моєї машини та розблоковуючи екран, я знаходив щось, що робило важкі роботи на моєму процесорі. Перевірившись top, це завжди виявлялося /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none.

Тож після цього довгого пояснення нарешті мої запитання:

  1. Які можуть бути можливі причини?
  2. Як я можу краще визначити залучені процеси / програми?
  3. Які кроки можна зробити, щоб уникнути такої поведінки - не перезавантажуючи машину протягом усіх X днів?

Я працював 8.04 (Харді) протягом 5 років на своїй старій машині, ніколи не відчував подібного (завжди більше 100 днів, перш ніж перезавантажувати, наприклад, оновлення ядра). Тепер це повністю нова машина зі свіжою установкою 12.04 . Якщо це має значення, деякі характеристики:

AMD A4-3400 APU з Radeon (tm) HD Graphics, використовуючи драйвер відкритого коду ati / radeon (тому не встановлено fglrx), 8 Гб оперативної пам’яті, WDC WD1002FAEX-0 hdd (1 ТБ), материнську плату Asus F1A75-V Evo. 64-бітний Ubuntu 12.04 з KDE4 / Plasma. Зазвичай програми відкриваються більш-менш постійно, включаючи Evolution, Firefox, konsole (з Midnight Commander працює всередині, близько 4 вкладок) і LibreOffice - плюс інколи Caliber, Gimp та Moneyplex (банківське програмне забезпечення, яке я вже використовую вже майже 20 років, у версії, яка чудово зробила Hardy).

Редагувати: Сьогодні я знайшов одного із "злих хлопців": плазмовий робочий стіл KDE4s. Використовувана пам'ять знову була до 5 Гб, коли я зробив killall plasma-desktop && plasma-desktop. Це звільнило 1,3 Гб оперативної пам’яті! psкаже:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

То де ж були ці 1,3 Гб? Різниця між цими значеннями, якщо їх додати, становить 96 МБ - не 1,3 Гб.

І це може бути лише одна частина, оскільки досі використовується 3,7 ГБ (має бути менше 2 ГБ). Я спостерігав за цим протягом останніх 6 днів за допомогою декількох інструментів: використовувана пам'ять (не кажучи про кеш і буфери) збільшується повільно, але стабільно. Навіть якщо я не за столом, щоб щось запустити ...

Щодо моніторингу процесів з відкритими файлами, я зараз використовую наступний 1-лайн (я люблю оболонку і особливо bash), щоб отримати топ-5:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

Командуйте тут у 4 рядках для кращої читабельності. Звідти нічого ще нічого, крім того, що Skype не любить, що з’єднано Інтернет. Кожне відключення викликає незначне збільшення відкритих файлів, але нічого різкого. З іншого боку, схоже, плазма також відповідає за це:

Використання VFS (2 дні)

Бачите краплю ручок файлів наприкінці? Це був перезапуск плазми.


Чи sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'очищає зайвий баран? Ви можете переглядати відкриті файли програм за допомогоюlsof
Савас Радевич

Також ви спробували переключити менеджерів настільних ПК? наприклад lxde (або lubuntu-desktop)? Нарешті, ви впевнені, що вихід на диск хороший? Ви перевірили дані SMART диска та швидкість копіювання файлів з / на диск за допомогою живого CD?
Саввас Радевич

Перевірте це, щоб перевірити, чи є у вас витік Як виявити витік пам'яті
Мітч

@medigeek: Як я вже зазначив, кеші та буфери - це не проблема. Дивіться вихід free. Перехід на інший DE я насправді вважав; якби KDE3.5 був доступний, я б не закінчив роботу з плазмою. Це може бути лише тимчасовим, щоб дізнатися, чи бере участь плазма.
Іззи

@Mitch: Я розумів, що memprof слід використовувати проти відомого процесу (який я ще не виділив). Впевнені, що його можна використовувати в масштабах усієї системи? Більше того, як підказує помилка "занадто багато відкритих файлів", мені здається, що якийсь процес відкриває багато файлових ручок, ніколи не випускаючи їх. Не впевнений, чи схопив би це memprof. Зараз я створив сценарій для захоплення топ-5 процесів відкритими файлами - сподіваємось, це виявиться злим.
Іззи

Відповіді:


6
  1. Величезна кількість відкритих файлів - хороша підказка, що щось піде не так. Моя здогадка, буде деяким демоном системи KDE.

  2. Відкрийте консоль і запустіть "верх". Потім скористайтесь <і>, щоб змінити стовпчик сортування на VIRT або RES і побачити, які програми використовують найбільше пам'яті. Витік пам’яті виявиться як масово завищене використання віртуальної пам’яті, оскільки після того, як вказівник на просочену пам’ять буде втрачено, він не буде використовуватися і буде замінений. Також запустіть "lsof" і шукайте процес з великою кількістю відкритих файлів, оскільки це, здається, справді є витоком дескриптора файлу.

  3. Відстежте програму та повідомте про помилку.


Я вже намагався використовувати для цього top / htop. Проблема в тому, що вона не показала результатів щодо пам'яті RESident (як описано вище, лише невелика частина використовуваної пам'яті може бути підключена до запущених програм). А що стосується VIRTual пам'яті, то важко інтерпретувати (навіть відразу після запуску, тут віртуальна пам'ять використовувала суми до 3 ТБ - розмір, який навіть мій жорсткий диск не впорався). Таким чином, наприклад, Evolution використовує 1,9 ГБ VIRT, згідно з версією, тоді як загальна пам'ять у використанні становить до 1,2 Гб (без урахування кешу та буферів). І так, мій перший намір - відстежити програму, щоб я міг подати помилку ...
Izzy

Щойно додано 2 імги з моєї системи моніторингу. Схоже, "стрибки" завжди відбувалися в один і той же час дня (хоча 1 виняток). На жаль, зображення не дають часових позначок, щоб перевірити cron. Btw: чи є спосіб відстежити, який процес має кількість відкритих файлів?
Іззи

1
Ваша здогадка була гарна. Хоча це не демон, він в основному був компонентом KDE: плазмою-робочим столом (див. Вище). Забавна річ у цьому: я щойно зрозумів, і розмістив це тут - і через 10 хвилин щодня apt-get update && apt-get upgradeбуло щодня оновлення для плазмового робочого столу; ці хлопці швидкі X) Тепер я лише деякий час спостерігаю за тим, щоб побачити, чи вирішена проблема, перш ніж я оголошу її такою. На сьогоднішній день речі виглядають досить перспективно.
Іззі

Все ще виглядає стабільно. Хоча ні lsofі не topвказувало мені на "злий процес", ваші здогадки щодо демона KDE вказували мене на бік винищувача проблем. Тож ще раз дякую - час роботи моєї машини зараз становить близько 14d, і все ще виглядає стабільно, хоча я навіть паралельно керував такими речами, як VirtualBox, збирання тощо. Тож я вважаю це вирішеним і відмічаю найближчий матч :)
Іззи

0

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

Ви можете прочитати цей блискучий документ (Linux з'їв мого барана), щоб зрозуміти, як Linux керує вашим баранчиком і чому не потрібно хвилюватися:

http://www.linuxatemyram.com/


4
О, я ніколи не чув, що це "нормальна поведінка системи", якщо система виходить з ладу через 7 днів із помилкою "занадто багато відкритих файлів". Я зараз працюю в Linux близько 15 років, ніколи цього не мав. І так, я повністю розумію, як Linux використовує "безкоштовну оперативну пам'ять" (використовуючи її для кешування тощо). Як було зазначено вище: кеш і буфери тут не є проблемою. Я не кажу про те, що оперативна пам’ять використовується з поважних причин - Linux ніколи не буде дотримуватися кеш-пам'яті за ціну заміни.
Іззи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.