Увеличьте скорость sar и выводите таблицу ps каждую минуту. См. мой подробный ответ здесь.
В следующий раз, когда сервер взорвется, используйте sar -r
, чтобы выяснить, когда это произошло. Теперь используйте вывод ps-cronjob или мою perl-обертку для ps на github, чтобы выяснить, какой процесс мог быть виновником.
Допустим, сервер взорвался между 12:00:00 и 13:00:00. Используйте sar -r -s 12:00:00 -e 13:00:00
. После этого вы должны увидеть всплеск в данных. (Если это проще, есть утилита на базе java для построения графиков, но обычно это не стоит хлопот). Допустим, вы видите всплеск (или впадину) в 12:15. Теперь просканируйте вывод ps с колонками в поисках временного диапазона между, скажем, 12:00 и 12:15, отсортируйте его по pid, затем по времени, и посмотрите на колонки памяти:
awk '/^=== .* 12:00:/,/^=== .* 12:16:/' /var/log/sa/ps/today |
sort -k 1n -k 16
(Параметры сортировки предполагают, что время находится в колонке 16, что может быть, а может и не быть). Теперь вы можете снова отфильтровать этот вывод через awk, чтобы найти различия между строками вывода:
... | awk 'lastpid && lastpid==$1 && last != $0 { print} /^[0-9]/ { lastpid=$1;last=$0; }'
Это довольно грубый фильтр. Для некоторых процессов (чья командная строка постоянно меняется, например, для mysql, postgresql и snmpd) это будет не очень полезно, но, надеюсь, вы сможете подправить awk, чтобы найти виновника (виновников).
Вы можете отредактировать /etc/gdm/custom.conf
, чтобы заставить gdm
использовать Xorg
вместо wayland
, который используется по умолчанию.
Добавьте или раскомментируйте это:
[daemon]
WaylandEnable=false
Если i3
также использует wayland
, вам также может потребоваться изменить его конфигурацию. Обратитесь к документации i3
о том, как это сделать. (У меня нет опыта работы сi3
).