【问题标题】:calculate uptime/downtime for a service计算服务的正常运行时间/停机时间
【发布时间】:2015-05-04 06:15:47
【问题描述】:

我有一个自定义解决方案,每 1 小时检查一次网站是否在线。

结果是这样的:(每天有一个条目)

一天(每小时)有 24 个条目。并且每个小时都有一个可用性百分比(100%、95%、0%……等等)。

我的问题是:

  • 如何以百分比形式获得正常运行时间和停机时间?

  • 如何使用两个日期DateTime 之间的这些值计算正常运行时间和停机时间并以秒为单位获得结果?

正常运行时间很容易:

  • 所有值的总和除以 24(条目),即 99.67%

那么对于停机时间,我可以只做 100 - 99.67 = 0.33 % 吗?

我在获取两个日期之间的正常运行时间/停机时间(以秒为单位)时遇到了一些问题DateTime

例如:如果范围日期是 20.04.2015 - 26.05.2015

我想我应该这样做:

如上所述计算每天的正常运行时间(所有每日值的总和除以 24 个条目)并假设以下值:

  • 20.04.2015:96.67%
  • 21.04.2015:100.00%
  • 22.04.2015:92.00%
  • 23.04.2015:96.67%
  • 2015 年 4 月 24 日:100.00%
  • 25.04.2015:100.00%
  • 2015 年 4 月 26 日:100.00%

现在上述值的总和除以天数(20.04 和 26.04 之间的 7 天),这使得 97.91 % 在 20.04 和 26.04 之间可用。

我假设在几秒钟内获得 97.91% 的正常运行时间我应该这样做:

 CultureInfo provider = CultureInfo.InvariantCulture;

 DateTime first = DateTime.ParseExact("20.04.2015", "dd.MM.yyyy", provider);
 DateTime last = DateTime.ParseExact("26.04.2015", "dd.MM.yyyy", provider);

 TimeSpan time = last - first;

 decimal secondsUptime = ((time.Days * 86400)/100) * 97.91m;  //97.91 is the uptime calculated above for the time period. 

 // The problem is how to get this?

 decimal secondsDowntime = ?

到目前为止我所做的,这是正确的方法吗?

如何获取 secondsDowntime?

【问题讨论】:

  • 简单。制作一张 24 行的表格,每小时一个。然后获取每个值的小时,并在表格中输入一个值。百分比是表中的条目数除以 24。
  • 我已经有表了,所有数据都保存好了。条目数除以 24?因此,如果我在上述日期之间有 7 个条目(每天一个条目)并将每 24 个条目除以 0.29,那么百分比是多少?
  • 如果你已经知道如何计算正常运行时间百分比,那么使用100-UpTimePrecent 获取停机时间百分比有什么问题?计算的时间跨度与这部分计算无关。
  • 你应该看看“TotalSeconds”,顺便说一句。
  • 请记住,有些日子分别有 23 小时和 25 小时 - 夏季/冬季时间会发生变化。

标签: c#


【解决方案1】:

如果您已经有了正常运行时间百分比,那么您所要做的就是非常简单的数学运算:

decimal PercentDownTime = 100 - PercentUpTime;
decimal SecondsUpTime = (time.Seconds / 100) * PercentUpTime;
decimal SecondsDownTime = (time.Seconds / 100) * PercentDownTime;

感谢Robert 提醒我们TimeSpanTotalSeconds 属性,但是在这种情况下使用Seconds 属性是可以的。

【讨论】:

  • 好的,现在我明白你在评论中的意思了。因此,基本上还将该期间的停机时间计算为 100 - 正常运行时间,然后以与正常运行时间相同的方式计算秒数。伟大的。你睁开了我的眼睛:) 但是我想我会使用@Robert 的建议,使用time.TotalSeconds 而不是计算days * secondsInOneDay。再次感谢您!
  • 我已经编辑了我的答案,也感谢罗伯特。
  • 或者time.Seconds也:)
  • 很高兴它现在可以工作了。 .net 工具箱中有很多方便的东西。
  • @Aron 夏季时间和闰秒是个问题,但与我建议的解决方案无关
【解决方案2】:

等等……你输入的数字是错误的。如果您每小时测量一次并显示每小时结果,那么您的 11:00 怎么有 97%?它应该是 100% 或 0%,它的上升或下降那个小时......除非你在那一小时内实际上做了更多的计算......但即使那样,要获得 97,你也必须在那一小时和 3 次中至少进行 100 次测试其中一个倒下了。

但是如果你的数字是正确的,那么公式是这样的......

正常运行时间百分比 =(正常运行时间百分比之和)/(测量次数)×100

正常运行时间 % =(正常运行时间总和)/24 × 100

停机时间 % = 100 -(正常运行时间 %)

正常运行时间秒数 =(测量或考虑的小时数)× 3600 ×(正常运行时间 %)/100

停机秒数 =(衡量或考虑的小时数 × 3600)-(正常运行时间秒数)

注意 3600 是一小时内的秒数,因此我们将小时数乘以得到所需的秒数单位。

注意将 uptime % 替换为 0 到 100 之间的数字。不是 0 和 1。如果您使用 0 到 1,则不要将最后一次除以 100。

【讨论】:

  • 提到的值是虚拟值,但是还有另一个系统可以进行实际检查+额外的计算和数据的保存。我的示例仅用于演示目的:)
  • 假设每天 24 小时失败。
  • 这不是 24 小时,而是 24 次测量。我用“测量次数”的值代替了给我们的值。
猜你喜欢
  • 2021-08-29
  • 1970-01-01
  • 2019-12-19
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多