【问题标题】:ASP.NET Application state - Creating a "requests per minute" counterASP.NET 应用程序状态 - 创建“每分钟请求数”计数器
【发布时间】:2014-11-14 07:23:39
【问题描述】:

这一定很容易,但我的大脑拒绝解决。

在 ASP.net 中,使用应用程序状态创建全局“页面请求计数器”非常简单。只需增加一个应用程序变量:

Application("Hitcount") = Application("HitCount") + 1 

或其他。但是,我将如何仅衡量过去一分钟内收到的点击量?我需要对过去 60 秒内的应用程序命中数进行持续计数,以使我能够对传入请求进行一些流量管理。例如。如果当前负载超过每分钟 1,000 次点击,则重定向到某个地方。

【问题讨论】:

  • 在数据库(或应用程序)中插入“命中记录”和时间戳。然后您的查询将检索过去 10 分钟左右每分钟的平均请求数。
  • 已经有很多可以通过 Windows 获得的指标(尽管它们往往是每秒而不是每分钟)。有很多网站提供了关于哪些可能最重要以及为什么最重要的建议,例如Important IIS7 Counters.

标签: c# asp.net vb.net counter state


【解决方案1】:

您可能最好使用日志分析工具,该工具可以通过分析请求日志为您提供这些统计信息,并使用更宽的时间窗口。有一些相当不错的功能可以让您在历史查看时间窗口之间切换并查看一天、一周、一个月的高峰流量。

我建议您不要将命中记录插入到数据库中,除非您的站点数量很少。除非您确定性能开销在允许的容差范围内,否则请避免将您的请求延迟与数据库联系起来。 Instrumentation 应该努力不实际影响它所测量的服务器,除了非常轻微的开销,这就是事后日志分析工作良好的原因。

首要任务是调整 IIS 以添加一些非默认字段,这些字段是标准 W3C 日志记录格式的一部分。

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/676400bc-8969-4aa7-851a-9319490a9bbb.mspx?mfr=true

配置这些高级字段的一种方法是通过 IIS 管理器,在 -> Logging Logging -> Select Fields 下

需要字节 recvd/sent 和 timespent 等字段才能使用第 3 方分析器之一来获得好的图表。

【讨论】:

  • OP 如何根据 IIS 日志中的数据进行重定向?
  • @Shoe - 重定向与分析网站流量有什么关系?
  • 按照OP的最后一句话if the current load is over 1,000 hits per minute then redirect somewhere.
  • 哦,我第一次没看,你是对的,日志分析不是实时的,不能解决问题。我会推荐一个智能防火墙或负载平衡器,即使是运行 Linux 的基于虚拟机的免费负载平衡器也可以做到这一点。
【解决方案2】:

您也许可以使用内存缓存来做到这一点。这将计算 10 分钟内的滚动请求计数。不过,我还没有测试过它的性能。

public BaseController() : base() 
{
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTime.UtcNow.AddMinutes(10);

    MemoryCache.Default.Add(Guid.NewGuid(), "RequestCount", policy);
}

public int RequestCountPerMinute
{
    get
    {
        return MemoryCache.Default
           .Where(kv => kv.Value.ToString() == "RequestCount").Count() / 10;
    }
}

【讨论】:

  • 参考http://stackoverflow.com/a/16689455/1115360 在我看来,这将无法在应用程序池重新启动后幸存下来,并且可能不会承受极端的内存压力。
  • @AndrewMorton 应用程序池重启没什么大不了的。建立滚动平均值只需 10 分钟。如果我们只关心“过去一分钟”,您可以将缓存策略更改为 60 秒。
  • 谢谢你;缓存过期策略是一个很好的解决方案。但是我发现使用“MemoryCache.Default.Add()”对我来说有点不稳定,而且似乎经常重置。目前与 'cache.insert()' 配合良好,有效期为 60 秒。
猜你喜欢
  • 2020-02-28
  • 2015-06-14
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2016-01-09
  • 2017-02-02
相关资源
最近更新 更多