从 11.10 升级到 12.04 之后,Gnome 3 的登录过程变得非常慢(升级前只需几秒钟,现在需要 60 秒左右(硬盘是 SSD!))。
在 VT 中运行“top”显示 gnome-shell 产生大约 90% 的 CPU 负载,而 dbus-daemon 大约占用 10%。gnome-shell 的 CPU 负载降至正常水平(大约 2-3%)的时刻对应于登录过程终止并显示桌面的时间。
停用我安装的四个 gnome-shell 扩展(备用状态菜单、退出按钮、删除辅助功能、系统监视器)对会话启动时间没有任何影响。
登录 Gnome classic 不会显示缓慢的会话启动。
系统日志没有显示任何可疑内容。那么,识别潜在问题的最佳方法是什么?
答案1
我知道这个问题很古老,但它出现在谷歌搜索结果的顶部附近,所以我想我会在标题中给出这个问题的答案——
识别问题的一种方法如下:
开始登录到您的会话,但同时还打开了另一个会话(作为另一个用户,或在“tty”会话(Control+Alt+[F2…]),或通过 ssh,或...),并准备好文本 shell(bash)提示符。
输入(但不要按回车键)此命令:
sudo
如果你的其他 shell 是不同的用户帐户,则可能需要此命令- 这是一条很长的线
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 ()'
一旦 shell “太忙”,即“立即发现它”,则在另一个 shell 中按回车键来捕获它。它将冻结 shell 并可能终止您的登录尝试,但您将获得回溯。
您将从调试器获得欢迎横幅。(您可能还会被告知需要安装一些 debuginfo 包,至少在 Fedora 上,我不确定 Ubuntu 是否会做同样的事情,但我认为它是相似的。您实际上不需要这些来调试 JavaScript 方面的事情;这仅适用于调试代码的 C 部分。)
这将显示活动的 JavaScript 函数堆栈,几乎肯定会显示罪魁祸首。
您可以在这里找到更多详细信息:https://wiki.gnome.org/Projects/GnomeShell/Debugging
答案2
我遇到了类似的问题,并将其归结为联系人系统——我通过运行strace -p
gnome-shell 进程并查找系统调用的内容来实现这一点。
我给出了最终的解决方案在我的博客条目中。希望有帮助!
--- /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));
答案3
您有很多图片并且使用 Nautilus 吗?也许您受到以下影响:LaunchPad Bug 505085 - gnome-settings-daemon 大量占用磁盘空间? 查看评论十三或者18寻找解决方法。
答案4
我有同样的问题,但不知道如何调试。但我停用了所有 gnome shell 扩展,然后它就正常工作了。我知道这不是问题的确切答案,但它可能对有类似问题的其他人有所帮助(gnome 3 会话登录缓慢)
您可以逐个停用以找出哪个扩展产生了问题 - 或者您全部停用并再次逐个激活;)