【问题标题】:Available RAM on shared hosting provider共享主机提供商的可用 RAM
【发布时间】:2009-11-26 00:19:19
【问题描述】:

我正在构建可容纳 50,000 到 150,000 家公司的商业应用程序。每个公司(db 行)由 4-5 个属性/列(标题、位置、...)表示。 ORM 是 LINQ2SQL。

我必须做一些计算,为此我对特定公司有很多查询。现在,每当我需要某些东西时,我都会去 db,它会产生 50-200 个查询,具体取决于计算复杂度。我试图将所有公司都缓存起来,对于 db 中的 10,000 行(公司),它需要大约 5.5MB 的缓存。在这种情况下,我只有一个查询。

这个应用程序将在共享主机服务器上,所以我的资源是有限的。我很感兴趣,如果我尝试加载,比如说 100,000 个公司(行、对象)会发生什么?还是把它放在缓存中?
一般托管公司对 ASP.NET 应用程序是否有任何 RAM 限制?它是否依赖于专用的应用程序池(我可以将应用程序放到专用池中)?

选项是
- 将整个表加载到 c# 对象。 Id 做了一些内存分析,10,000 个对象需要 5MB RAM
- 在需要时查询 db 以获取引用的对象。

任务是:对于给定的公司 A,建立关联公司树。

表格和列
公司:IdCompany、标题、地址、联系人
CompanyConnection:IdParentCompany、IdChildCompany p>

【问题讨论】:

  • 为什么需要 50-200 次查询呢?如果你懒加载大量数据,你应该预加载子行。
  • 每个公司都有一个或多个其他公司的引用(多对多关系)。我在 c# 中有递归函数,它遍历公司树(从父母到每个孩子,等等)并寻找一些东西。当我想获得子公司时,我需要查询 db。也许这一切都可以在存储过程中完成,但我的 SQL 不太好,我正在尝试将我的业务逻辑保留在 c#(DDD 风格的应用程序)中

标签: asp.net performance iis memory hosting


【解决方案1】:

您的共享主机可能是作为虚拟机运行的 Windows Server 上的 IIS 7。这台机器的行为与任何普通机器一样——它不“知道”被共享或虚拟化。

您应该期望 Windows 在物理 RAM 不足时开始分页到磁盘,然后仅当页面文件填满磁盘时才会引发内存不足错误。当然,您永远不想将暖缓存的任何部分分页到磁盘。

Windows 本身可能会开始唠叨您内存不足,但这不是相同的“紧迫性”,应用程序将继续能够请求 RAM,并且将继续获得内存(尽管从页面文件提供服务)。

如果您的应用程序可能崩溃并留下损坏状态或部分事务,那么您应该在开始操作之前进行防御性编码并检查内存是否可用。

使用假装数据在循环中创建预期数量的对象并观察盒子上的内存消耗 - 工作进程的工作集是要观察的。您可以在任务管理器中执行此操作。

注意页面错误。这些是必须将内存操作定向到磁盘的事件。

此外,非常大的对象集可能会导致超过 1 秒的长时间垃圾收集周期。这在交易和市场数据等对时间敏感的应用程序中可能是一个大问题。

希望对您有所帮助。

更新:我为大型数据挖掘应用程序做了类似的缓存。

每个 ORM 类型都有一个 GetObject 方法,该方法使用巨大的缓存或进入磁盘然后更新缓存:Person.GetPerson(检查人员缓存,转到数据库,添加到人员缓存)

现在我的查询只返回结果的唯一键。然后使用上述方法获取每个密钥。在缓存建立之前,这最初很慢,但是...

关键是每个查询结果都指向内存中的同一个实例!这意味着由于共享,RAM 占用空间要小得多。

查询结果也会被缓存。当然。

在对象不是不可变的情况下,每个对象写入都会更新自己在巨型缓存中的实例,但也会导致所有与该类型对象相关的查询缓存自行失效!

当然,在这个应用程序中,写入很少,因为它主要是参考数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多