了解 Cro request/response 周期和内存使用

Understanding Cro request/response cycle and memory use

我对 Cro 如何处理客户端请求感到有点困惑,特别是为什么有些请求似乎会导致 Cro 的内存使用量激增。

literal "Hello world!" Cro server.

中显示了这方面的一个最小示例
use Cro::HTTP::Router;
use Cro::HTTP::Server;

my $application = route {
    get -> {
        content 'text/html', 'Hello Cro!';
    }
}

my Cro::Service $service = Cro::HTTP::Server.new:
    :host<localhost>, :port<10000>, :$application;

$service.start;

react whenever signal(SIGINT) {
    $service.stop;
    exit;
}

该服务器所做的只是用“Hello Cro!”响应 GET 请求。 – 这当然不应该很费力。但是,如果我导航到 localhost:10000 然后快速刷新页面,我注意到 Cro 的内存使用开始攀升(然后保持升高)。

这似乎只在刷新快速时发生,这表明该问题可能与未正确关闭连接或并发问题有关(可能略微-相关 ).

这个“Hello world”服务器是否为简单起见省略了一些性能技术或最佳实践?还是我遗漏了有关 Cro 设计工作原理的其他信息?

Cro 请求处理管道是一个 supply 块链,请求和响应通过这些块。关于要创建的最佳处理线程数的决定留给 Raku ThreadPoolScheduler 实现。

就连接生命周期而言,它取决于客户端(即 Web 浏览器)如何急切地关闭连接;如果浏览器使用 keep-alive HTTP/1.1 连接或保留 HTTP/2.0 连接,Cro 会尊重该请求。

关于内存使用,增长到一定程度并不奇怪;如果它最终没有趋于平稳,这只是一个问题。原因包括:

  • 调度程序确定需要更多线程来处理负载。每个 OS 线程在 VM 内部都有一些开销,其中大部分是 GC 托儿所是每个线程以允许简单的 bump-the-pointer 分配。
  • MoarVM 优化器将内存用于专用字节码和 JIT-compiled 机器代码,它在应用程序运行时在后台生成,并由已执行足够次数的某些代码位驱动。
  • GC 试图收敛到完全收集阈值。