3
  • 我的应用程序包含一些返回大型结果集的查询(尽管我已经用Take(300)lambda.
  • 在使用高峰期,我看到 Raven.Server.exe 消耗异常大量的 RAM。
    • 事实上,在这些时间里,Raven.Server.exe 会耗尽我服务器的可用 RAM。

我怎样才能避免这种情况?

  • 经过几次谷歌搜索,我可以看到其他人在我之前遇到过这个错误。
  • 但 RavenDB 在过去几年中不断发展,有许多配置代码选项可以限制 Raven.Server.exe 可以消耗的 RAM 量并完全禁用缓存。

谁能告诉我哪些选项适合我的情况?


这是我发现的服务器配置选项:

这是我发现的代码选项:


我很清楚,这个默认设置没有得到尊重:

Raven/MemoryCacheLimitMegabytes

RavenDB 服务器内部文档缓存的最大大小(MB)。 默认值:总系统内存的 50%减去 Esent 缓存的大小。

在我的服务器上,使用 build 2330,没有设置任何自定义配置,Raven.Server.exe 消耗了 95% 的可用 RAM!


编辑:当执行大量读取(而不是写入)时,我能够在测试环境中重现这一点。

4

2 回答 2

9

@Ayende Rahein 比我更了解 RavenDB,但这对我有用:

  1. Take(300)太多了。我需要将其更改为Take(128).
  2. 使用 3.10 GHz 四核客户端机器,我在一个 2.50 GHz 单核服务器上使用Parallel.ForEach循环内的查询。我需要指定并行度:Parallel.ForEach(objects, new ParallelOptions { MaxDegreeOfParallelism = 3 }, currentObject => { /* My Query */ });
  3. 我需要在我的实例 上配置以下选项:DocumentStore_store.Conventions.DisableProfiling = true; _store.Conventions.ShouldCacheRequest = url => false; _store.DisableAggressiveCaching();
  4. 如果我需要分页查询并在单个会话中发出多个批处理请求,我需要以下内容:
    ravenSession.Advanced.Evict(doc); // for each loaded doc

我希望这对其他人有帮助!

于 2013-04-14T15:13:20.303 回答
3

吉姆,不要认为这是一个缓存问题。我认为这是您的索引。您是否有带有多个 from 子句或 SelectMany 的 map/reduce 索引?

此外,处理此类问题的最佳位置是 ravendb 的邮件列表。

于 2013-04-14T05:42:47.397 回答