【发布时间】:2018-11-13 13:45:13
【问题描述】:
我的理解是;
- Foxx 基于 V8 引擎。
- Foxx 是多线程的,它不与其他线程共享状态
- Foxx 的线程将在向客户端发送响应后立即退出(这是正确的术语吗?)。
除了V8引擎的垃圾回收之外,是不是意味着foxx使用的任何内存在响应时都会被垃圾回收?
如果上述问题的答案是肯定的,有没有办法禁用 V8 引擎的垃圾收集器,如果我禁用 V8 引擎的 GC,我可以期待更好的延迟吗?
如果我弄错了,请告诉我。
【问题讨论】:
我的理解是;
除了V8引擎的垃圾回收之外,是不是意味着foxx使用的任何内存在响应时都会被垃圾回收?
如果上述问题的答案是肯定的,有没有办法禁用 V8 引擎的垃圾收集器,如果我禁用 V8 引擎的 GC,我可以期待更好的延迟吗?
如果我弄错了,请告诉我。
【问题讨论】:
与许多其他解释器相比,javascript 解释器有一个特殊的功能。它们需要针对多个浏览器窗口运行,并且一个窗口不应该知道另一个窗口。
因此解释器操作集与其一般逻辑是严格分开的。在
V8 这个概念是以Isolate 的名义实现的。
ArangoDB 生成多个 Isolate,每个上下文都可以运行 Foxx。ArangoDB 的基础设施与 Isolate 有挂钩,可以发出信号,即新集合可用。但是,在 Foxx 中没有可以使用的钩子。
ArangoDB 是多线程的。请求代理将读取请求,如果它发现它应该执行 Foxx-Request(而不是直接 AQL 调用),它将从池中选择一个隔离,并在该 V8 上下文中继续执行。因此,既不能保证您到达同一个工作线程,也不能保证它会在后续请求中选择相同的 Isolate。
这些 Isolate 中的每一个都可以单独进行垃圾收集,而不会阻塞其他 Isolate 中的执行。 ArangoDB Exposes statistics about these contexts ,所以你可以看到隔离物可以被标记为dirty,这意味着它们应该被垃圾收集。您可以使用require("internal").wait(<seconds>, true) 手动调用垃圾回收。产生的上下文的数量取决于您的系统拥有的 CPU 数量。但是,these settings can be configured. 所以你看到的策略与调优 Java GC 有很大的不同。
Foxx 本身会在请求后丢弃服务分配的结构。然后它们将在后续请求中不可用,并且一旦垃圾收集运行,它们的内存将返回给系统。
通常您应该努力使您的 Foxx 服务在您执行的AQL 周围形成一层薄薄的一层。 虽然性能应该被视为一项功能,但您通常会在您的代码达到一定的成熟度时开始查看它。我们解释了howto create usage scenarios and measure and optimize possible throughputs in our blog post series;虽然没有直接提到 Foxx 服务,但那里使用的策略也可以应用于 Foxx。
【讨论】: