На недавно запущенной системе free
отчеты об использовании 1,5 ГБ ОЗУ (всего 8 ГБ ОЗУ, 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
(так что вы можете видеть, это не буферы или кеш). Сегодня это закончилось полным сбоем системы: отсутствовал менеджер окон, «зависшие в воздухе» приложения (без рамки) и всплывающее окно, уведомляющее меня о «слишком большом количестве открытых файлов». Отчеты системного журнала:
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
.
Итак, после этого длинного объяснения, наконец, мои вопросы:
- Какие могут быть возможные причины?
- Как я могу лучше определить вовлеченные процессы / приложения?
- Какие шаги можно предпринять, чтобы избежать такого поведения - если не считать перезагрузки машины все X дней?
Я работал 8.04 (Hardy) около 5 лет на моей старой машине, никогда не испытывая подобного (всегда более 100 дней безотказной работы, до перезагрузки, например, для обновления ядра). Теперь это совершенно новая машина со свежей установкой 12.04 . В случае, если это имеет значение, некоторые характеристики:
APU AMD A4-3400 с HD-графикой Radeon (tm), использующий драйвер ATI / Radeon с открытым исходным кодом (поэтому fglrx не установлен), 8 ГБ ОЗУ, WDC WD1002FAEX-0 hdd (1 ТБ), материнская плата Asus F1A75-V Evo. Ubuntu 12.04 64-bit с KDE4 / Plasma. Приложения, которые обычно открываются более или менее постоянно, включают в себя Evolution, Firefox, konsole (с запущенным Midnight Commander, около 4 вкладок) и LibreOffice - плюс иногда Calibre, Gimp и Moneyplex (банковское программное обеспечение, которое я использую уже почти 20 лет, в версии, которая хорошо на Харди).
Изменить:
сегодня я нашел одного из "злых парней": плазменный рабочий стол 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-строчку (я люблю shell и особенно 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 не любит разорвать интернет-соединение. Каждое отключение вызывает небольшое увеличение его открытых файлов, но ничего драматического. С другой стороны, похоже, что плазма также ответственна за это:
Видите падение файловых дескрипторов в конце? Это был перезапуск плазмы.
free
. Переключение на другой DE я на самом деле рассмотрел; если бы был доступен KDE3.5, у меня не было плазмы. Это может быть только временно, чтобы увидеть, если Плазма участвует.
sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
дополнительный баран? Вы можете просматривать открытые файлы программ, используяlsof