页次: 1
最近两个月,我发现只要电脑断网后,然后一段时间不操作设备,火狐就会慢慢吃满内存。等我反映过来的时候,鼠标已经不能移动,只能强制重启了。我也是最近才发现是火狐导致的这个问题,发现过程是把 KDE 的 System Activity 放在窗口最前,然后复现这个问题。等卡死的时候就可以看到火狐的主进程占内存比平常大,然后 CPU 也不正常。请问我该做些什么才能有助于解决这个问题呢?
我的火狐版本是 83.0 (64-bit)。arch 上 uname -a 结果如下:
$ uname -a
Linux thinkpad 5.9.11-arch2-1 #1 SMP PREEMPT Sat, 28 Nov 2020 02:07:22 +0000 x86_64 GNU/Linux
我们学校使用一个叫做哆点的软件来进行校园网认证,该软件同一时间只允许一个帐号在一台设备使用。使用前先连接一个指定的校园网 WIFI,然后登入哆点就可以上网了。每次登入,就会把可能已登入的设备的哆点帐号挤下线,然后被下线的那台设备就不可以上网了。
我每次在另一台设备上把 arch 上的哆点挤下线后,然后一段时间不操作电脑,arch 上的火狐就会吃满内存。
但奇怪的是,只要我在挤下线之前,人为的断连校园网 WIFI,就几乎不会出现火狐就会吃满内存的情况。
今早又出现了这个问题, journalctl -b -1 -n 100 的结果如下:(因为我应该是 10 点 16 分出现的问题,出问题后我就重启了,所以结果中只贴了10点到现在的输出,奇怪的是没有这时刻的信息)
$ journalctl -b -1 -n 100
Dec 28 10:00:23 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:01:34 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:02:45 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:03:56 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:05:08 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:06:19 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:07:30 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:08:41 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:09:52 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:11:03 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:12:14 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:13:25 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:14:13 thinkpad kwin_x11[569]: qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 43658, resource id: 4194378, major code: 15 (QueryTree), minor code: 0
Dec 28 10:14:36 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
Dec 28 10:15:13 thinkpad baloo_file_extractor[1219736]: kf.baloo: Not busy, fast indexing
Dec 28 10:15:48 thinkpad plasmashell[595]: qrc:/plasma/plasmoids/org.kde.plasma.volume/contents/ui/main.qml:494:39: QML StreamListItem: Binding loop detected for property "width"
离线
限制一下火狐的内存占用以避免在出问题时你不能动,比如,启用了 cgroups v2 的话,可以
systemd-run -p MemoryMax=2G --scope firefox ....
没有 cgroups v2 的话,要么用 root 权限跑 systemd-run,要么用 ulimit 来限制内存。
离线
另外你如果没有自己授权过的话,普通用户是查不到系统日志的,只有用户自己的日志。需要 sudo journalctl。
离线
谢谢依云,sudo journalctl -b -1 -n 100 的结果和没 sudo 一模一样。
一开始我也是想用限制火狐内存的思路来克服火狐吃满内存的问题,然后当时就搜了搜 kill process if takes too much memory,挑了个能看懂的 https://askubuntu.com/a/54753/1122866 这个回答,但是跑这个脚本的时候发现每次都要找 PID 挺麻烦的(后来发现 System Activity 里可以列出 PID)。火狐除了主进程之外,还有一些 Web,Web Extension,我不知道要不要把这些也算进去。而且每次都要多留一个 shell 跑这个脚本,于是就放弃了这种方法。
依云说的 cgroups v2 和用 root 权限跑 systemd-run 倒是第一次听说,我试试看。
离线
如果是为了避免系统卡死,可以安装并使用 earlyoom。
该软件默认将在空余内存、空余swap两者均低于10%时,结束 oom_score 值最高的进程,避免系统内存耗尽卡死。
个人建议是安装 earlyoom 之后(避免系统卡死),重复之前操作,在 Firefox 内存使用开始上升,但 firefox 还没有被杀之前,在地址栏中输入 about:memory,生成并保存内存使用报告,搞清究竟是哪部分造成内存使用上升。
离线
谢谢 lily 的建议,我刚又复现了一下,挤下线到内存上升,大概只用了 1 分半左右,而且内存上升的时候压根 measure 不出来,然后就卡死了。
离线
页次: 1