LINUX.ORG.RU

Загрузка CPU. Чему верить?


0

0

На ПК крутиться самописная программа.

Набираю top.

В верхней строчке: Cpu(s) 1,9%us, остальные примерно по нулям (кроме id).

Т.е. загрузка вроде бы как только 2%.

Но ниже, в списке процессов висит строка у программой в которого написано что она отъедает 49% процессора (%CPU - 49).

htop показывает тоже самое - общая загрузка процессора 2%, а программа занимает 50%.

Как такое может быть?

anonymous

Элементарно Ватсон! У тебя проц пятидесятиядерный.

anonymous
()

Кроме us, есть ещё и sy. Хорошо бы и оттуда учитывать значения. Может твоя программа генерирует много системных вызов и работает большую времени на уровне ядра.

aleksey_t
()
Ответ на: комментарий от anonymous

$ top
top - 12:10:15 up  2:32,  3 users,  load average: 0.08, 0.03, 0.03
Tasks:  38 total,   1 running,  37 sleeping,   0 stopped,   0 zombie
Cpu(s):  7.1% us,  3.6% sy,  0.0% ni, 89.3% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    126940k total,    33888k used,    93052k free,     2696k buffers
Swap:        0k total,        0k used,        0k free,    19456k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3263 asu       20   0 30752 3444 3032 S 48.6  2.7   0:20.17 proga.bett
 3268 asu       20   0  2200 1064  840 R  5.3  0.8   0:00.58 top
    1 root      20   0  1560  544  476 S  0.0  0.4   0:01.40 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.02 events/0

anonymous
()
Ответ на: комментарий от anonymous

> Подскажите куда смотреть?

В atop смотри

anonymous
()
Ответ на: комментарий от koolig

Нажал единичку.

top - 14:25:44 up  4:47,  2 users,  load average: 0.00, 0.02, 0.04
Tasks:  34 total,   1 running,  33 sleeping,   0 stopped,   0 zombie
Cpu0  :  5.5% us,  4.4% sy,  0.0% ni, 90.0% id,  0.0% wa,  0.0% hi,  0.1% si
Mem:    126940k total,    33660k used,    93280k free,     3596k buffers
Swap:        0k total,        0k used,        0k free,    19460k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3435 asu       20   0 30752 3388 2980 S 49.8  2.7   1:09.70 proga.bett
 3450 asu       20   0  2200 1064  844 R  5.4  0.8   0:04.28 top
    1 root      20   0  1560  544  476 S  0.0  0.4   0:01.88 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.04 events/0

anonymous
()
Ответ на: комментарий от anonymous

> Нажал единичку.

И что, полегчало? Сказано же: смотри в atop. Из-под рута.

anonymous
()

О, а я тоже такую прогу написать смог :)

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <math.h>
#include <assert.h>
#include <stdlib.h>

int main(int ac, char **av) {
assert (ac == 2);
int count = atoi(av[1]);

int c = 0;
for(;;) {
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1; // sleep one tick only
select(0, 0,0,0, &tv);
for (int j = 0; j < count; j++) { sin(1.2); }
}
}


$ ./test 50000 &

$ top:
Cpu(s): 0.3%us, 0.2%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu1 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17461 xxx 20 0 2524 736 648 S 28 0.1 0:04.64 test

При увеличении аргумента сначала растёт %CPU, а Cpu(s) %us остаётся около нуля. Начиная с какого-то порога, начинает расти и %us.

Как я понял из этих цифр, Cpu(s) %us считает квант времени свободным, если этот квант не был занят целиком, А %CPU считает загрузку с учётом доли занятого времени.

alexsaa
()
Ответ на: комментарий от alexsaa

Вообще, такое часто бывает с программами, которые используют неправедный приём спать-маленькими-кусочками.

alexsaa
()
Ответ на: комментарий от alexsaa

Да, там крутяться 5 потоков. Все вроде по книжкам сделано. Может там есть какие-то грабли? Вообще это нормальная ситуация или нужно чтобы такогоьнебыло?

anonymous
()
Ответ на: комментарий от anonymous

> Вообще это нормальная ситуация или нужно чтобы такогоьнебыло?

*imho*, нормальная, по крайней мере с точки зрения системы.

С другой стороны, если тебя беспокоит производительность твоей программы (отношение полезной работы к затратам CPU), то такие приложения *обычно* есть куда оптимизировать. Например, (в моём случае) стоит увеличить квант времени сна, а лучше - выполнять работу не по таймеру, а по тому внешнему условию, которое она должна обслуживать (если есть delay(), то есть и то, чего ждёшь). Про твой приложения сказать ничего не могу, т.к. не вижу ни его самого, ни его сорцов. Я даже не знаю, есть ли у тебя там в каком-то виде запрос "спать", или просто у тебя такое интенсивное взаимодействие между потоками.

Это общие соображения, видел такое на разных ОСях, суть одна и та же. На линуксе увидел только в этом обсуждении - но почти не удивился.

alexsaa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.