Вопрос по linux – Высокая загрузка ЦП для спящих процессов

14

У меня есть процесс, который, кажется, заблокирован:

# strace -p 5075
Process 5075 attached - interrupt to quit
futex(0x419cf9d0, FUTEX_WAIT, 5095, NULL

Он сидит на «futex» системный вызов и, кажется, бесконечно ждет блокировки. Показано, что процесс потребляет большое количество ЦП, когда "top" выполняется:

# top -b -n 1
top - 23:13:18 up 113 days,  4:19,  1 user,  load average: 1.69, 1.74, 1.72
Tasks: 269 total,   1 running, 268 sleeping,   0 stopped,   0 zombie
Cpu(s):  8.1%us,  0.1%sy,  0.0%ni, 91.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12165696k total,  3810476k used,  8355220k free,    29440k buffers
Swap:  8388600k total,    43312k used,  8345288k free,   879988k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
5075 omdb      18   0 2373m 1.7g  26m S 199.7 14.9 102804:11 java

Процесс также показан как "S" - состояние сна, которое имеет смысл, если оно ожидает некоторого ресурса. Однако я не понимаю, почему загрузка ЦП будет близка к 200%, если процесс находится в состоянии сна. Почему топ сообщает о такой высокой загрузке процессора в спящем процессе? Разве его загрузка ЦП не должна равняться нулю?

Ваш Ответ

3   ответа
3

Ваше приложение разворачивает дочерние процессы? Вывод strace может указывать на то, что основной процесс просто ожидает, пока дочерние процессы завершат свою работу. Если это так, вы можете попробовать запустить

strace -f -p 5075

чтобы отслеживать дочерние процессы, а также.

6

Как сообщаетсяtop и состояние процесса.справочная страница говорит (emphasis мой):

%CPU -- CPU usage

The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.

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

Error: User Rate Limit ExceededtopError: User Rate Limit ExceededhappeningError: User Rate Limit Exceeded
4

top вывод совершенно нормальный.

Расчеты средней нагрузки включают процессы, которые ожидают чего-либо (мьютексы / фьютексы, ввод-вывод и т. Д.), А также процессы, которые фактически используют ЦП. Проверьте это, скажем, запустив что-то вроде:

dd if=/dev/sda of=/dev/null

и смотреть верхний вывод, чтобы увидеть, что происходит. Это увеличит среднюю нагрузку на 1.

Если вы посмотрите на эту строку:

Cpu(s):  8.1%us,  0.1%sy,  0.0%ni, 91.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

& quot; идентификатор & quot; в & lt; 91,8% идентификатора & quot; означает «простаивает». Таким образом, процессор практически ничего не делает.

Похожие вопросы