У меня есть приложение на основе C, работающее под Linux, с примерно 30 потоками. Теперь мне нужно написать небольшую утилиту, которая определяет использование ЦП каждым потоком в данный момент. Это может быть отдельное приложение или его часть.
Одна из проблем / proc заключается в том, чтобы определить, какой поток что есть.
Пожалуйста, дайте мне несколько идей о том, как начать.
Спасибо
Одна из проблемы/proc находит, который поток что.
можно определить имя потока с помощью pthread_setname_np, чтобы определить имя потока и имя потока проверки данного времени с помощью /proc//задача//состояние или /proc//задача//статистика и затем проверить эти ответы calculating-cpu-usage-for-given-pid на stackoverflow для получения некоторое представление!
Как примечания 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); ... }