我们构建了一台 Windows 2012R2 服务器(它具有足够的可用内存/磁盘空间、高性能的 CPU),但每 12 小时就会冻结大约半小时。
症状:
无法访问服务器上托管的网站
无法远程访问服务器
调查结果:
- 许多 EventID=508(为了进程管理器),833(为了sql服务器) 在服务器的 EventView 中。
其中一个 EventID=508: svchost (2128) 向文件“C:\Windows\system32\LogFiles\Sum\Svc.log” (偏移量 4775936 (0x000000000048e000)) 写入 4096 (0x00001000) 字节的请求成功,但操作系统处理该请求的时间异常长 (36 秒)。此问题可能是由于硬件故障造成的。请联系您的硬件供应商以获取进一步的帮助以诊断问题。
以下是磁盘性能图表:
你会看见% 空闲时间低于40%,队列长度有时会达到 100。甚至看起来数据收集器在上午 8:37 到 8:50 之间停止工作。
看来瓶颈是磁盘 I/O,导致服务器冻结。但我不知道如何进一步调查。
我的问题:
是% IDEL 时间 < 40%很糟糕?队列长度达到 100 怎么办?
什么原因可能导致数据收集器停止工作?
如果根本原因是硬件故障,那么服务器如何在一天的大部分时间内正常运行?
答案1
啊,总是一样的……
(具有足够的可用内存/磁盘空间,高性能 CPU)
是的,但是您知道您没有谈论什么吗?磁盘性能。
字节成功,但耗时异常长(36 秒)
对磁盘的操作并没有花费几毫秒的时间,而是 36 秒。你基本上得到了一辆 40 吨重的卡车,并抱怨它不如一级方程式赛车快。让我猜一下 - 超慢且大的 SATA 硬盘,每个使用数据库的人要么使用数十个磁盘,要么将数据转移到 SSD,其 IO 容量是高端磁盘的 100 倍。
造成这种情况的原因可能有 4 个:
- 硬件有缺陷。发生了,我们对此无能为力。检查第二台机器。
- 驱动程序缺陷。请参阅第一个主题。
- 糟糕的硬件选择,完全不适合,因为它完全没有提供应用程序所需的 IO 带宽。
最后:
- 不称职的数据库开发人员从未费心学习正确的数据库编程,因此不知道索引是什么,导致每个查询使用的 IO 带宽远远超过其应有的带宽,导致 IO 子系统过载,而这个子系统本来可能已经足够好了。这种情况太常见了。https://use-the-index-luke.com/- 是的,“无能”是友好的说法,你会如何称呼一个因为从未学过驾驶而启动汽车时爆炸的出租车司机;)
这就把事情搞定了。事情同时发生并且只持续半小时的事实表明它不是前两个事件之一 - 前两个事件发生得更随机,即并非总是同时发生。
开始评估硬件容量并检查哪些查询速度较慢。然后尽可能督促程序员完成他们的工作并添加适当的索引。