我已经在 中设置了 ulimit /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 无法使用(它启动,但无限期地等待加载任何页面)
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 ?
答案1
- 为什么 Chromium 与所有其他程序有不同的限制?
Chromium 可能看起来像一个简单的应用程序,但事实并非如此,首先是多线程,它使 chromium 为不同的任务(扩展、选项卡、核心 Web 引擎等)运行多个进程,然后是虚拟化,Chromium 使用许多沙箱来隔离浏览活动使其比其他应用程序使用更多的资源,而且使用的网络引擎也不是一个轻量级的...添加运行所需的不同所需库和其他重资源功能...一些相关文档可用这里, 这里和本文有一些有用的信息。
- “默认”限制来自哪里(Chromium 的限制 4294967296 从哪里来?
4294967296 字节(4096 MB 或 4GB 限制)Chromium 在设计上有 4GB 限制,这是硬编码的,有关此的更多信息可用这里和这里
- 如何在全局范围内一劳永逸地更改所有进程的这些默认限制,无论它们是否使用 pam?
这不是一件容易的任务,但您对大多数常用流程都做得很好,现在对于像 chromium 这样的复杂流程,您需要为每个“特殊”应用程序自定义配置。
对于铬来说,有一些命令参数可用于自定义/启用/禁用功能,您可以尝试使用其中一些来使 chromium 满足您的需求,这里有一些有趣的开关:
这些开关可以与这样的命令行一起使用/usr/bin/chromium --single-process
--single-process
--aggressive-tab-discard
--aggressive-cache-discard
--ui-compositor-memory-limit-when-visible-mb
--disk-cache-dir # Use a specific disk cache location, rather than one derived from the UserDatadir.
--disk-cache-size # Forces the maximum disk space to be used by the disk cache, in bytes.
--force-gpu-mem-available-mb # Sets the total amount of memory that may be allocated for GPU resources
--gpu-program-cache-size-kb # Sets the maximum size of the in-memory gpu program cache, in kb
--mem-pressure-system-reserved-kb # Some platforms typically have very little 'free' memory, but plenty is available in buffers+cached. For such platforms, configure this amount as the portion of buffers+cached memory that should be treated as unavailable. If this switch is not used, a simple pressure heuristic based purely on free memory will be used.
--renderer-process-limit # Overrides the default/calculated limit to the number of renderer processes. Very high values for this setting can lead to high memory/resource usage or instability.
您还可以使用更新 ulimit 的脚本来运行 chromium(请注意,低于 4GB 的值可能会使浏览器崩溃......)
ulimit -Sv 4352000000 #4.2GB
/usr/bin/chromium
# or 0.42GB, it works but the browser may crash
#ulimit -Sv 435200000 #0.42GB
#/usr/bin/chromium
答案2
在现代 64 位系统上,没有合理的理由限制 VM 空间。
VM 空间用于映射任何内存,而不仅仅是物理内存。当前计算中大量虚拟机数据最常见的用法是稀疏缓冲区,其中物理内存中仅包含一小部分的文件或数据库,而虚拟内存中包含全部数据,并有一个例程根据需要透明地加载它。
您想要限制物理数据内存的使用,即使在那里,您也应该使用 /sys 和/或 /proc/sys 中的设置来执行此操作,而不是 ulimit,因为这会正确地向程序发出内存不足的信号,而不仅仅是出现故障。
老实说,ulimit 是一个肮脏的老黑客,除了防止多用户系统上的拒绝服务攻击之外,实际上没有什么用处。
答案3
我在使用 Chrome 时遇到了同样的问题,通常是在流媒体电视频道时。您的错误消息为您提供了答案:
添加ignore_rlimit_data
到GRUB_CMDLINE_LINUX_DEFAULT进入/etc/default/grub
.更新 grub,然后重新启动。