Рубрики
Без рубрики

Python: нахождение значений заряда фиксации в Windows

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

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

Когда я впервые начал поиск по этой теме, я пробовал такие поисковые термины как «Python Peak Commit Value» и их вариации. Это добрала ко мне, поэтому я заменил «поход» с «WMI» и нашел Win32_perfformatteddata_perfos_memory Класс на MSDN. Я думал, что это было, но только дало мне предел заряда общих платежей и общую коммитую. Вот как я получил эти ценности, используя модуль WMI Tim Golden:

import wmi

c = wmi.WMI()

for item in c.Win32_PerfFormattedData_PerfOS_Memory():
    commitChargeLimit = int(item.CommitLimit) / 1024
    
for item in c.Win32_PerfFormattedData_PerfOS_Memory():
    commitChargeTotal = int(item.CommittedBytes) / 1024
    
print "Commit Charge Limit: ", commitChargeLimit
print "Commit Charge Total: ", commitChargeTotal

Это аккуратные вещи и показывают, насколько легко принять документацию в MSDN и перевести его во что-то использование в Python. К сожалению, это просто не дало мне необходимую информацию. Моя следующая остановка была Почтовый список Pywin32 Где Марк Хаммонд проинформировал мне модулей Win32PDH и Win32Pdhutil. Они выставляют счетчики производительности, но не смог найти способ использовать его, чтобы получить эту информацию. К счастью, я нашел старый пост на Sysinternals Forum Это дало мне подсказку. Вот что он сказал:

Единственный способ, которым я знаю, что можно получить эту деталь из члена UMMPEAEALMITLITLILLIT CONLECTOR SYSTEM_PERFORMANCE_INFORTHATIONATIONATION, пропускаю к NTQuerySystemInformation при вызове ее системным типом системы.

Я спросил мистера Хаммонда, если это означало, что мне нужно будет использовать CTYPES Так как Ntquerysysteminformation Класс не выставлен Pywin32, и он сказал «наверное». Модуль CTYPES довольно низкоуровневый, а не то, что я использовал, за исключением случаев, когда я скопировал сценарий от ActiveState. Это довольно удобный модуль, хотя и был добавлен к Стандартная библиотека в версии 2.5. Из того, что я могу сказать, он был создан Томасом Хеллером.

В любом случае, Ctypes имеет свой Список рассылки Поэтому я решил попробовать там. Я получил два ответа, один из которых был от самого человека (Heller). Он дал мне скрипт, который, по-видимому, не работал сначала, но после немного назад и вперед с ним он поправил меня. Вот результат:

from ctypes import *

SystemBasicInformation = 0
SystemPerformanceInformation = 2

class SYSTEM_BASIC_INFORMATION(Structure):
    _fields_ = [("Reserved1", c_long * 10),
                ("NumberOfProcessors", c_byte),
                ("bUnknown2", c_byte),
                ("bUnknown3", c_short)
                ]

class SYSTEM_PERFORMANCE_INFORMATION(Structure):
    _fields_ = [("IdleTime", c_int64),
                ("ReadTransferCount", c_int64),
                ("WriteTransferCount", c_int64),
                ("OtherTransferCount", c_int64),
                ("ReadOperationCount", c_ulong),
                ("WriteOperationCount", c_ulong),
                ("OtherOperationCount", c_ulong),
                ("AvailablePages", c_ulong),
                ("TotalCommittedPages", c_ulong),
                ("TotalCommitLimit", c_ulong),
                ("PeakCommitment", c_ulong),
                ("PageFaults", c_ulong),
                ("WriteCopyFaults", c_ulong),
                ("TransitionFaults", c_ulong),
                ("Reserved1", c_ulong),
                ("DemandZeroFaults", c_ulong),
                ("PagesRead", c_ulong),
                ("PageReadIos", c_ulong),
                ("Reserved2", c_ulong * 2),
                ("PagefilePagesWritten", c_ulong),
                ("PagefilePageWriteIos", c_ulong),
                ("MappedFilePagesWritten", c_ulong),
                ("MappedFilePageWriteIos", c_ulong),
                ("PagedPoolUsage", c_ulong),
                ("NonPagedPoolUsage", c_ulong),
                ("PagedPoolAllocs", c_ulong),
                ("PagedPoolFrees", c_ulong),
                ("NonPagedPoolAllocs", c_ulong),
                ("NonPagedPoolFrees", c_ulong),
                ("TotalFreeSystemPtes", c_ulong),
                ("SystemCodePage", c_ulong),
                ("TotalSystemDriverPages", c_ulong),
                ("TotalSystemCodePages", c_ulong),
                ("SmallNonPagedLookasideListAllocateHits", c_ulong),
                ("SmallPagedLookasideListAllocateHits", c_ulong),
                ("Reserved3", c_ulong),
                ("MmSystemCachePage", c_ulong),
                ("PagedPoolPage", c_ulong),
                ("SystemDriverPage", c_ulong),
                ("FastReadNoWait", c_ulong),
                ("FastReadWait", c_ulong),
                ("FastReadResourceMiss", c_ulong),
                ("FastReadNotPossible", c_ulong),
                ("FastMdlReadNoWait", c_ulong),
                ("FastMdlReadWait", c_ulong),
                ("FastMdlReadResourceMiss", c_ulong),
                ("FastMdlReadNotPossible", c_ulong),
                ("MapDataNoWait", c_ulong),
                ("MapDataWait", c_ulong),
                ("MapDataNoWaitMiss", c_ulong),
                ("MapDataWaitMiss", c_ulong),
                ("PinMappedDataCount", c_ulong),
                ("PinReadNoWait", c_ulong),
                ("PinReadWait", c_ulong),
                ("PinReadNoWaitMiss", c_ulong),
                ("PinReadWaitMiss", c_ulong),
                ("CopyReadNoWait", c_ulong),
                ("CopyReadWait", c_ulong),
                ("CopyReadNoWaitMiss", c_ulong),
                ("CopyReadWaitMiss", c_ulong),
                ("MdlReadNoWait", c_ulong),
                ("MdlReadWait", c_ulong),
                ("MdlReadNoWaitMiss", c_ulong),
                ("MdlReadWaitMiss", c_ulong),
                ("ReadAheadIos", c_ulong),
                ("LazyWriteIos", c_ulong),
                ("LazyWritePages", c_ulong),
                ("DataFlushes", c_ulong),
                ("DataPages", c_ulong),
                ("ContextSwitches", c_ulong),
                ("FirstLevelTbFills", c_ulong),
                ("SecondLevelTbFills", c_ulong),
                ("SystemCalls", c_ulong)]

sbi = SYSTEM_BASIC_INFORMATION()
retlen = c_ulong()

res = windll.ntdll.NtQuerySystemInformation(SystemBasicInformation,
                                            byref(sbi),
                                            sizeof(sbi),
                                            byref(retlen))
print res, retlen
print sbi.NumberOfProcessors


spi = SYSTEM_PERFORMANCE_INFORMATION()
retlen = c_ulong()

res = windll.ntdll.NtQuerySystemInformation(SystemPerformanceInformation,
                                            byref(spi),
                                            sizeof(spi),
                                            byref(retlen))
print res, retlen
print "Peak commit: ",
print spi.PeakCommitment * 4096 / 1024

Я не очень понимаю все, что происходит здесь, но я рад, что это работает. Ну, я должен сказать, что он работает на Windows XP Professional, 32-битный с Python 2.5. Я попробовал его на Windows 7 64-бит, а также скрипт бежал, он вернул «0л». Я предполагаю, что 64-битные операционные системы нуждаются в немного другом сценарии, но поскольку все наши рабочие станции в настоящее время используют 32-битные, это не имеет значения в этой точке. Еще раз, сообщество Python прошло для меня и показало, как удивительно они!