Подтвердить что ты не робот

Утилизация процессора для спальных процессов

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

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

Он сидит на системном вызове "futex" и, кажется, бесконечно ждет на замке. Показано, что процесс потребляет большое количество CPU при запуске "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%, если процесс находится в состоянии ожидания. Почему топ сообщает о таком высоком использовании процессора в спальном процессе? Должно ли его использование ЦП быть нулевым?

4b9b3361

Ответ 1

Нет никакой корреляции между использованием ЦП, сообщенным top и состоянием процесса. На странице man (подчеркивание):

% CPU - использование процессора

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

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

Ответ 2

Выход top абсолютно нормальный.

Средние вычисления нагрузки включают в себя процессы, которые чего-то ждут (мьютексы/futexes, IO и т.д.), а также процессы, которые фактически используют CPU. Проверьте, скажем, что-то вроде:

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

"id" в "91.8% id" означает "idle". Таким образом, процессор практически не делает ничего.

Ответ 3

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

strace -f -p 5075

для отслеживания дочерних процессов.