Firefox 为什么会卡住,如何才能摆脱卡住?

Firefox 为什么会卡住,如何才能摆脱卡住?

Firefox 已挂起。通常我会用 -1、-9 或 -15 来杀死它,但这一次,该死的,我想找出原因。我有大约一个小时的时间可以浪费在这上面,并寻求高于实际解决问题的教育。

目标:让 Firefox 实例再次运行,而不杀死它并重新启动。

Firefox 运行良好,但由于内存使用过多而运行缓慢。我在大约一千个浏览器窗口中打开了阿伏加德罗的多个选项卡。 (可能涉及一些夸张。)我正在关闭一些选项卡,此时浏览器窗口停止重新绘制其内容。拖动不相关的窗口会导致这些窗口的残留物永远留在那里。无论 WM_PAINT 的 X11 等价物是什么,它都会被忽略。尝试通过单击电子邮件中的 URL 来启动新的 Firefox 只会弹出一个错误消息,提示“Firefox 已在运行,但没有响应”。

Firefox 的进程 ID 为 9297。
进程 526 是 Windows 管理器。

=> ps axl |查询 9297

0  1000  9297   526  13  -7 6080428 4465776 poll_s S<sl ?     11602:12 firefox
0  1000 20000  9297  20   0      0     0 exit   Z    ?        216:31 [plugin-containe] <defunct>

(我正在和 renice 一起玩,看看优先级是否与 Firefox 挂起有关。没有。但我把它保留为 -7。)

=> ps -efL |查询 9297

darenw    9297   526  9297 57   61 Sep22 ?        6-23:10:34 firefox 
darenw    9297   526  9300  0   61 Sep22 ?        00:00:00 firefox
darenw    9297   526  9301  0   61 Sep22 ?        00:00:00 firefox 
... dozens like these ...
darenw    9297   526  7607  0   61 16:17 ?        00:00:00 firefox
darenw    9297   526  7657  0   61 16:17 ?        00:00:00 firefox
darenw   20000  9297 20000  1    1 Sep23 ?        03:34:36 [plugin-containe] <defunct>

=> ps axl | grep 20000

0  1000 20000  9297  20   0      0     0 exit   Z    ?        216:31 [plugin-containe] <defunct>

这个问题之所以持续存在,是因为主线程 9297 尚未通过获取其退出代码来结束该线程。至少,这是我对“失效”流程的理解。我不知道如何进一步调查这个细节,或者如何确定这是否是 Firefox 挂起的原因。

=> strace -f -p 9297

...
[pid 13945] <... select resumed> )      = 0 (Timeout)                  
[pid 13945] select(0, NULL, NULL, NULL, {0, 10000}) = 0 (Timeout)                                                                                                  
[pid 13945] select(0, NULL, NULL, NULL, {0, 10000} <unfinished ...>                                                                                                      
[pid  9356] <... futex resumed> )       = -1 ETIMEDOUT (Connection timed out)                                                                                            
[pid  9356] futex(0x7f28b7df8be8, FUTEX_WAKE_PRIVATE, 1) = 0                                                                                                             
[pid  9356] futex(0x7f28b7df8c14, FUTEX_WAIT_BITSET_PRIVATE, 1, {6910910, 806929252}, ffffffff <unfinished ...>           
...

只要我让 strace 运行,就会重复相同的六行,尽管有时任一 PID 只有两行而不是三行。除了这两个之外,我没有看到任何其他 pid 的提及。

=> ps axl | grep 13945

4     0  4985 23253  20   0  11064  2236 pipe_w S+   pts/19     0:00 grep 13945

=> ps axl | grep 9356

4     0  5111 23253  20   0  11064  2232 pipe_w S+   pts/19     0:00 grep 9356

那么13945和9356这两个进程是什么?

=> ps -eL | grep 9297 |grep 9356
9297 9356 ? 02:02:50 软件VsyncTh 9297 13945? 01:04:15 火狐浏览器

那么SoftwareVsyncTh是什么?谷歌并没有多大帮助。此符号出现在“ps”输出以及其他进程和线程列表中,但不会出现在任何在线源代码或以特定方式提及它的问答论坛中。据我所知,它和这两个进程与 Firefox 卡住且无法绘制窗口无关。

我可以使用哪些进一步的命令来发现更多线索?有没有一种方法可以获取窗口和选项卡及其网址的列表,并从 shell 命令行关闭一个(最可疑/垃圾邮件的网址)?

好吧,无论这些发生了什么,我发现我可以在主线程上获得一些信息:

=> strace -p 9297

--- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TKILL, si_pid=9297, si_uid=1000} ---
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
poll([{fd=23, events=POLLPRI|POLLOUT}], 1, 5000) = ? ERESTART_RESTARTBLOCK (Interrupted by signal) 

一遍又一遍地重复,没有任何变化。

我不是线程、进程、互斥体和 futexes 等方面的天才,但也许通过解决这个谜团,我会成为其中之一!我只需要了解更多命令来进一步调查,并了解 strace 结果中到底发生了什么,这可能与 Firefox 的挂起有关。

我可以尝试使用任何命令来让 Firefox 重新启动吗?

系统规格:四核英特尔处理器,16GB,Arch Linux 上次更新大约在一两个月前。使用icewm、多个工作区和许多文本编辑器、PDF 查看器、浏览器和任何打开的东西。运行 conky 以在屏幕左上角显示 RAM 和交换空间使用情况。我通常处于交换的边缘。

相关内容