вторник, 22 ноября 2011 г.

Сколько проживет SSD

Немного провокационный заголовок, не так ли? На самом деле я не собираюсь тут приводить процедуру расчета времени жизни SSD. Хочу написать о другом. Сегодня коллега задал вопрос: “Есть ли счетчик, который помог бы определить, сколько данных записано на диск. И вообще, как определить количество данных, записанных на диск?”. Собственно тут хотел бы привести свое видение ответа, так сказать.
Как оказалось – нет в perfmon такого счетчика. Ну, нет и все тут. Вероятно, есть на то какие-то причины. Но интересующие данные, судя по всему, получить таки можно. На ответ наткнулся совсем случайно. Для того чтобы получить нужные цифры можно воспользоваться утилитой fsutil. А конкретно, командой, например fsutil fsinfo statistics g: Утилита возвращает кучу всего, и, в частности значение UserFileWriteBytes, которое, похоже, и показывает нужную информацию. Стоит отметить, что эти данные, видимо, сбрасываются при перезагрузке. Ну и в качестве тренировки написал скрипт, который парсит все это счастье и возвращает хэш-таблицу с нужными данными:
function Get-DiskStats ($diskLetter){
 if (Test-Path $diskLetter) {
    (fsutil fsinfo statistics $diskLetter) | `
    where {$_.length -ne 0} | `
    %{$_.replace(" ","")} | `
    % {$_ -match "(?\w+):(?[0-9]{1,})"; $matches} | `
    % {$ret = @{}} {$ret["$($_.name)"]=$_.value}
    return $ret}
 else {Write-Error "There is no disk $diskLetter"; return $null}
}

Get-DiskStats g:

Подозреваю правда, что информацию можно получить так же при помощи ETW. Вот только как – не углублялся пока. PS. Некоторые изменения к плану. Если вы хотите собрать данные с работающего сервера за некоторый промежуток времени - вы можете поступить следующим образом.
1. Получить статистику на начальный момент времени:
Get-DiskStats c: | Export-Clixml c:\Files\disk.xml
Этим самым вы сохраните начальные данные в файл xml.
2. На конечный момент можно поступить следующим образом:
$old = Import-Clixml c:\Files\disk.xml
$new = Get-DiskStats c:


$old.Keys | ? {$old[$_] -ne $new[$_]} | % {$obj = New-Object -TypeName psobject;
             $obj | Add-Member -MemberType NoteProperty -Name name -Value $_;
             $obj | Add-Member -MemberType NoteProperty -Name oldValue -Value $old[$_];
             $obj | Add-Member -MemberType NoteProperty -Name newValue -Value $new[$_];
             $obj} `
             | sort name | ft -AutoSize
Что вернет вам таблицу со сравнениями старых и новых значений. Вот, примерно такую:
name                oldValue   newValue   
----                --------   --------   
BitmapReadBytes     12632064   12673024   
BitmapReads         534        544        
BitmapWriteBytes    134942720  143458304  
BitmapWrites        28034      29936      
LogFileWriteBytes   1601335296 1709424640 
LogFileWrites       214884     230697     

1 комментарий:

Ростислав комментирует...

Не совсем удобно считать между перезагрузками если это рабочий сервер. Должен быть вариант сброса счетчиков без перезапуска системы.