#python #powershell #psutil
#python #powershell #psutil
Вопрос:
Я создаю скрипт python (работающий в Windows), который проверяет использование памяти Java-процессом и регистрирует его. Сначала я попытался использовать psutil:
for proc in psutil.process_iter():
print(proc.name())
if "java.exe" in proc.name():
print("Process Found. Mem used: " str((proc.memory_info().rss/1024/1024)
Это возвращает 4095,99.. МБ каждый раз, даже если фактическое использование памяти, о котором сообщает диспетчер задач, варьируется от 8100-8400 МБ.
Затем я попробовал команду Powershell, чтобы сделать то же самое:
powershell "Get-Process -Name java | SELECT WS"
где WS (рабочий набор) является ближайшим показателем к тому, что сообщается диспетчером задач. Запустив это в командном терминале, он вернул число в пределах 20 МБ от текущего использования памяти процессами. Затем я протестировал выполнение этой команды в python с использованием подпроцесса:
process = subprocess.Popen('powershell "Get-Process -Name java | SELECT WS "',stdout=subprocess.PIPE)
print(process.communicate()[0].strip())
и os.system:
result = os.system('powershell "Get-Process -name java | SELECT WS"')
print(result)
Оба возвращают одинаковое значение 4095.99.. MB psutil сделал (вплоть до последней цифры.). Итак, что-то в python изменяет способ, которым он видит, что обрабатывает память. Пробовал запускать ее у нескольких пользователей, включая администраторов и пользователя, под которым выполняется процесс, со всеми одинаковыми результатами. Я в тупике относительно того, как python может изменять вызов powershell, чтобы он возвращал другой результат, чем выполняется вне его.
Комментарии:
1. Есть ли у вас те же результаты при просмотре других процессов? Я спрашиваю, потому что я запустил ваши примеры Python и Powershell против некоторых моих процессов и получил ожидаемые результаты. Ничего не было изменено.
2. Нет. Я подозреваю, что это связано с объемом памяти, который использует процесс Java. Все остальные процессы, с которыми я тестировал, были меньше 1000 МБ ОЗУ. Мне приходит в голову, что это 32-разрядное максимальное значение для целых чисел (как psutil, так и команда powershell выводят память в байтах).
3. Это означает, что проблема с psutil может быть вызвана тем, что python не распознает, что ему нужно использовать long. Это не объясняет powershell, хотя, поскольку это возвращается обратно в python в виде строки.
4. Итак, чтобы проверить, если вы измените имя процесса на что-то, что использует менее 4 ГБ памяти, это даст правильное значение?
5. Это правильно.