Как узнать, сколько переключений контекста делает процесс?


25

Я хочу видеть, делает ли мой процесс много переключений контекста. Я также хочу посмотреть, как управление группами задач влияет на количество переключений контекста.


Какая ОС? Какая версия? Какое ядро?
Микель

GNU / Linux 2.6.18
лунтен

5
Проверка/proc/[pid]/status
Кевин

Ответы:


30

Вы можете просмотреть информацию о переключениях контекста вашего процесса в /proc/<pid>/status.

$ pid=307
$ grep ctxt /proc/$pid/status
voluntary_ctxt_switches:        41
nonvoluntary_ctxt_switches:     16

Чтобы эти числа постоянно обновлялись, запустите

$ # Update twice a second.
$ watch -n.5 grep ctxt /proc/$pid/status

Чтобы получить только цифры, запустите

$ grep ctxt /proc/$pid/status | awk '{ print $2 }'

Я попробовал приведенную выше команду наблюдения, но вывод всего 1 (для произвольного и непроизвольного переключения контекста). Моя версия linux kernal - 2.6.39-400.214.4.el6uek.x86_64. Зависит ли вывод от версии linux?
Энди Дюфрен

Пожалуйста, вставьте свой вывод здесь.

Это так же, как упомянуто в ответе - "смотреть -n.5 grep ctxt / proc / 5647 / status"
Энди Дюфрен

Я должен использовать procfs, но в старых ядрах нет значений внутри /proc/.../status. любое предложение ?
Массимо

12

pidstat (1) - сообщает статистику по задачам Linux. По словам man pidstatэто так просто, как простоpidstat -w …


Я выполнил команду «watch -n0.5 pidstat -w -I -p 5876», но вывел 0 (для обоих cswch / s nvcswch / s). Эта команда работает для версии Linux - 2.6.39-400.214.4.el6uek.x86_64?
Энди Дюфрен

Эта команда должна работать просто отлично. Но берегитесь вы используете это неправильно , потому что , когда вы не задаете интервал отчета «задачи статистики должны представляться в течение времени с момента запуска системы (загрузки).» Похоже на vmstat, iostatи другие. Поэтому, если вам нужна текущая статистика, вместо того watch, чтобы просто запустить ее с интервалом в одну секунду.
Poige

Если я не смотрю, как я вижу, что числа постоянно обновляются? При выполнении команды "pidstat -w -I -p 5876 5" команда просто ждет 5 секунд, а затем печатает вывод (снова как 0). Он не работает непрерывно, как я ожидал (я знаю, что это противоречит тому, что написано на странице руководства pidstat - linux.die.net/man/1/pidstat ). Моя ОС - Oracle Linux Server 6.4.
Энди Дюфрен

Работает ли у вас `pidstat -w -l -p SELF 1`?
Пой

4

Чтобы получить запись всего процесса, вы можете использовать timeутилиту GNU (не путайте ее со bashвстроенной) с -vопцией. Вот пример с удаленными несвязанными строками вывода:

$ `which time` -v ls
a.out  exception_finder.cpp  log.txt
    Command being timed: "ls"
               ...
    Voluntary context switches: 1
    Involuntary context switches: 2
               ...
    Exit status: 0

3

Вы можете использовать sar -w. Например, sar -w 1 3сообщает общее количество переключений контекста в секунду за каждые 1 секунду в общей сложности 3 раза.


1
Это не работает "из коробки" на многих системах, даже если команда доступна. Можете ли вы включить в свой ответ, как включить сбор данных для sar?
Энтон

2

Запишите следующий скрипт в file ( ctx.sh). При этом ctx.sh <core>вы увидите все процессы, запущенные на данном ядре, и измененные переключатели nv-контекста будут выделены. Глядя на это, вы сможете определить, какие процессы конкурируют за ядро.

#!/bin/bash

if [[ $# -eq 0 ]]
then
   echo "Usage:"
   echo "$0 <core>"
   exit 1
fi

if [[ -z $2 ]]
then
   watch -d -n .2 $0 $1 nw
fi

ps -Leo lastcpu:1,tid,comm | grep "^$1 " | awk '{printf $3": ";system("cut -d\" \" -f3  /proc/"$2"/task/"$2"/schedstat 2>/dev/null")}' | sort -k 1 | column -t

1

Посмотрите man getrusage, который позволит вам запросить количество добровольных и недобровольных переключений контекста.

struct rusage {
           struct timeval ru_utime; /* user CPU time used */
           struct timeval ru_stime; /* system CPU time used */
           long   ru_maxrss;        /* maximum resident set size */
           long   ru_ixrss;         /* integral shared memory size */
           long   ru_idrss;         /* integral unshared data size */
           long   ru_isrss;         /* integral unshared stack size */
           long   ru_minflt;        /* page reclaims (soft page faults) */
           long   ru_majflt;        /* page faults (hard page faults) */
           long   ru_nswap;         /* swaps */
           long   ru_inblock;       /* block input operations */
           long   ru_oublock;       /* block output operations */
           long   ru_msgsnd;        /* IPC messages sent */
           long   ru_msgrcv;        /* IPC messages received */
           long   ru_nsignals;      /* signals received */
           long   ru_nvcsw;         /* voluntary context switches */
           long   ru_nivcsw;        /* involuntary context switches */
};

Вы можете сказать это, чтобы сообщить информацию для потока, как это:

struct rusage usage;
getrusage( RUSAGE_THREAD, &usage );

Просто позвоните дважды, до и после критического раздела, и посмотрите, увеличилось или нет значение use.ru_nivcsw.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.