Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> точный мониторинг состояния процесса. 
:(
    Опции темы
boostcoder
Дата 23.10.2011, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



всем доброго утра.

заранее предупреждаю, что в системном программировании я на знаток, посему прошу не придираться к неправильным формулировкам. просто поправьте. спасибо.

нужен монитор указанного процесса с частотой замеров от 1 мс и выше. если есть возможность выполнять выборки чаще чем 1 мс - то это еще лучше. так же, нужна возможность создавать график в виде графического файла, или чего-либо что можно визуализировать.
конкретно интересует мониторинг следующих значений:
1. пользовательское время.
2. системное время(время ядра?).
3. время проведенное в ожидании.
4. по пункту 3, нужна информация о том, в ожидании чего. (есть ли возможность узнать, висел ли процесс на мьтексах/файловом_IO/сетевом_IO ?)
5. память процесса.

т.к. ничего готового не нашел, придется кодить руками.

первый вопрос: с какой частотой обновляется /proc/pid/stat ? как определить эту частоту?
насколько я понял, состояние процесса описывает структура task_struct. возможно, если в /proc/pid/stat информация обновляется с недостаточной частотой, то возможно ли получить эту структуру прям из ядра с большей частотой? понятно, что нужен модуль ядра.

второй вопрос:  согласно "man 5 proc", пользовательское время, это поле utime, а системное время это stime?
Цитата

stat   Информация о статусе процесса.  Она используется командой ps(1).  Определяется в /usr/src/linux/fs/proc/array.c.

   Вот поля с соответствующими им спецификаторами форматов для scanf(3)попорядку:

   pid %d Идентификатор процесса.

   comm %s
            Имя исполняемого файла в круглых скобках. Его можно увидеть независимо от того, находится ли исполняемый файл в своппинге или нет.

   state %c
            Один  из  символов  из  строки  "RSDZTW", где R -- запущен, S -- процесс "спит" в прерываемом ожидании, D -- процесс ожидает в непрерываемом состоянии окончания дисковой
            операции, Z -- процесс является зомби, или же T -- процесс трассируется или остановлен (по сигналу) и W -- процесс вызывается.

   ppid %d
            Идентификатор (PID) родительского процесса.

   pgrp %d
            Идентификатор группы процесса.

   session %d
            Идентификатор сессии процесса.

   tty_nr %d
            Терминал tty, который использует процесс.

   tpgid %d
            Идентификатор группы процесса, который в настоящий момент владеет терминалом tty, к которому подключен данный процесс.

   flags %lu
            Флаги процесса. Матеметический бит -- десятичное 4, бит трассировки -- десятичное 10.

   minflt %lu
            Количество незначительных сбоев, которые возникли при работе процесса, и которые не требуют загрузки страницы памяти с диска.

   cminflt %lu
            Количество незначительных сбоев, которые возникли при ожидании окончания работы процессов-потомков.

   majflt %lu
            Количество значительных сбоев, которые возникли при работе процесса, и которые потребовали загрузки страницы памяти с диска.

   cmajflt %lu
            Количество значительных сбоев, которые возникли при ожидании окончания работы процессов-потомков.

   utime %lu
            Количество мигов (jiffies), которые данный процесс провел в режиме пользователя.

   stime %lu
            Количество мигов, которые данный процесс провел в режиме ядра.

   cutime %ld
            Количество мигов, которые данный процесс и его потомки провели в режиме пользователя. (См. также times(2).)

   cstime %ld
            Количество мигов, которые процесс ожадающий завершения процессов-потомков провёл в режиме ядра.

   priority %ld
            Стандартная величина приоритета (для nice) плюс 15. Данное значение в ядре никогда не бывает отрицательным.

   nice %ld
            Значение для nice в диапазоне от 19 (наиболее низкий приоритет) до -19 (наивысший приоритет).

   0 %ld  Данное значение жёстко установлено в 0 как значение для удалённого поля.

   itrealvalue %ld
            Время (в мигах) перед следующей посылкой процессу SIGALRM из-за внутреннего таймера.

   starttime %lu
            Время (в мигах) запуска процесса после начальной загрузки системы.

   vsize %lu
            Размер виртуальной памяти в байтах.

   rss %ld
            Резидентный Размер: количество страниц, которые занимает процесс в реальной памяти, минус 3 для административных целей.  Это те страницы, которые заняты кодом, данными и
            пространством стека.  Сюда не включаются страницы, которые не были загружены по требованию или которые находятся в своппинге.

   rlim %lu
            Текущий лимит в байтах на резидентный размер процесса (обычно 4294967295 на i386).

   startcode %lu
            Адрес, выше которого может выполняться код программы.

   endcode %lu
            Адрес, ниже которого может выполняться код программ.

   startstack %lu
            Адрес начала стека.

   kstkesp %lu
            Текущее значение esp (указателя стека) для данного процесса, которое следует из страницы стека в ядре .

   kstkeip %lu
            Текущее значение EIP (указатель инструкций).

   signal %lu
            Карта ожидающих сигналов (обычно 0).

   blocked %lu
            Карта блокированных сигналов (обычно 0, или 2 для командных интерпретаторов).

   sigignore %lu
            Карта игнорируемых сигналов.

   sigcatch %lu
            Карта перехваченных сигналов.

   wchan %lu
            Это  "канал",  в  котором  ожидает  процесс.   Он  является адресом системного вызова и может быть найден в списке имен, если вам нужно текстовое имя. (Если у вас свежий
            /etc/psdatabase, то попробуйте выполнить ps l, чтобы увидеть поле WCHAN в действии).

   nswap %lu
            Количество страниц на своппинге - не обслуживается.

   cnswap %lu
            Суммарное nswap для процессов-потомков.

   exit_signal %d
            Сигнал, который будет послан родителю, когда процесс умрёт.

   processor %d
            Номер процессора, на котором последний раз выполнялся процесс.


еще не очень понятно назначение cutime и cstime. cutime - это суммарное время в режиме пользователя для текущего процесса и его потоков? или кто такие в данном случае могут быть "его потомки"?
cstime - тут вообще не понятно. это значение времени именно ожидания завершения потомков? т.е. основной процесс пытается завершиться, но не может из-за потомков, и ждет их? т.е. это именно об этом хотят сказать?
и это ни то же самое что и "3. время проведенное в ожидании." ? и скажите, есть ли возможность согласно пункту 4(нужна информация о том, в ожидании чего. (есть ли возможность узнать, висел ли процесс на мьтексах/файловом_IO/сетевом_IO ?)) получить информацию? задайте направление, пожалуйста.

спасибо.

PM WWW   Вверх
newbee
Дата 23.10.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: нет
Всего: 19



Цитата(boostcoder @  23.10.2011,  12:35 Найти цитируемый пост)
первый вопрос: с какой частотой обновляется /proc/pid/stat ? как определить эту частоту?
насколько я понял, состояние процесса описывает структура task_struct. возможно, если в /proc/pid/stat информация обновляется с недостаточной частотой, то возможно ли получить эту структуру прям из ядра с большей частотой? понятно, что нужен модуль ядра.
AFAIK /proc никогда не обновляется, это просто интерфейс к системам ядра, поэтому при каждом запросе будет выдаваться актуальная информация, никакого кеширования. Но тут другой вопрос, не съешь ли ты сам все процессорное время постоянным парсингом кучи строк? Возможно лучше брать эту информацию непосредственно из ядра.

Цитата(boostcoder @  23.10.2011,  12:35 Найти цитируемый пост)
еще не очень понятно назначение cutime и cstime. cutime - это суммарное время в режиме пользователя для текущего процесса и его потоков? или кто такие в данном случае могут быть "его потомки"?

Цитата

              cutime %ld  Amount of time that this process's waited-for children have  been
                          scheduled  in  user  mode,  measured  in  clock  ticks (divide by
                          sysconf(_SC_CLK_TCK).  (See also times(2).)  This includes  guest
                          time, cguest_time (time spent running a virtual CPU, see below).

              cstime %ld  Amount  of time that this process's waited-for children have been
                          scheduled in kernel mode, measured  in  clock  ticks  (divide  by
                          sysconf(_SC_CLK_TCK).
Больше похоже на то, сколько отожрали потомки, пока этот процесс их ждал...


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 23.10.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(newbee @  23.10.2011,  14:35 Найти цитируемый пост)
/proc никогда не обновляется, это просто интерфейс к системам ядра, поэтому при каждом запросе будет выдаваться актуальная информация

дело в том, что я закодил такой тест:
Код


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

#include <getopt.h>

#define handle_error(msg) \
   do { perror(msg); exit(EXIT_FAILURE); } while (0)

/***************************************************************************/

int main(int argc, char** argv) {
   char name[128] = "\0", buf1[1024] = "\0", buf2[1024] = "\0";
   int fd1, fd2, ok = 1, res, idx = 0, idx2;
   char* c1, *c2, *c3, *it;

   if ( argc < 2 ) {
      printf("please choose PID\n");
      return 0;

   }

   sprintf(name, "/proc/%s/stat", argv[1]);
   if ( 0 != access(name, F_OK) ) {
      printf("bad PID 1\n");
      return 1;
   }
   fd1 = open(name, O_RDONLY);
   if ( -1 == fd1 ) {
      handle_error("open1");
   }

   strcat(name, "m");
   if ( 0 != access(name, F_OK) ) {
      printf("bad PID 2\n");
      return 1;
   }
   fd2 = open(name, O_RDONLY);
   if ( -1 == fd2 ) {
      handle_error("open2");
   }

   while ( ok ) {
      lseek(fd1, SEEK_SET, 0);
      res = read(fd1, buf1, sizeof(buf1));
      if ( res <= 0 ) continue;
      buf1[res] = 0;

      lseek(fd2, SEEK_SET, 0);
      res = read(fd2, buf2, sizeof(buf2));
      if ( res <= 0 ) continue;
      buf2[res] = 0;

      for ( it = strtok(buf1, " "), idx2 = 0; (it = strtok(0, " ")); ++idx2) {
         if ( 12 == idx2 ) { c1 = it; }
         if ( 13 == idx2 ) { c2 = it; }
      }

      c3 = strtok(buf2, " ");

      fprintf(
         stdout,
         "%6d: utime: %s, stime: %s, mem: %d Kb\n",
         idx++,
         c1,
         c2,
         atoi(c3)*4096
      );

      fflush(stdout);
      usleep(1000*10);
   }

   return 0;
}

/***************************************************************************/


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

Цитата(newbee @  23.10.2011,  14:35 Найти цитируемый пост)
не съешь ли ты сам все процессорное время постоянным парсингом кучи строк?

если эта тулза-монитор выполняющаяся отдельным процессом что-то там и будет "кушать", то главное чтоб на замеряемом процессе это не сказалось. и по идее вроде как не должно.

PM WWW   Вверх
boostcoder
Дата 23.10.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(boostcoder @  23.10.2011,  15:01 Найти цитируемый пост)
 в выводе видно, что обновленные данные поступают не постоянно

а нет, это я тестировал на процессе который имеет импульсную нагрузку. значит все же данные поступают равномерно. вернее не поступают, а обновляются.
PM WWW   Вверх
rumit7
Дата 23.10.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 1
Всего: 7



Цитата(boostcoder @ 23.10.2011,  11:35)
всем доброго утра.

заранее предупреждаю, что в системном программировании я на знаток, посему прошу не придираться к неправильным формулировкам. просто поправьте. спасибо.

нужен монитор указанного процесса с частотой замеров от 1 мс и выше.

...



Здравствуйте!

Вроде здесь есть немного, может пригодится..

Это сообщение отредактировал(а) rumit7 - 23.10.2011, 19:56
PM MAIL   Вверх
MAKCim
Дата 23.10.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(boostcoder @  23.10.2011,  15:01 Найти цитируемый пост)
если его выполнить, то в выводе видно, что обновленные данные поступают не постоянно. такое ощущение, что несколько выборок получают реальные данные, остальные же, выводят последний полученный результат.

кэширования тут нет
значит так ядро обновляет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 23.10.2011, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(rumit7 @  23.10.2011,  19:32 Найти цитируемый пост)
Вроде здесь есть немного, может пригодится.

спасибо! то что нужно!

PM WWW   Вверх
boostcoder
Дата 24.10.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



кто-нибудь подскажет по следующим пунктам?
Цитата

3. время проведенное в ожидании.
4. по пункту 3, нужна информация о том, в ожидании чего. (есть ли возможность узнать, висел ли процесс на мьтексах/файловом_IO/сетевом_IO ?)

PM WWW   Вверх
xvr
Дата 25.10.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



По п4 родной ps смотрит на адрес ожидания в ядре (это где то есть в /proc/...) и на символы ядра (если найдет). По ним находит имя функции ядра, где висит процесс. А дальше руками
PM MAIL   Вверх
boostcoder
Дата 25.10.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(xvr @  25.10.2011,  13:15 Найти цитируемый пост)
ps смотрит на адрес ожидания в ядре

адрес чего? функции? ну допустим, ps таким образом узнает адрес. но как ps по адресу узнает имя функции?

Цитата(xvr @  25.10.2011,  13:15 Найти цитируемый пост)
(это где то есть в /proc/...)

а что нужно сделать, чтоб получить более детальную информацию? smile 

Цитата(xvr @  25.10.2011,  13:15 Найти цитируемый пост)
и на символы ядра

а это что такое?

PM WWW   Вверх
xvr
Дата 26.10.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(boostcoder @  25.10.2011,  16:51 Найти цитируемый пост)
а что нужно сделать, чтоб получить более детальную информацию?

Посмотреть исходники ps

Цитата(boostcoder @  25.10.2011,  16:51 Найти цитируемый пост)
а это что такое?

Ну это например /boot/System.map-* (или прямо nm на /boot/vmlinux-* )

PM MAIL   Вверх
boostcoder
Дата 26.10.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(xvr @  26.10.2011,  13:01 Найти цитируемый пост)
Посмотреть исходники ps

уже смотрю. спасибо.

Цитата(xvr @  26.10.2011,  13:01 Найти цитируемый пост)
это например /boot/System.map-* (или прямо nm на /boot/vmlinux-* )

вот теперь понял.

спасибо еще раз. буду ковыряться.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1940 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.