Як побачити, скільки контекстних комутаторів робить процес?


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 }'

Я спробував вищезгадану команду watch, але вихід становить лише 1 (для добровільного та мимовільного контекстного перемикання). Моя версія ядра Linux - 2.6.39-400.214.4.el6uek.x86_64. Чи залежить вихід від версії Linux?
Енді Дуфресне

Вставте, будь ласка, свій вихід сюди.

Це те саме, що згадувалося в answere - "дивитися -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?
poige

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

Напишіть у файл ( 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

Дивіться людину, що дозволяє вам запитувати кількість добровільних і мимовільних контекстних комутаторів.

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 );

Просто зателефонуйте йому двічі, до та після критичного розділу та побачите, збільшилось чи ні значення значення.ru._nivcsw.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.