обнаруживать процесс питания процессора без: top, htop, ps?

Я столкнулся с проблемой, когда я мог только догадываться, какой процесс ел процессор.

Использование моего процессора составляло около 80% для всех ядер при psensor.

Я пробовал htop , top и ps -A -o pcpu,pid,cmd --sort +pcpu (последний из которых я даже пытался с sudo безрезультатно).
Все это показало, что преступник pid (о котором я знал) использовал только около 7% …

Когда я SIGKILL на этом pid, все вернемся к норме.

Чтобы проверить, я делал бесконечный цикл на терминале в while true;do echo -n;done но я мог четко видеть на htop; поэтому моя догадка о том, что вызывала проблемы, не была похожа на это …

Поэтому я задаюсь вопросом, есть ли другие способы, которыми я мог бы найти преступника, не догадываясь?

psensor , я думаю, мне хотелось бы знать, какие вычисления используют psensor и « psensor загрузки системы», который смог показать эту ценность, но другие не смогли?

PS .: привязка времени ожидания , привязка к среднему значению нагрузки

Я недостаточно разбираюсь в деталях, чтобы дать точные подсказки, но я думаю, есть два источника различий между реальной нагрузкой и показанным использованием ЦП:

  1. Процесс может состоять из нескольких потоков, и top не может суммировать их. Вы можете увидеть количество потоков:

     ps -eo pid,nlwp,%cpu,user,args 

    В top вы можете переключить обработку потоков с помощью H Обычно использование ЦП каждого потока довольно низкое.

  2. Процесс может привести к большому количеству операций ввода-вывода. Время ожидания ввода-вывода является частью общей загрузки ЦП, но не может быть частью значения использования ЦП процесса. Поэтому проверьте значение wait в top . Он не говорит вам, какие процессы вызывают его в какой степени, но если значение низкое, то оно не может объяснить эффект.

Если вы не хотите использовать htop, ps, top, вы можете использовать systemtap, для более подробных сведений о низком уровне

Код, выполняемый в системе unix, классифицируется как код ядра или код земли пользователя. Пользовательский код земли всегда привязан к процессу, поэтому, если CPU занят выполнением кода земли пользователя, он отображается на некоторой строке в top . Код ядра обычно привязан к процессу: если ядро ​​выполняет системный вызов, тогда обработка в ядре учитывается как принадлежащая этому процессу. Время ядра – это «системное время», сообщенное утилитой time .

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

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

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