【问题标题】:Why can't I construct `WebAssembly.Memory` in browsers?为什么我不能在浏览器中构造 `WebAssembly.Memory`?
【发布时间】:2019-02-23 15:35:15
【问题描述】:

我在我尝试过的所有浏览器中都偶然发现了一些奇怪的行为:

  • Chromium 69.0.3497.92(官方版本)Arch Linux(64 位)
  • Chrome 69.0.3497.100(官方版本)(64 位)
  • Firefox 62.0(64 位)

当我尝试通过实例化 WebAssembly.Memory 对象为 WebAssembly 分配内存时,例如这样:

new WebAssembly.Memory({ initial: 1 })

在 Chrome/Chromium 中,我得到:

VM274:1 Uncaught RangeError: WebAssembly.Memory(): could not allocate memory
    at <anonymous>:1:1
(anonymous) @ VM274:1

在 Firefox 中,我得到:

Error: out of memory 

分配在 Node.js 中工作得很好,但由于某种原因,我所有的浏览器在这里都失败了。我不知道该怎么做,所有依赖 WebAssembly 的网站都对我无法使用。

我怀疑 Linux 正在阻止浏览器(但不是 node.js?)分配内存,但这只是一个疯狂的猜测。在另一台计算机上几乎相同的安装工作正常,但在这台特定的计算机上,浏览器的每次分配都会失败。

有人知道怎么回事吗?

这是我对ulimit -a 的输出:

-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         unlimited
-m: resident set size (kbytes)      unlimited
-u: processes                       31215
-n: file descriptors                1024
-l: locked-in-memory size (kbytes)  16384
-v: address space (kbytes)          8388608
-x: file locks                      unlimited
-i: pending signals                 31215
-q: bytes in POSIX msg queues       819200
-e: max nice                        0
-r: max rt priority                 99
-N 15:                              unlimited

【问题讨论】:

    标签: javascript linux memory browser webassembly


    【解决方案1】:

    这听起来像是在您的操作系统中设置的限制。在 64 位系统上,浏览器为每个 wasm 内存对象保留 6GB 的虚拟内存(以避免机器代码中的边界检查)。如果您的最大内存有限,您可能会遇到问题。 ulimit 的输出显示每个进程的虚拟地址空间限制为 8GB,这可能解释了这一点。

    也许尝试运行ulimit -v unlimited 看看这是否能改善情况?

    【讨论】:

    • 运行ulimit -v unlimited后,命令ulimit -v仍然报告8388608。显然,不允许将其设置为高于我的物理内存。如果我做ulimit -v 8388609,我会得到ulimit: value exceeds hard limit
    • 假设 ulimit 的系统限制是在配置文件 /etc/security/limits.conf 中设置的,您可以对其进行编辑以提高系统限制并允许您的用户进程有更高的限度。我在这里找到了一个教程:geekswing.com/geek/… 但肯定还有其他的。
    • 我在 Arch Wiki 中看到了关于这个文件的注释,特别是在这篇文章中:wiki.archlinux.org/index.php/Limits.conf 我在我的机器上使用systemd,但我没有修改任何相关的systemd 将控制限制的文件。几个月前,一切正常,所以我不太确定这是否真的是操作系统问题。为什么node.js 不受影响?
    • 这是一个关于 node.js 的好问题。我不知道为什么它没有受到影响,这可能只是虚拟内存映射如何工作的运气。您是否尝试过在测试用例中创建两个记忆?即使您对第一个分配很幸运,这也应该超过 8GB 的​​预算。
    • 是的,我能够在 IIRC 的 Node.js 中使用 { initial: 1 } 创建几百个 WebAssembly.Memorys。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2023-03-06
    • 1970-01-01
    • 2021-01-15
    • 2022-01-10
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多