Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > ps и sum(%cpu)>100%


Автор: RomCom 25.9.2008, 02:02
При выполнении команды
Код

ps -aexo pid,%cpu,%mem

Сумма по колонке %cpu получается  больше  100%  smile 
Как такое возможно?

Автор: Imple 25.9.2008, 05:55
У вас комманда сама по себе не правильная...
Должно быть либо так (BSD syntax):
Код
ps axo pid,%cpu,%mem

Либо, так (standard syntax):
Код
ps -aeo pid,%cpu,%mem

Но, это конечно, предполагая что у вас Linux. 

Цитата(RomCom @  25.9.2008,  05:02 Найти цитируемый пост)
Сумма

Покажите нам? Вывод комманды, и как считали.

Автор: RomCom 25.9.2008, 09:03
Вот что выдает ps (ps -aeo pid,%cpu,%mem или ps axo pid,%cpu,%mem без разницы):
Код

  PID %CPU %MEM
  426  0.4  0.6
 8366  0.2  0.4
 8416  0.0  0.5
 8452  0.0  0.6
 8500  4.2  2.3
10237  0.6  0.2
12398  0.3  0.7
14098  0.0  0.9
14194  0.5  1.4
16748  0.0  0.3
17437  0.2  0.3
17447  0.0  0.2
17475  0.1  0.3
17478  0.0  0.3
17483  0.2  0.3
17569  0.0  0.3
17728  0.0  0.2
17737  0.1  0.2
17759  0.1  0.2
17840  0.0  0.2
17844  0.0  0.1
17871  2.0  0.0
17872  101  0.0
18366  0.0  0.1
18384  0.0  0.1
18392  0.0  0.1
18421  0.0  0.1
18554  0.0  0.1
26160  0.0  0.2
27018  0.0  0.1

Я суммирую вторую колонку и получаю 109.9%!
один только pid 17872 выдает 101%  smile 

Может ли это быть из за того проц двухядерный?

Автор: Imple 25.9.2008, 09:51
CPU usage в выводе ps, это процентное соотношение времени, во время которого процесс выполнялся, к общему времени жизни процесса. Т.е. если процесс жив 5 секунд, и все 5 секунд выполняется (т.е. не ждет каких-либо событий и т.д.), то CPU usage будет 100%. Но как процесс мог выполнятся больше чем жить, не понимаю.

Добавлено через 23 секунды
А что за процесс то?

Автор: RomCom 25.9.2008, 11:58
Такие данные выдаются призапуске  (тестового) демона по средсвам PHP

Код

if($pid = pcntl_fork())
{
 //получение данных из команды ps
}
else
{
 //математические вычесления
 //собственно это тот процесс что и выдает больше 100%
}

Автор: vinick 25.9.2008, 13:06
Цитата(RomCom @  25.9.2008,  09:03 Найти цитируемый пост)
Я суммирую вторую колонку и получаю 109.9%!
один только pid 17872 выдает 101%  smile 

Может ли это быть из за того проц двухядерный? 

Это многоядерность вместе с многопоточностью виновата. 

Автор: Imple 25.9.2008, 13:48
Цитата(vinick @  25.9.2008,  16:06 Найти цитируемый пост)
Это многоядерность вместе с многопоточностью виновата. 

Поделитесь пожалуйста источником столь ценной информации?  smile 

Автор: vinick 6.10.2008, 23:29
Цитата(Imple @  25.9.2008,  13:48 Найти цитируемый пост)
Поделитесь пожалуйста источником столь ценной информации?


От гугла я смог добиться только такой ссылки http://kerneltrap.org/node/16405
Истина наверно лежит в дебрях /proc и procps.

Код

$ cat thr_test.cpp
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <limits>
#include <numeric>

void thr1()
{
  int i = std::numeric_limits<int>::max();

  for(;;--i)
    {
      int k = i % 7;
      k--;
      if( i < 10)
        i = std::numeric_limits<int>::max();
    }
}
int main()
{
  boost::thread t1(&thr1);
  boost::thread t2(&thr1);
  t2.join();
  t1.join();
  return 0;
}
$ ./a.out &
[1] 11148
vinick@vinick:~/develop$ (ps aexo pid,pcpu,comm | grep a.out) && (echo "------------")&&(ps -L aexo pid,pcpu,comm | grep a.out)
11148  181 a.out
------------
11148  0.0 a.out
11148 90.2 a.out
11148 91.5 a.out


Два потока занимают по 90% каждого ядра, а весь поток получается занимает 180%

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)