文件限制 getrlimit(RLIMIT_NOFILE) 失败

文件限制 getrlimit(RLIMIT_NOFILE) 失败

(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

可能是因为我将软限制设置为高?

相关内容