Как мы измеряем потребление твердотельных PCIe-накопителей с разъемом M.2

Оценка энергопотребления компонентов ПК важна с экономической точки зрения — все-таки за ватты обычно приходится платить. Кроме того, могут быть и другие причины: например, в случае мобильного ПК компонент, который потребляет меньше аналогичного, продлит время работы от батареи, ему, возможно, вовсе не понадобится радиатор, он будет меньше нагревать соседние детали и т. д. В данной статье мы расскажем, как и с помощью чего мы измеряем потребление твердотельных PCIe-накопителей с разъемом M.2.

Практика

Замер потребления в случае твердотельных PCIe-накопителей осложнен тем, что у них нет выделенного разъема питания — оно подается через несколько крохотных контактов в само́м разъеме M.2.

В подобных случаях обычно выручают разного рода адаптеры или переходники, в которых линии питания проще выделить и вывести на измеритель тока и напряжения. В данном случае мы воспользовались платой-переходником с двух разъемов M.2 на разъем PCIe x4. На этой плате три дорожки питания 3,3 В от разъема PCIe объединяются в одну широкую дорожку, в разрыв которой уже можно вставить токоизмерительный шунт. Разъемы M.2 на плате разные: один с ключом типа B (только для накопителей с интерфейсом SATA) и один с ключом типа M (только для накопителей с интерфейсом PCIe). Для измерений мы используем второй разъем.

Непосредственно для измерения тока и напряжения мы применяем микросхему INA226 компании Texas Instruments, с которой есть положительный опыт работы. Эта микросхема измеряет напряжение на шине питания в диапазоне от 0 до 36 В и напряжение на токоизмерительном шунте в диапазоне от –81,9175 мВ до 81,92 мВ. Второе позволяет применять шунты с низким сопротивлением, что снижает падение напряжения на нем до такой величины, которая в большинстве случаев никак не отражается на функционировании устройств, потребление которых измеряется. За исключением довольно мелкого размера, в остальном микросхема удобна в работе. Результаты измерений INA226 по запросу передает по шине I2C.

Связь измерителя с ПК изначально предполагалась по USB, что потребовало внедрения в схему еще одного компонента — шлюза между интерфейсами I2C и USB. В качестве такового мы решили использовать специализированную микросхему MCP2221 компании Microchip. Для функционирования эта микросхема требует минимального количества внешних компонентов и выпускается в удобных для ручной пайки корпусах PDIP и SOIC. Сама микросхема, сопутствующее ПО и набор для разработчика (SDK) хорошо документированы, что ускоряет и облегчает разработку устройств на ее основе.

Измерительный модуль мы решили сделать максимально универсальным и допускающим расширение функциональности, чтобы была возможность использовать почти все функции MCP2221, что, конечно же, было ошибкой и только увеличило размеры устройства измерения. Разработка этого модуля велась с помощью комплекса KiCad EDA (версии (5.1.9)-1). Принципиальная схема модуля:

В качестве шунта мы применили резистор с сопротивлением 0,025 Ом, что ограничивает максимальный измеряемый ток на уровне порядка 3,2 А. Беглая оценка позволила предположить, что в такой диапазон укладывается потребление всех SSD с разъемом M.2 (хотя в принципе в этом разъеме всего 9 контактов на питание, каждый из которых должен выдерживать до 0,5 А, что дает максимальный ток в 4,5 А, но, с другой стороны, спецификации карт PCIe ограничивают максимальный ток по шине 3 В на уровне 3 А, а мы используем такую карту в качестве адаптера). Разъем USB мы решили не устанавливать и припаяли USB-хвост непосредственно к плате модуля. Вид готового модуля со стороны размещения компонентов:

Несколько контактных площадок предполагают возможность подпайки проводников для расширения функциональности, без них модуль можно было бы сделать раза в два компактнее. Готовый модуль мы закрепили на обратной стороне платы-переходника с помощью двусторонней клейкой ленты.

На фронтальной стороне платы мы перерезали дорожку питания 3,3 В и к ее краям припаяли плоские проводники, которые перекинули на другую сторону и припаяли к плате модуля на входе и выходе шунта. Эти проводники не препятствуют установке накопителей.

Напряжение питания измеряется на выходе шунта, то есть уже с учетом падения напряжения на шунте.

Работа с модулем возложена на простую консольную программу, обеспечивающую сбор данных. Конфигурация задается с помощью текстового файла, имя которого передается первым параметром командной строки. В этом файле 9 строк, по числу на каждую (за одним возможным исключением). Эти числа определяют режим работы модуля и самой программы. Пример данных такого файла с пояснениями приведен в таблице ниже (в самом файле никаких пояснений нет).

Пример данных Пояснение
0000001639 серийный номер MCP2221, к которому нужно подключаться, или NoSN
100 период опроса INA226 в мс
9.887E-05 коэффициент для расчета тока
0.00125 коэффициент для расчета напряжения
04D8 Vendor ID MCP2221 (шестнадцатеричное число)
00DD Product ID MCP2221 (шестнадцатеричное число)
0040 I2C-адрес INA226 (шестнадцатеричное число)
004F первый (старший) байт конфигурации INA226 (шестнадцатеричное число)
0027 второй (младший) байт конфигурации INA226 (шестнадцатеричное число)

Предусмотрен опциональный контроль по серийному номеру MCP2221, что актуально, если в системе будет подключено два или более устройства с MCP2221. Чтобы снизить погрешность из-за отсутствия синхронизации между готовностью данных и их передачей, период опроса INA226 должен быть в несколько раз меньше периода, с которым INA226 выполняет измерение тока и напряжения. Сама микросхема INA226 измеряет напряжение на шунте и на линии питания с высокой точностью, но погрешность шунта присутствует. Мы даже не знаем, какого класса точности использован шунт, так как он был выпаян из какой-то платы защиты аккумулятора от ноутбука. В итоге нужный коэффициент для расчета тока был определен с помощью калибровки при использовании высокоточного мультиметра. Для точного значения 0,025 Ом коэффициент для расчета равен 1E-04, у нас получилось 9,887E-05, то есть отличие всего в 1%. В принципе, для наших целей можно использовать и первое значение, но проверить сопротивление резистора нужно было в любом случае. На всякий случай мы проверили и точность измерения напряжения. Она оказалась достаточно высокой, чтобы оставить расчетный коэффициент (0,00125). Vendor ID и Product ID нужны для идентификации USB-устройства, их значения мы оставили заводскими. I2C-адрес INA226 задается соединением адресных выводов INA226, и в нашем случае этот адрес задан как 0x40 без возможности изменения.

Байты конфигурации задают режим работы INA226. Для любознательных приведем выдержку из спецификаций на INA226:

Режим работы мы выбрали следующий:

  • непрерывное измерение напряжения на шунте и на линии питания
  • время преобразования 1,1 мс для обоих напряжений
  • усреднение по 1024 выборкам

Таким образом усреднение происходит за примерно 1 с при частоте опроса INA226 по I2C 10 раз в секунду.

Опрос INA226 начинается сразу после запуска консольной программы SSDPower.exe, а останавливается после ввода с консоли символа «S» или «s». Пример командной строки:

SSDPower.exe conf.txt data

где conf.txt — конфигурационный файл, а data — имя (без расширения) трех файлов:

data.log — для записи исходных данных в отсчетах АЦП (ток \t напряжение)
data.dat — для записи обработанных данных (время (с) \t ток (А) \t напряжение (В))
data.txt — для записи результатов

Во время опроса записываются только исходные данные в отсчетах АЦП. После окончания записи эти данные с использованием коэффициентов пересчитываются в реальные значения тока и напряжения (записываются в файл data.dat), а также производится простая статистическая обработка, ее результат записывается в файл data.txt. Пример содержимого этого файла:

Number of points: 937
Interval: 93.6 s
Average current: 0.387568 A
Maximum current: 0.597076 A
Average voltage: 3.31477 V
Energy: 120.198 W*s

На текущий момент представляет интерес только последнее значение. Это затраченная энергия с момента запуска опроса до его остановки. В качестве единицы измерения, чтобы не возится со степенями, мы выбрали Вт·с.

Для автоматизации процесса можно использовать скрипты AutoIt. Пример такого скрипта:

#include
; Matches any substring in the title.
Opt("WinTitleMatchMode", 2)
; Run SSDPower.exe
Local $iPID = ShellExecute ("SSDPower.exe", " conf.txt data", "", "", @SW_MINIMIZE)
ShellExecuteWait ("test.bat")
WinActivate ("SSDPower.exe")
WinWaitActive("SSDPower.exe")
Send ("s")

В этом скрипте test.bat — пакетный файл, который запускает какой-либо процесс, использующий SSD. Например, копирование большого файла:

copy "test.mkv" i:\

В результате по окончании копирования опрос остановится и будет получено значение энергии, затраченной на этот процесс.

Пример работы

Для пробного тестирования мы взяли SSD Seagate BarraCuda Q5 емкостью 500 ГБ. Нагрузку на этот накопитель мы создавали с помощью синтетического теста CrystalDiskMark 6. Настройки видны на снимке с экрана:

Пауза между тестами установлена в 1 с. Период опроса мы установили на 100 мс (то есть 10 раз в секунду), а усреднение задали по 1024 и по 128 выборкам. Второй вариант позволил выявить наличие или отсутствие кратковременных пиков или провалов в потреблении. Запуск и остановку опроса в данном случае выполняли вручную. В обоих случаях за время выполнение всех восьми тестов потребление составило порядка 120 Вт·с. Приведем зависимости тока от времени:

В случае усреднения по 128 выборкам отчетливо видна пауза в одну секунду между тестами, но принципиальных отличий от варианта с усреднением по 1024 выборкам нет, максимальные значения тока в тестах примерно такие же.

Далее мы провели тест с автоматическим запуском копирования большого файла (чуть больше 4 ГБ) на SSD. На этот процесс было затрачено 45 с и 26 Вт·с. Зависимость тока от времени:

Видно, что в этом случае потребление периодически снижается до величины в простое, то есть копирование с помощью системной команды не может равномерно во времени нагрузить SSD. По всей видимости, чтобы снизить влияние посторонних факторов, оценку потребления лучше проводить с помощью синтетических тестов, типа CrystalDiskMark.

Выводы

На основе измерителя напряжений INA226 и шлюза I2C—USB MCP2221 был разработан аппаратно-программный комплекс, позволяющий определять энергопотребление твердотельных PCIe-накопителей с разъемом M.2. Потребленная электроэнергия измеряется с усреднением в интервале порядка одной секунды, поэтому данный метод может быть применен для процессов длительностью от нескольких секунд. Предварительные тесты с более коротким интервалом усреднения показали, что оценку энергопотребления SSD лучше проводить с помощью синтетических тестов, которые создают нагрузку равномерно во времени.

Материалы к данной статье и исходные тексты ПО опубликованы на GitHub

18 апреля 2022 Г.