Index: telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py |
diff --git a/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py b/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py |
deleted file mode 100644 |
index dfb61a08486562d21dbbbe4b324245c189f318cb..0000000000000000000000000000000000000000 |
--- a/telemetry/telemetry/internal/platform/power_monitor/msr_power_monitor.py |
+++ /dev/null |
@@ -1,118 +0,0 @@ |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-import logging |
-import platform |
-import re |
- |
-from telemetry import decorators |
-from telemetry.internal.platform import power_monitor |
- |
- |
-MSR_RAPL_POWER_UNIT = 0x606 |
-MSR_PKG_ENERGY_STATUS = 0x611 # Whole package |
-MSR_PP0_ENERGY_STATUS = 0x639 # Core |
-MSR_PP1_ENERGY_STATUS = 0x641 # Uncore |
-MSR_DRAM_ENERGY_STATUS = 0x619 |
-IA32_PACKAGE_THERM_STATUS = 0x1b1 |
-IA32_TEMPERATURE_TARGET = 0x1a2 |
- |
- |
-def _JoulesToMilliwattHours(value_joules): |
- return value_joules * 1000 / 3600. |
- |
- |
-def _IsSandyBridgeOrLater(vendor, family, model): |
- # Model numbers from: |
- # https://software.intel.com/en-us/articles/intel-architecture-and-processor-identification-with-cpuid-model-and-family-numbers |
- # http://www.speedtraq.com |
- return ('Intel' in vendor and family == 6 and |
- (model in (0x2A, 0x2D) or model >= 0x30)) |
- |
- |
-class MsrPowerMonitor(power_monitor.PowerMonitor): |
- def __init__(self, backend): |
- super(MsrPowerMonitor, self).__init__() |
- self._backend = backend |
- self._start_energy_j = None |
- self._start_temp_c = None |
- |
- def CanMonitorPower(self): |
- raise NotImplementedError() |
- |
- def StartMonitoringPower(self, browser): |
- self._CheckStart() |
- self._start_energy_j = self._PackageEnergyJoules() |
- self._start_temp_c = self._TemperatureCelsius() |
- |
- def StopMonitoringPower(self): |
- self._CheckStop() |
- energy_consumption_j = self._PackageEnergyJoules() - self._start_energy_j |
- average_temp_c = (self._TemperatureCelsius() + self._start_temp_c) / 2. |
- if energy_consumption_j < 0: # Correct overflow. |
- # The energy portion of the MSR is 4 bytes. |
- energy_consumption_j += 2 ** 32 * self._EnergyMultiplier() |
- |
- self._start_energy_j = None |
- self._start_temp_c = None |
- |
- return { |
- 'identifier': 'msr', |
- 'energy_consumption_mwh': _JoulesToMilliwattHours(energy_consumption_j), |
- 'platform_info': { |
- 'average_temperature_c': average_temp_c, |
- }, |
- } |
- |
- @decorators.Cache |
- def _EnergyMultiplier(self): |
- return 0.5 ** self._backend.ReadMsr(MSR_RAPL_POWER_UNIT, 8, 5) |
- |
- def _PackageEnergyJoules(self): |
- return (self._backend.ReadMsr(MSR_PKG_ENERGY_STATUS, 0, 32) * |
- self._EnergyMultiplier()) |
- |
- def _TemperatureCelsius(self): |
- tcc_activation_temp = self._backend.ReadMsr(IA32_TEMPERATURE_TARGET, 16, 7) |
- if tcc_activation_temp <= 0: |
- tcc_activation_temp = 105 |
- package_temp_headroom = self._backend.ReadMsr( |
- IA32_PACKAGE_THERM_STATUS, 16, 7) |
- return tcc_activation_temp - package_temp_headroom |
- |
- def _CheckMSRs(self): |
- try: |
- if self._PackageEnergyJoules() <= 0: |
- logging.info('Cannot monitor power: no energy readings.') |
- return False |
- |
- if self._TemperatureCelsius() <= 0: |
- logging.info('Cannot monitor power: no temperature readings.') |
- return False |
- except OSError as e: |
- logging.info('Cannot monitor power: %s' % e) |
- return False |
- return True |
- |
- |
-class MsrPowerMonitorWin(MsrPowerMonitor): |
- def CanMonitorPower(self): |
- family, model = map(int, re.match( |
- '.+ Family ([0-9]+) Model ([0-9]+)', |
- platform.processor()).groups()) |
- if not _IsSandyBridgeOrLater(platform.processor(), family, model): |
- logging.info('Cannot monitor power: pre-Sandy Bridge CPU.') |
- return False |
- |
- try: |
- return self._CheckMSRs() |
- finally: |
- # Since _CheckMSRs() starts the MSR server on win platform, we must close |
- # it after checking to avoid leaking msr server process. |
- self._backend.CloseMsrServer() |
- |
- def StopMonitoringPower(self): |
- power_statistics = super(MsrPowerMonitorWin, self).StopMonitoringPower() |
- self._backend.CloseMsrServer() |
- return power_statistics |