Как отладить медленный запуск сессии Gnome 3?

После обновления с 11.10 до 12.04 процесс входа в Gnome 3 очень медленный (занимает порядка 60 секунд, когда он был за несколько секунд до обновления (жесткий диск - это твердотельный накопитель!)).

Запуск «top» в VT показывает, что gnome-shell производит около 90% загрузки процессора, в то время как dbus-daemon занимает примерно 10%. Момент, когда загрузка ЦП gnome-shell падает до нормальных уровней (около 2-3%), соответствует времени, когда процесс входа в систему завершается и отображается рабочий стол.

Деактивация четырех установленных расширений оболочки gnome (меню «Альтернативное состояние», кнопка «Выход», «Удалить доступность», системный монитор) не влияет на время запуска сеанса.

Вход в Gnome classic не показывает медленное начало сеанса.

Системные журналы не показывают ничего подозрительного. Таким образом, каков наилучший способ определить основную проблему?

6
задан 4 July 2012 в 12:32

4 ответа

У вас есть много фотографий и вы используете Наутилус? Может быть, на вас влияет LaunchPad Bug 505085 - обширное использование диска gnome-settings-daemon ? См. Комментарии 13 или 18 для обходных путей.

0
ответ дан 4 July 2012 в 12:32

У меня была такая же проблема, и я не знал, как отлаживать. но я деактивировал все расширения оболочки gnome, и тогда он работал отлично. я знаю, что это не точный ответ на вопрос, но он может помочь другим людям с похожими проблемами (медленный вход в сеанс gnome 3)

вы можете отключить его по одному, чтобы узнать, какое расширение создает проблему - или вы деактивируете все и снова активируете один за другим;)

0
ответ дан 4 July 2012 в 12:32

Я знаю, что этот вопрос древний, но он показывается в верхней части результатов Google, поэтому я решил добавить ответ на вопрос в заголовке -

Один из способов определить Проблема работает следующим образом:

Начните входить в свой сеанс, но также есть другой сеанс (как другой пользователь, или в сеансе "tty" (Control + Alt + [F2…]), или через ssh или…) уже открыт с готовым приглашением текстовой оболочки (bash).

Введите (но еще не нажимайте Return) эту команду:

  • вам может понадобиться sudo эта команда, если ваша другая оболочка является другой учетной записью пользователя
  • Это одна длинная строка

gdb attach /usr/bin/gnome-shell $(pgrep -u ваш логин gnome-shell) -ex 'call gjs_dumpstack ()'

например gdb attach /usr/bin/gnome-shell $(pgrep -u jdoe gnome-shell) -ex 'call gjs_dumpstack ()'

Как только оболочка «слишком занята», то есть «поймать ее в действии», в другой вашей оболочке нажмите Return, чтобы перехватить ее. Он заморозит оболочку и может убить вашу попытку входа в систему, но у вас будет обратный след.

Вы получите приветственный баннер от отладчика. (Вам также могут сказать, что вам нужно установить некоторые пакеты debuginfo, по крайней мере, на Fedora, я не уверен, что Ubuntu сделает то же самое, но я предполагаю, что это похоже. На самом деле вам не нужно это для отладки на стороне JavaScript вещей; это применимо только к отладке части кода на C).

Это покажет стек активных функций JavaScript, который почти наверняка покажет виновника.

Более подробную информацию вы можете найти здесь: https://wiki.gnome.org/Projects/GnomeShell/Debugging

0
ответ дан 4 July 2012 в 12:32

У меня была похожая проблема, и я связал ее с системой контактов - я сделал это, запустив strace -p в процессе оболочки gnome и отыскивая содержимое системных вызовов.

Я даю свое возможное решение в своей записи в блоге здесь . Надеюсь, это поможет!

--- /usr/share/gnome-shell/js/ui/overview-dist.js   2012-07-20 13:12:23.564769756 -0700
+++ /usr/share/gnome-shell/js/ui/overview.js    2012-07-20 16:40:14.076527986 -0700
@@ -210,7 +210,7 @@
         this.addSearchProvider(new AppDisplay.AppSearchProvider());
         this.addSearchProvider(new AppDisplay.SettingsSearchProvider());
         this.addSearchProvider(new PlaceDisplay.PlaceSearchProvider());
-        this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
+        // this.addSearchProvider(new ContactDisplay.ContactSearchProvider());

         // Load remote search providers provided by applications
         RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
0
ответ дан 4 July 2012 в 12:32

Другие вопросы по тегам:

Похожие вопросы: