确定两台服务器的 "combined availability" 比率
Determine a "combined availability" ratio for two servers
我需要从两台服务器创建一个 "reliability" 报告 - 服务器 A
和服务器 B
。
两者都跟踪他们的正常运行时间 - 或者更确切地说,在他们不可用的任何情况下。这些记录存储在 SQL 服务器数据库 table
EventID INT (PK)
Server CHAR(1) -- 'A' or 'B'
EventStart DATETIME2(3)
EventEnd DATETIME2(3)
示例数据:
EventID Server EventStart EventEnd
--------------------------------------------------------------------
34 A 2014-12-12 14:00:00.000 2014-12-12 15:00:00.000
35 A 2014-12-20 10:00:00.000 2014-12-21 03:00:00.000
36 A 2014-12-27 16:30:00.000 2014-12-27 17:45:00.000
37 B 2014-12-15 04:00:00.000 2014-12-15 09:35:00.000
38 B 2014-12-20 20:00:00.000 2014-12-20 21:50:00.000
39 B 2014-12-27 15:00:00.000 2014-12-27 17:00:00.000
这些数据行使用 Entity Framework 加载到 .NET 对象中,并在 C# 中进行计算。
现在给定这些项目,我需要确定(对于给定的月份)服务器 'A' 和服务器 'B' 的可靠性如何 - 小菜一碟(只需总结停机时间的总分钟数每个服务器并计算可用性)。
棘手的部分是:我还需要 BOTH 服务器在这个月内关闭的分钟数 - 所以我可以计算 "combined availability" 至少可以访问两台服务器之一。
当然我可以枚举服务器 'A' 的所有条目并检查是否有任何重叠的服务器 'B' 条目 - 但这似乎有点低效。
有没有更明智的方法来做到这一点?我基本上在 C# 中有两个 Event
对象列表,它们具有与 table 具有相同字段的列。
这是一个算法:
- 合并 2 个列表
- 按
EventStart
排序此列表
- 迭代排序列表
- 获取当前和下一个条目,将当前 [
EventStart
、EventEnd
] 与下一个 EventStart
进行比较
- 重叠表示 2 个服务器同时不可用
时间复杂度:O(NLog(N)) = O(O(N) + O(NLog(N)) + O(N))
。 Space 复杂度至少为 O(N)
。其中 N 是两个列表中的项目数。
对于每个事件,导出服务器关闭时的分钟列表(由 DateTime 对象表示)。因此,对于您的示例中的事件 34,这将是 60 个 DateTime 对象。
将服务器的所有停机时间(DateTime 对象)放入该服务器的组合列表中。
使用 linq Union 方法 (http://msdn.microsoft.com/en-us/library/vstudio/bb341731(v=vs.110).aspx) 从两个服务器中找到列表的并集。对 Union 的结果调用 Count 以查找合并的停机时间(以分钟为单位)。
我需要从两台服务器创建一个 "reliability" 报告 - 服务器 A
和服务器 B
。
两者都跟踪他们的正常运行时间 - 或者更确切地说,在他们不可用的任何情况下。这些记录存储在 SQL 服务器数据库 table
EventID INT (PK)
Server CHAR(1) -- 'A' or 'B'
EventStart DATETIME2(3)
EventEnd DATETIME2(3)
示例数据:
EventID Server EventStart EventEnd
--------------------------------------------------------------------
34 A 2014-12-12 14:00:00.000 2014-12-12 15:00:00.000
35 A 2014-12-20 10:00:00.000 2014-12-21 03:00:00.000
36 A 2014-12-27 16:30:00.000 2014-12-27 17:45:00.000
37 B 2014-12-15 04:00:00.000 2014-12-15 09:35:00.000
38 B 2014-12-20 20:00:00.000 2014-12-20 21:50:00.000
39 B 2014-12-27 15:00:00.000 2014-12-27 17:00:00.000
这些数据行使用 Entity Framework 加载到 .NET 对象中,并在 C# 中进行计算。
现在给定这些项目,我需要确定(对于给定的月份)服务器 'A' 和服务器 'B' 的可靠性如何 - 小菜一碟(只需总结停机时间的总分钟数每个服务器并计算可用性)。
棘手的部分是:我还需要 BOTH 服务器在这个月内关闭的分钟数 - 所以我可以计算 "combined availability" 至少可以访问两台服务器之一。
当然我可以枚举服务器 'A' 的所有条目并检查是否有任何重叠的服务器 'B' 条目 - 但这似乎有点低效。
有没有更明智的方法来做到这一点?我基本上在 C# 中有两个 Event
对象列表,它们具有与 table 具有相同字段的列。
这是一个算法:
- 合并 2 个列表
- 按
EventStart
排序此列表
- 迭代排序列表
- 获取当前和下一个条目,将当前 [
EventStart
、EventEnd
] 与下一个EventStart
进行比较
- 重叠表示 2 个服务器同时不可用
时间复杂度:O(NLog(N)) = O(O(N) + O(NLog(N)) + O(N))
。 Space 复杂度至少为 O(N)
。其中 N 是两个列表中的项目数。
对于每个事件,导出服务器关闭时的分钟列表(由 DateTime 对象表示)。因此,对于您的示例中的事件 34,这将是 60 个 DateTime 对象。
将服务器的所有停机时间(DateTime 对象)放入该服务器的组合列表中。
使用 linq Union 方法 (http://msdn.microsoft.com/en-us/library/vstudio/bb341731(v=vs.110).aspx) 从两个服务器中找到列表的并集。对 Union 的结果调用 Count 以查找合并的停机时间(以分钟为单位)。