我正在使用 Ubuntu 20.04,以 i3 作为窗口管理器,但安装了 gnome 子系统。
我遇到一个问题,在重新启动后的某个随机间隔(几小时或几天)内,任何打开 thunar 或 nautilus 的尝试,或者任何应用程序(例如 Firefox)打开文件对话框的尝试要么需要一分钟或更长时间才能打开,要么永远超时并需要我终止应用程序。
我如何才能找出造成此延迟的应用程序、文件、扩展或驱动程序?
我尝试了以下方法:
- 以 root 身份运行-应用程序速度与往常一样快。
- 禁用跟踪器(按照这里)
- libgoa 似乎是最新的(按照这个)
- 尝试过 pulseaudio hack这里
- 使用 strace 运行 nautilus ;下面的几行有 30 秒的间隙,但我不确定如何解释它(fd=24 是某个文件描述符?)
journalctl
下面显示了 nautilus 最终工作的情况
我有几台设置非常相似的机器,只有一台有此行为。我不知道哪个应用程序或库是罪魁祸首。
输出strace -t -o /tmp/nautilus nautilus
:
20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 poll([{fd=24, events=POLLIN}], 1, 0) = 1 ([{fd=24, revents=POLLIN}])
20:15:32 read(24, "\1\0\0\0\0\0\0\0", 16) = 8
20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 futex(0x56241fa9c880, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:15:32 close(24) = 0
20:15:32 eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK) = 24
20:15:32 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 write(6, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:32 futex(0x56241ef26dc0, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 futex(0x56241ef26910, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 futex(0x56241ef1c038, FUTEX_WAKE_PRIVATE, 1) = 1
20:15:32 poll([{fd=24, events=POLLIN}], 1, 25000) = 1 ([{fd=24, revents=POLLIN}])
20:15:32 read(24, "\1\0\0\0\0\0\0\0", 16) = 8
20:15:32 poll([{fd=24, events=POLLIN}], 1, 25000) = 0 (Timeout)
20:15:57 write(24, "\1\0\0\0\0\0\0\0", 8) = 8
20:15:57 futex(0x56241fa9c880, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:15:57 close(24) = 0
摘自期刊:
Apr 20 20:32:35 aubrey dbus-daemon[1180]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.134190' (uid=1000 pid=1450204 comm="nautilus " label="unconfined")
Apr 20 20:32:35 aubrey systemd[1]: Starting Hostname Service...
Apr 20 20:32:35 aubrey dbus-daemon[1180]: [system] Successfully activated service 'org.freedesktop.hostname1'
Apr 20 20:32:35 aubrey systemd[1]: Started Hostname Service.
Apr 20 20:32:35 aubrey nautilus[1450204]: Called "net usershare info" but it failed: Failed to execute child process “net” (No such file or directory)
Apr 20 20:32:45 aubrey ddclient[1450366]: WARNING: file /var/cache/ddclient/ddclient.cache, line 3: Invalid Value for keyword 'ip' =
编辑:
上述跟踪只是输出strace -t -o /tmp/nautilus nautilus
- 一个非常详细的日志,但tail -f
我能够在它挂起的地方检查它,在那里我可以看到一个条目,随后是20:15:32 poll([{fd=7, events=POLLIN}], 1, 25000) = 0 (Timeout)
30 多秒的无内容(然后它启动并且再次变得非常详细)。
如果我没看错的话,lsof 报告的 fd 如下所示:
nautilus 1719429 coljac 7u a_inode 0,13 0 17491 [eventfd]
排名靠前的条目strace -c nautilus
如下(是的,民意调查是第一名):
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
22.70 0.011333 2 3988 poll
16.55 0.008265 1 5018 4490 stat
9.31 0.004647 2 1966 131 futex
7.73 0.003859 1 2119 1385 recvmsg
7.33 0.003660 1 3612 1441 openat
4.76 0.002375 2 1038 436 access
4.29 0.002140 1 1424 read
3.60 0.001799 1 1356 105 readlink
3.50 0.001748 0 1868 mmap
3.30 0.001646 8 188 getdents64
3.14 0.001568 0 2232 close
2.38 0.001188 0 1758 fstat
2.14 0.001067 0 1150 munmap
1.99 0.000993 2 337 writev
1.67 0.000833 92 9 clone
1.57 0.000782 2 367 write
1.47 0.000733 3 190 mprotect
输出自lsof | wc -l
:1340334
编辑2:
目前,thunar 根本无法打开 - 它会失败并显示消息Failed to register: Timeout was reached
。输出strace -c thunar
如下:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
50.53 0.002814 3 882 792 openat
28.21 0.001571 4 354 mmap
4.79 0.000267 2 96 read
3.75 0.000209 2 90 fstat
3.54 0.000197 2 96 close
3.48 0.000194 1 109 mprotect
1.87 0.000104 5 18 poll
1.45 0.000081 0 165 1 futex
1.31 0.000073 2 28 write
...
如果我运行,strace -t thunar
在它挂起之前我也会在输出中看到这一点:
futex(0x564445b9ff70, FUTEX_WAKE_PRIVATE, 1) = 1
poll([{fd=7, events=POLLIN}], 1, 25000) = 1 ([{fd=7, revents=POLLIN}])
read(7, "\1\0\0\0\0\0\0\0", 16) = 8
poll([{fd=7, events=POLLIN}], 1, 25000
lsof -p <pid>
返回以下内容:
thunar 2036483 coljac 7u a_inode 0,13 0 17491 [eventfd]
一些strace thunar
无法打开的 outout 如下:
20:29:32 read(7, "\1\0\0\0\0\0\0\0", 16) = 8
20:29:32 poll([{fd=7, events=POLLIN}], 1, 25000) = 0 (Timeout)
20:29:58 write(7, "\1\0\0\0\0\0\0\0", 8) = 8
20:29:58 futex(0x5566ad906ba0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
20:29:58 close(7) = 0
20:29:58 write(6, "\1\0\0\0\0\0\0\0", 8) = 8
20:29:58 futex(0x5566ad8e1f70, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 futex(0x5566ad8e1b90, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 futex(0x5566ad8d9058, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/charset.alias", O_RDONLY) = -1 ENOENT (No such file or directory)
20:29:58 write(2, "Failed to register: Timeout was "..., 40) = 40
20:29:58 poll([{fd=4, events=POLLIN}], 1, 0) = 1 ([{fd=4, revents=POLLIN}])
20:29:58 read(4, "\1\0\0\0\0\0\0\0", 16) = 8
20:29:58 futex(0x7f0dccfb72a0, FUTEX_WAKE_PRIVATE, 1) = 1
20:29:58 poll([{fd=4, events=POLLIN}], 1, 0) = 0 (Timeout)
进一步的 strace 输出是在 pastebin 上。
答案1
多年来我一直有同样的问题,因为我的正常运行时间通常至少为一个月。一段时间后,所有使用系统提供的文件打开对话框的程序似乎都会挂起或等待几分钟。
您可以运行以下命令来 kill gvfsd-trash
,之后所有挂起并等待文件对话框的程序都应立即恢复工作。
pkill gvfsd-trash
另一件需要注意的事情是,gvfsd-trash
一段时间后会重新启动,可能是由caja
或任何其他文件浏览器或系统文件打开对话框本身重新启动。这不是我遇到的第一个问题gvfsd-trash
,我开始心生怨恨,但是,我不想卸载gvfsd
,我需要它来通过 MTP 安装 USB 拇指驱动器和我的智能手机。因此,我选择了强力解决方案,并仅使gvfsd-trash
二进制文件无法访问,例如,通过重命名它:
sudo mv /usr/libexec/gvfsd-trash{,.bak}
它可能位于不同系统的另一个位置,请尝试询问您的数据包管理器,例如通过调用:
dpkg -L gvfs-daemons | grep trash
请注意其含义。如果没有它,gvfsd-trash
您将无法trash:///
通过文件浏览器访问特殊 URI 路径!就我个人而言,我从未使用过它。您还可以手动访问每个挂载点和主目录中的文件夹中已删除的文件.Trash
,例如:
~/.local/share/Trash
/media/mounted-external-harddrive/.Trash
看起来问题出在 gvfsd-trash 和 D-Bus 的组合上。似乎有一个合适的问题gvfs 错误跟踪器中的问题已经修复,但尚未推广到我的系统。
多年来,我一直使用不同的解决方案,即在新的 DBus 会话中启动每个程序,方法是在最重要的程序(如 Firefox 和文本编辑器)前面加上前缀dbus-launch
。然而,这会带来一些问题,因为每个会话将产生至少五个gvfsd
进程,并且可能还有其他进程,并且 D-Bus 会话不会通过关闭其中打开的程序而关闭,而且 D-Bus 会话的总数量是有限的,所以过一段时间后,您将无法启动程序。
答案2
诊断
我猜你正在展示 strace 日志的摘录,指出发生延迟的位置。如果你发布strace
你使用的完整命令,那将会很有用。
可能导致罪魁祸首的行为:
当
strace
dnautilus
运行时,在另一个终端使用$ pidof nautilus $ lsof -p <pidno>
<pidno>
上一个命令返回的 PID 在哪里。这可以让你检查哪些文件描述符(回答你的问题:是的)strace 日志指的是(来源less
)。由于输出通常很长,因此您可能需要使用管道传输输出。选项
-c
可以进一步帮助识别瓶颈流程(来源),你的可能是poll
。摘自以下man strace
页面:-c --summary-only Count time, calls, and errors for each system call and report a summary on program exit, suppressing the regular output. This attempts to show system time (CPU time spent running in the kernel) independent of wall clock time. If -c is used with -f, only aggregate totals for all traced processes are kept.
这是输出的示例
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 18,29 0,009128 4 2058 mmap 15,19 0,007580 7 989 1 poll 11,96 0,005967 2 2465 318 openat 6,76 0,003374 1 2187 close ...
检查鹦鹉螺号和雷神号发射延迟的其他实例,以确认类似的模式。
应用上述命令以及任何进一步的诊断命令,与根实例(您提到它)进行比较工作正常...,我想你的意思是...有时对于普通用户来说,延迟已经出现) 生产。
考虑问题可能与文件描述符的可用性等有关,请参见这。
请发布完整的输出
$ bash -c 'time strace -fc nautilus' $ bash -c 'time strace -fc thunar' $ bash -c 'strace -fc time nautilus' $ bash -c 'strace -fc time thunar'
请说明您是否移动了主目录,是否有不同的 Ubuntu 版本并进行了更新等。这可能是相关的。另外,尝试创建一个临时用户,看看问题是否出现。这将是与 root 进行比较的额外证据。
編輯:通过对 的用户数 和 进行比较
<you>
,tester
可以root
看出bash -c 'time strace -fc nautilus'
在启动时可能花费约 30 秒的时间方面存在以下本质区别:<you>
:(org.gnome.Nautilus:2641915): Tracker-WARNING **: 18:30:21.999: Falling back to bus backend, the direct backend failed to initialize: Could not find datab ase file:'/home/coljac/.cache/tracker/meta.db'.
tester
:(org.gnome.Nautilus:2976790): dbind-WARNING **: 20:45:38.814: Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken. strace: Process 2976919 attached strace: Process 2976920 attached ** (org.gnome.Nautilus:2976790): WARNING **: 20:46:04.102: Unable to get contents of the bookmarks file: Error opening file /home/tester/.gtk-bookmarks: No such file or directory
root
:** (org.gnome.Nautilus:2980894): WARNING **: 21:00:42.191: Unable to get contents of the bookmarks file: Error opening file /root/.gtk-bookmarks: No such file or directory ** (org.gnome.Nautilus:2980894): WARNING **: 21:00:42.191: Unable to get contents of the bookmarks file: Error opening file /root/.gtk-bookmarks: No such file or directory strace: Process 2980907 attached Nautilus-Share-Message: 21:00:42.241: Called "net usershare info" but it failed: Failed to execute child process “net” (No such file or directory)
因此,
tester
vs.root
会显示一个有助于诊断的警告。奇怪的是, 并没有显示相同的警告<you>
。
解决方案
我会等到你在建议的诊断之后发布更多信息。与此同时,我给出了一个(核弹?)解决方法。我假设你的“几台设置非常相似的机器”是彼此的某种克隆(至少在开始时)。如果是这样,你没有找到解决方案(之后诊断),如果你对此感到困扰,你可以尝试从你的一个工作系统再次克隆,clonezilla
例如
有关的
答案3
感谢这里的答案和线索。
我相信我通过改变解决了这个问题
AutoMount=true
在AutoMount=false
/usr/share/gvfs/mounts/trash.mount
我注销并重新登录,一切正常。还卸载了以下软件包
xdg-desktop-portal
xdg-desktop-portal-gtk
就像建议的那样这篇 Reddit 帖子。
答案4
按照 mxmlnkn 的出色回答,我实现了一个简单的一次性 systemd 服务,它可以终止 gvfdsd-trash 并阻止其再次运行。当无人值守升级重新安装 /usr/libexec/gvfsd-trash 时,这很有用。
在 /usr/local/bin/clean-gvfsd-垃圾:
$ sudo tee /usr/local/bin/clean-gvfsd-trash << EOF > /dev/null
#!/bin/bash
pkill gvfsd-trash
path=$(dpkg -L gvfs-daemons | grep gvfsd-trash|xargs realpath|uniq)
mv $path{,.bak} || true
EOF
$ sudo chmod u+x /usr/local/bin/clean-gvfsd-trash
/lib/systemd/system/clean-gvfsd-trash.service:
$ sudo tee /lib/systemd/system/clean-gvfsd-trash.service << EOF > /dev/null
[Unit]
Description=kill gvfsd-trash and prevent it from ever running again
Documentation=https://askubuntu.com/questions/1341909/file-browser-and-file-dialogs-take-a-long-time-to-open-or-fail-to-open-in-all-ap
[Service]
ExecStart=/usr/local/bin/clean-gvfsd-trash
Type=oneshot
RemainAfterExit=no
[Install]
WantedBy=multi-user.target
EOF
服务激活:
$ sudo systemctl daemon-reload
$ sudo systemctl enable clean-gvfsd-trash.service
$ sudo systemctl start clean-gvfsd-trash.service