【问题标题】:ASP.NET: are aspx/ascx files accessed from disk on every request?ASP.NET:每次请求时都从磁盘访问 aspx/ascx 文件吗?
【发布时间】:2011-09-11 01:54:41
【问题描述】:

我一直在谷歌上搜索,但找不到答案;答案要么很明显(我需要更多培训),要么深藏在文档中(或没有文档)。一定有人知道这一点。

我一直在与坚持在 ASP.NET 站点上缓存一些静态文件的人争论,我认为没有必要因为一个简单的事实,即所有其他生成动态 HTML 的文件都不会被缓存(默认情况下;让我们现在忽略输出缓存;让我们也忽略人们想到的缓存机制[内存中或网络上])。换句话说,当每个映射到它们的请求都从磁盘读取所有 aspx 文件时,为什么要缓存一些 xml 文件(不管它的访问频率如何)?如果我是对的,通过缓存这些静态文件将获得很少(更少的磁盘读取操作),但会花费更多的内存(如果缓存在内存中)或者会导致更多的网络操作(如果缓存在外部机器上) .有人知道 [通常] 请求一个 aspx 文件时实际上会发生什么吗?谢谢。

【问题讨论】:

  • 程序(如 Word、Unreal Tournament 等)是否在每次输入命令时都从磁盘读取?网络应用程序可能以类似的方式工作......
  • 那么,您是说 IIS 进程如何读取文件一次,将它们存储在内存中,然后监视所有内容的更改,以便它可以更新其缓存版本?这就说得通了。但是,为什么有些开发人员坚持专门缓存一些我们有时作为网站一部分的静态数据文件(例如 xml)(因为这些文件是以相同的方式被 IIS 缓存的)?
  • Xml 文件不是正在运行的 prgram 的一部分,会有明确读取它们的代码,所以在这里缓存是个好主意

标签: asp.net caching static-files


【解决方案1】:

如果我没记错的话,ASPX 文件是在运行时编译的,在第一次访问时。将页面编译为 Page 类的内存中实例后,针对内存中的对象处理对同一资源(ASPX 页面)的请求。所以本质上,它们是相对于磁盘访问被缓存的。

显然,动态内容是为每个请求生成的,除非使用输出缓存机制进行缓存。

关于内存消耗与磁盘访问时间,我不得不说,从性能的角度来看,将对象存储在内存中而不是每次都从磁盘读取它们是有意义的,如果它们经常使用的话。磁盘访问比 RAM 中的访问慢 2 个数量级。尽管不适当的缓存策略可能会将经常使用的对象从内存中挤出,以便为很少使用的对象腾出空间,这可能会因明显的原因而损害性能。话虽如此,缓存对于高性能网站或 Web 应用程序来说非常重要。

作为更新,考虑一下:

  • 典型的 DRAM 访问时间在 50 - 200 纳秒之间
  • 平均磁盘访问时间在 10 - 20 毫秒范围内

这意味着不缓存对磁盘的命中将比访问 RAM 慢约 200 倍。当然,操作系统、硬盘驱动器和介于两者之间的可能其他组件可能会自己进行一些缓存,因此如果您只有几个这样的文件正在读取,那么减速可能只会在第一次命中时发生。

最后,唯一可以确定的方法是进行一些基准测试。 对两种实现进行压力测试并选择最适合您的情况的版本!

【讨论】:

  • 我同意缓存在远程存储内容(例如不同的机器、数据库)或某些需要计算/生成的内容且生成过程需要很长时间的情况下很重要。我不太同意缓存本地文件是必要的:RAM 被使用,文件访问速度足够快。是的,访问 RAM 更快,但如果被滥用(这很容易在不经意间做),性能将从这方面受到影响。
  • @Ha Focokabe,这都是相对的。我不确定您的用例是什么,但是如果您正在从磁盘上的文件中读取(即使用文件 i/o)并且大量请求将需要该资源,并且您有很多或请求(即每秒 100 秒或 1000 秒)然后磁盘访问会减慢你的速度! DRAM 访问时间比磁盘访问快 2 个数量级(约 100 纳秒 vs 约 10 - 20 毫秒)
  • 感谢您的宝贵时间。我会同意的。
  • 同意基准测试是可行的方法,但仅仅因为“从磁盘”访问文件并不意味着实际上会产生磁盘访问成本 - 不同的缓存中内置了许多层现代系统的层,一直到大多数现代硬盘中内置的高速缓存。
【解决方案2】:

IIS 做了大量的缓存,所以直接,没有。但是,IIS 会检查 Web 目录中的任何更改,并在更改时重新加载任何更改的文件。有时 IIS 出现故障,您必须重新启动它才能检测更改,但通常它工作得很好。

附:缓存机制可能会根据服务器使用情况频繁刷新数据,但缓存适用于 web 目录中的所有文件。任何检测到的源代码更改都会导致 IIS 刷新 Web 应用程序并重新编译/重新加载。

【讨论】:

    【解决方案3】:

    我相信您问题的答案取决于您使用的 IIS 版本和配置设置。

    但我相信可以配置 IIS/.Net 的某些组合以避免检查文件 - 有一个 option to pre-compile sites,因此实际上不需要将代码部署到 Web 服务器。

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2014-01-31
      • 2018-09-20
      • 2011-01-23
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多