Разница между загрузкой ЦП оконной задачи и использованием ЦП Оши - PullRequest
1 голос
/ 09 апреля 2020

Я использую Oshi API (https://github.com/oshi/oshi) для получения загрузки процессора. Однако, почему это значение отличается от использования ЦП диспетчера задач? В чем моя ошибка?

Моя программа - Средняя 11,13%

enter image description here

Диспетчер задач - Среднее около 29%

enter image description here

Отредактированный код

private SystemInfo systemInformation = new SystemInfo();
private CentralProcessor proc = systemInformation.getHardware().getProcessor();

private static float[] floatArrayPercent(double d) {
  float[] f = new float[1];
  f[0] = (float) (100d * d);
  return f;
}

private double cpuData(CentralProcessor proc) {
  double d = proc.getSystemCpuLoadBetweenTicks(oldTicks);
  oldTicks = proc.getSystemCpuLoadTicks();
  return d;
}


@Scheduled(fixedRate = 10)
public void processProcessorInformation() {
  System.out.println("The percentage of the floating value  cpu: " + floatArrayPercent(cpuData(proc))[0]);
}

1 Ответ

1 голос
/ 10 апреля 2020

Проблема в том, что, хотя вы намеревались выполнить «недавнее» вычисление использования, у вас есть случайная строка кода, сбрасывающая его к кумулятивному (с момента запуска) вычислению использования.

Меры вычисления getSystemCpuLoadBetweenTicks(oldTicks) истекший пользователь, система, бездействие и т. д. c. тики от текущих счетчиков до предыдущих, которые вы передали ему, и даст вам возможность использовать эти временные интервалы. В вашем методе cpuData() вы правильно сохраняете старые галочки и, вероятно, намереваетесь использовать их снова. Эта часть верна.

Однако в вашем processProcessorInformation() вы каждый раз обнуляете массив oldTicks: oldTicks = new long[TickType.values().length];. Таким образом, возвращаемое значение представляет собой совокупное среднее использование ЦП с момента запуска, а не последние 10 секунд. Удаление этой строки (или перемещение за пределы запланированного метода) должно дать ожидаемые результаты.

Вам также не требуется каждый раз иметь бесплатную sh копию объекта cpu. Вы можете переместить эту инициализацию из запланированного метода во время перемещения инициализации * 1013. *

В соответствующей заметке @ Elliot-Frisch упоминается в комментариях о вычислениях с использованием нескольких процессоров. Это полезное предупреждение при сравнении тиков процессора со временем (например, если вы измеряете тики между прошедшими периодами времени). Тики накапливаются на каждом логическом процессоре, поэтому вам необходимо убедиться, что вы масштабируете «истекшее время», чтобы включить также каждый логический процессор. Это применимо при работе с вычислениями ЦП для каждого процесса, поскольку у вас есть только время выполнения процесса в качестве знаменателя, и в этом случае Windows Диспетчер задач масштабируется, чтобы гарантировать, что ни один процесс не превысит 100%, а результаты * nix (на * 1016) *) не масштабируются и могут превышать 100%.

Однако для использования системного процессора у нас имеется счетчик тиков "бездействия", который накапливает тики на всех процессорах и является лучшим выбором для вычисление процента использования - и это то, что используется в методе getSystemCpuLoadBetweenTicks(), поэтому это исправление не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...