(32位系统)
发布了问答之前关于 Chrome 由于打开文件限制耗尽而崩溃的问题。
Chrome 自此运行更加流畅(在增加限制之后),但仍然时不时地崩溃。
崩溃报告
查看崩溃报告,它反复出现类似以下内容:
SegvAnalysis:
Segfault happened at: 0xb616c30f: movl $0x1337,0x0
PC (0xb616c30f) ok
source "$0x1337" ok
destination "0x0" (0x00000000) not located in a known VMA region (needed writable region)!
Stack memory exhausted (SP below stack segment)
SegvReason: writing NULL VMA
日志中的看门狗条目通常表示:
... Watchdog[3100]: segfault at 0 ip b613437f sp af8e8cc0 error 6 in chrome[b20d5000+5689000]
从/proc/[PID]/maps
崩溃文件中有:
bfd58000-bfd78000 rwxp 00000000 00:00 0 [stack]
128K 堆栈是哪一个? ( 0xbfd78000 - 0xbfd58000 = 131072
)
从/proc/[PID]/status
崩溃文件中有:
FDSize: 1024
虽然我已将软限制设置为 32K。
但猜测这是针对报告中捕获的过程而不是孩子等。
限制误差
现在,最新更新到版本 40.0.2214.94 后出现了一个新问题。一段时间后(我从 shell 运行 chrome)有重复的条目:
getrlimit(RLIMIT_NOFILE) failed
我通过以下方式设置了打开文件 32768 的限制:
ulimit -Sn 32768
计数法
由于生成和重用等原因,我发现很难检测 Chrome 实际上打开了多少文件,但看起来它正在使用相当多的文件。losof
包括任何内容,但出于好奇,我做了一个测试,看看添加了多少(贪婪的)条目。
在启动 Chrome 之前,losf | wc -l
生成了大约 55K 行。那是在 FireFox 打开的情况下,在多个窗口中包含 80 多个选项卡以及相当多的其他应用程序。
启动 Chrome 后,lsof 计数会变高:
lsof | wc -l
Pre chrome : 55,524
1 window 1 tab : 79,820
1 window 15 tabs : 105,308
2 windows 30 tabs : 141,076
3 windows 40 tabs : 187,285
尝试仅查看chrome
(现在)具有 1 个窗口 2 个选项卡的进程:
sudo lsof -a -p $(pgrep chrome | paste -sd "," -) | wc -l
给出 4380。
问题:
getrlimit
我的问题是这是否与错误(和/或 SigSegv 的错误)有关。
对于像 Chrome 这样的应用程序来说,这个条目数量是否lsof
正常/符合预期?
有什么我可以做的吗“使固定”错误getrlimit
?
可能是因为我将软限制设置为高?