我已经在/etc/security/limits.conf
. 当我以用户身份正常登录我的桌面环境时testuser
(使用 slimlogin
管理器),一切正常。
当我testuser
通过Xephyr
(从我的另一个会话作为另一个用户)以用户身份登录时,除了chromium
浏览器之外一切正常。这是我得到的错误dmesg
:
Chrome_ChildIOT (2472): VmData 4310827008 exceed data ulimit 4294967296. Update limits or use boot option ignore_rlimit_data.
并且铬无法使用(它会启动,但会无限期地等待加载任何页面)
chromium
除了设置正确的限制之外的所有其他程序。我已经使用以下方法验证了这一点:
find /proc/ -maxdepth 1 -user testuser -exec cat {}/limits \; | grep 'Max data size'
全部PIDs
设置Max data size
为无限制:
Max data size unlimited unlimited bytes
除了chromium
进程:
Max data size 4294967296 4294967296 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
Max data size 17179869184 17179869184 bytes
我想了解:
1)为什么chromium
与所有其他程序有不同的限制?
2)“默认”限制来自哪里(铬从哪里获得限制4294967296
?
3)我如何才能一劳永逸地更改这些默认限制,全局,所有进程,无论它们是否使用 pam ?
Chromium 可能看起来像一个简单的应用程序,但事实并非如此,首先是多线程,它使 Chromium 为不同的任务(扩展、选项卡、核心 Web 引擎等)运行多个进程,然后是虚拟化,Chromium 使用许多沙箱来隔离使其比其他应用程序使用更多资源的浏览活动,而且使用的网络引擎也不是一个轻量级的...添加运行所需的不同库和其他繁重的资源功能...一些相关文档可以在这里, 这里和这篇文章有一些有用的信息。
4294967296 字节(4096 MB 或 4GB 限制)铬的设计限制为 4GB,这是硬编码的,有关此的更多信息可在此处和此处获得
这不是一件容易的事,但你在最常用的过程中做得很好,现在对于像铬这样的复杂过程,你需要为每个“特殊”应用程序自定义配置。
对于 chromium,有一些命令参数可用于自定义/启用/禁用功能,您可以尝试使用其中一些来使 chromium 适合您的需求,这里有一些有趣的开关:
这些开关可以与这样的命令行一起使用
/usr/bin/chromium --single-process
您还可以使用更新 ulimit 的脚本运行 chromium(请注意,低于 4GB 的值可能会使浏览器崩溃......)
在现代 64 位系统上,没有合理的理由限制 VM 空间。
VM 空间用于任何内存映射,而不仅仅是物理内存。在当前计算中,大量 VM 数据最常见的用法是稀疏缓冲区,其中只有一小部分在物理内存中的文件或数据库将整个内容都放在虚拟内存中,并有一个例程根据需要透明地加载它.
您想限制物理数据内存的使用,即使在那里您也应该使用 /sys 和/或 /proc/sys 中的设置来执行此操作,而不是 ulimit,因为这会正确地向程序发出内存不足的信号,而不仅仅是故障。
老实说,ulimit 是一个肮脏的老黑客,除了防止对多用户系统的拒绝服务攻击之外,它对任何事情都没有多大好处。
我在使用 Chrome 时遇到了同样的问题,通常是在流式传输电视频道时。您的错误消息为您提供了答案:
添加
ignore_rlimit_data
到 . 中的GRUB_CMDLINE_LINUX_DEFAULT条目/etc/default/grub
。更新 grub,然后重新启动。