💿 Windows Storage: Как вычислить «паршивую овцу» в дисковом массиве?
Бывает, что сервер или кластер (S2D) начинает безбожно тупить, но все статусы светятся зеленым «Healthy». В 90% случаев проблема в одном диске, который еще не сдох, но уже «тормозит» весь массив огромными задержками (latency). 🐌
Стандартный мониторинг это часто пропускает, поэтому лезем под капот к счетчикам надежности (Reliability Counters).
🛠 Скрипт для поиска проблемных дисков:
📊 Как читать результат (нормативы):
1. Read/WriteLatMax_ms: Это пиковая задержка в миллисекундах.
* SSD: Норма до 20ms. Пики > 50ms — повод напрячься. ⚡
* HDD: Норма до 200ms. Пики > 1000ms (1 сек) — диск «умирает» или перегружен. 🐢
2. Read/WriteErrors: В идеальном мире здесь должен быть 0. Любое число больше нуля — это ошибки чтения/записи. Пора проверять кабели, бэкплейн или готовить замену диску. 🛠
💡 Когда запускать?
* Когда SQL или 1С начинают «фризить» без видимых причин. 📉
* При регламентном объезде серверов раз в месяц.
* Если диск периодически отваливается из RAID-массива.
Этот скрипт — твой рентген для дисковой подсистемы. Сохраняй в шпаргалки! 📝
#windows #powershell #storage #sysadmin #troubleshooting #s2d #hardware 🛡
Бывает, что сервер или кластер (S2D) начинает безбожно тупить, но все статусы светятся зеленым «Healthy». В 90% случаев проблема в одном диске, который еще не сдох, но уже «тормозит» весь массив огромными задержками (latency). 🐌
Стандартный мониторинг это часто пропускает, поэтому лезем под капот к счетчикам надежности (Reliability Counters).
🛠 Скрипт для поиска проблемных дисков:
Get-PhysicalDisk | ForEach-Object {
$disk = $_
$stats = $disk | Get-StorageReliabilityCounter
# Пытаемся выцепить имя узла (актуально для кластеров)
$NodeName = "Unknown"
if ($disk.FriendlyName -like "*.*") {
$NodeName = $disk.FriendlyName.Split(".")[1]
}
[PSCustomObject]@{
Node = $NodeName
Model = $disk.Model
MediaType = $disk.MediaType
SerialNumber = $disk.SerialNumber
# Конвертация: 100 наносекунд -> миллисекунды
ReadLatMax_ms = [math]::Round($stats.ReadLatencyMax / 10000, 2)
WriteLatMax_ms = [math]::Round($stats.WriteLatencyMax / 10000, 2)
ReadErrors = $stats.ReadErrorsTotal
WriteErrors = $stats.WriteErrorsTotal
}
} | Sort-Object WriteErrors, WriteLatMax_ms -Descending | Format-Table -AutoSize
📊 Как читать результат (нормативы):
1. Read/WriteLatMax_ms: Это пиковая задержка в миллисекундах.
* SSD: Норма до 20ms. Пики > 50ms — повод напрячься. ⚡
* HDD: Норма до 200ms. Пики > 1000ms (1 сек) — диск «умирает» или перегружен. 🐢
2. Read/WriteErrors: В идеальном мире здесь должен быть 0. Любое число больше нуля — это ошибки чтения/записи. Пора проверять кабели, бэкплейн или готовить замену диску. 🛠
💡 Когда запускать?
* Когда SQL или 1С начинают «фризить» без видимых причин. 📉
* При регламентном объезде серверов раз в месяц.
* Если диск периодически отваливается из RAID-массива.
Этот скрипт — твой рентген для дисковой подсистемы. Сохраняй в шпаргалки! 📝
#windows #powershell #storage #sysadmin #troubleshooting #s2d #hardware 🛡
👍3🔥1👏1