Поиск использования ЦП для потока в Linux

У меня есть приложение на основе C, работающее под Linux, с примерно 30 потоками. Теперь мне нужно написать небольшую утилиту, которая определяет использование ЦП каждым потоком в данный момент. Это может быть отдельное приложение или его часть.

Одна из проблем / proc заключается в том, чтобы определить, какой поток что есть.

Пожалуйста, дайте мне несколько идей о том, как начать.

Спасибо

7
задан hari 24 February 2012 в 12:07
поделиться

2 ответа

Одна из проблемы/proc находит, который поток что.

можно определить имя потока с помощью pthread_setname_np, чтобы определить имя потока и имя потока проверки данного времени с помощью /proc//задача//состояние или /proc//задача//статистика и затем проверить эти ответы calculating-cpu-usage-for-given-pid на stackoverflow для получения некоторое представление!

0
ответ дан 8 December 2019 в 01:17
поделиться

Как примечания OP, /proc файловая система имеет файл 'статистики' для каждого процесса, /proc/PROCESS-ID/stat и для каждой задачи /proc/PROCESS-ID/task/TASKID/stat. Позже статистика процесса, агрегат всех задач (включая выполненные задачи!).

Согласно man proc: поля 14, 15 в stat файл включают ЦП (пользователь, ядро) используемый.

, Что отпуск с задачей отображения потоков к TASKID. Как отмечено в странице справочника (см. кавычки), нет никакого прямого API к gettid, вместо этого syscall необходим

Для интерактивной утилиты, рассмотрите top (использование y для режима задачи)

Для кода, который может использоваться в приложении, видеть ниже

#define _GNU_SOURCE
#include <stdio.h>

#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

pid_t get_task_id(void) ;
int get_task_cpu(pid_t tid) ;

int main(int argc, char *argv[])
{
    pthread_create(...) ;
}

void thread_proc(void *arg) {
    pid_t tid = get_task_id() ;

    // do something

    int cpu = get_task_cpu(tid) ;
    printf("TID=%d CPU=%d\n", tid, cpu) ;
}

pid_t get_task_id(void) {
    pid_t tid = syscall(SYS_gettid);
    return tid ;
}

int get_task_cpu(pid_t tid) {
    char fname[200] ;
    snprintf(fname, sizeof(fname), "/proc/self/task/%d/stat", (int) get_task_id()) ;
    FILE *fp = fopen(fname, "r") ;
    if ( !fp ) return -1 ;
    int ucpu = 0, scpu=0, tot_cpu = 0 ;
    if ( fscanf(fp, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d %d",
        &ucpu, &scpu) == 2 )
        tot_cpu = ucpu + scpu ;
    fclose(fp) ;
    return tot_cpu ;
}

страница справочника для [1 111] состояния:

GETTID (2)

ИМЯ gettid - получают идентификацию потока

резюме #include

   pid_t gettid(void);

   Note: There is no glibc wrapper for this system call; see NOTES.

И позже: ПРИМЕЧАНИЯ. Glibc не обеспечивает обертку для этого системного вызова; назовите его с помощью syscall (2).

   The thread ID returned by this call is not the same thing as a POSIX thread ID (i.e., the opaque value returned by pthread_self(3)).

С примером кода в syscall

   #define _GNU_SOURCE
   #include <unistd.h>
   #include <sys/syscall.h>
   #include <sys/types.h>
   #include <signal.h>

   int
   main(int argc, char *argv[])
   {
       pid_t tid;

       tid = syscall(SYS_gettid);
       ...
    }
0
ответ дан 8 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

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