【问题标题】:Memory consumptions skyrocketed after porting from Marten 3 to 5从 Marten 3 移植到 5 后,内存消耗猛增
【发布时间】:2022-06-22 19:16:51
【问题描述】:

我们使用 MartenDB 事件存储和项目事件来读取模型。我们有一个 ASPNET Core API 来查询模型并将其发送到客户端。现在,有一个端点每 10-15 秒从被查询的读取模型中检索一个巨大的文档图(整个 Postgress DB 转储大约为 9 MB),如下所示:

public async Task<Content> GetContent()
{
    var layouts = await GetShallowLayouts();
    var pages = await GetAllPages();
    // ...
    // Other calls to DB 
    // Combine all results into one Content object
    return content;
}

private async Task<IReadOnlyList<Layout>> GetShallowLayouts()
{
    using async var session = DocumentStore.LightweightSession();
    return await session.Query<Layout>()
                       .OrderByDescending(x => x.Brand)
                       .ToListAsync();
}

private async Task<IReadOnlyList<ExperimentWithVariants>> GetExperiments()
{
    using async var session = DocumentStore.LightweightSession();
    return await session.Query<ExperimentWithVariants>()
        .ToListAsync();
}

...

当我们使用 .NET Core 3.1 和 Marten 3.X 时,整个应用程序在 kubernetes pod 中消耗了大约 250MiB(参见下面的屏幕)。

但是当移植到 Marten 5.x 和 NET6 时,内存消耗增加到大约 1.5 GiB (!) 我们尝试进行一些重构,以使所有调用都在一个打开的会话中进行,如下所示:

public async Task<Content> GetContent()
{
    using(var session = DocumentStore.LightweightSession()) 
    {
        var layouts = await GetShallowLayouts(session );
        var pages = await GetAllPages(session );
        // ...
        // Other calls to DB 
        // Combine all results into one Content object
        return content;
    }
}

private async Task<IReadOnlyList<Layout>> GetShallowLayouts(IQuerySession session)
{
    
    return await session.Query<Layout>()
                       .OrderByDescending(x => x.Brand)
                       .ToListAsync();
}

private async Task<IReadOnlyList<ExperimentWithVariants>> GetExperiments(IQuerySession session)
{
    using async var session = DocumentStore.LightweightSession();
    return await session.Query<ExperimentWithVariants>()
        .ToListAsync();
}   

但内存仍约为 1 GiB。

我知道 Marten 中有很多配置设置,其中一些在版本 3 和 4 之间发生了变化,但有没有类似的问题,可以阐明我们应该在哪里寻找解决方案?

【问题讨论】:

    标签: c# kubernetes marten


    【解决方案1】:

    好吧,事实证明 Marten 团队在他们的文档 https://martendb.io/configuration/prebuilding.html 中包含了它,看起来我们低估了 can have significant memory usage 部分:)

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2022-11-11
      • 1970-01-01
      • 2019-10-04
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多