nonvoluntary_ctxt_switches для RT процесса и прерывания.
$ git grep nivcsw
fs/proc/array.c: p->nivcsw);
include/linux/compat.h: compat_long_t ru_nivcsw;
include/linux/sched.h: unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
include/linux/sched.h: unsigned long nvcsw, nivcsw; /* context switch counts */
include/uapi/linux/resource.h: __kernel_long_t ru_nivcsw; /* involuntary " */
include/uapi/linux/taskstats.h: __u64 nivcsw; /* nonvoluntary_ctxt_switches */
kernel/compat.c: __put_user(r->ru_nivcsw, &ru->ru_nivcsw))
kernel/exit.c: sig->nivcsw += tsk->nivcsw;
kernel/exit.c: psig->cnivcsw +=
kernel/exit.c: p->nivcsw + sig->nivcsw + sig->cnivcsw;
kernel/fork.c: tsk->nvcsw = tsk->nivcsw = 0;
kernel/fork.c: tsk->last_switch_count = tsk->nvcsw + tsk->nivcsw;
kernel/hung_task.c: unsigned long switch_count = t->nvcsw + t->nivcsw;
kernel/sched/core.c: switch_count = &prev->nivcsw;
kernel/sched/debug.c: (long long)(p->nvcsw + p->nivcsw),
kernel/sched/debug.c: nr_switches = p->nvcsw + p->nivcsw;
kernel/sched/debug.c: "nr_involuntary_switches", (long long)p->nivcsw);
kernel/sys.c: r->ru_nivcsw += t->nivcsw;
kernel/sys.c: r->ru_nivcsw = p->signal->cnivcsw;
kernel/sys.c: r->ru_nivcsw += p->signal->nivcsw;
kernel/taskstats.c: stats->nivcsw = tsk->nivcsw;
kernel/taskstats.c: stats->nivcsw += tsk->nivcsw;
2793 if (likely(prev != next)) {
2794 rq->nr_switches++;
2795 rq->curr = next;
2796 ++*switch_count;
2797
2798 rq = context_switch(rq, prev, next); /* unlocks the rq */
2799 cpu = cpu_of(rq);
2800 } else
2801 raw_spin_unlock_irq(&rq->lock);
А скидывает ли это кэш? Это переключение контекста считается (user->core->user) ?
Какие способы оценить, на сколько прерывается приложение каждые 4ms?
По какому слову нужно grep запустить, чтобы понять, когда ставится новое "задание" на прерывание через 4ms и как можно убрать-то (вроде это и был вопрос ?
PS: Раньше я оценивал ущерб от прерываний так: смотрел, поменялся ли счётчик переключений и замерял время от предыдущего замера, считал среднее для меняется/не меняется и смотрел разницу. А сейчас он не меняется
CONFIG_NO_HZ_FULL не помогает?
ты хочешь знать какую часть процессорного времени съедает ОС?
Чем тебя не устраивает, например, "астрономическое время" - "user CPU time used"?
Ты хочешь full tickless, видимо?
Да, друзья! Походу, это оно. Как потестю, напишу.
интересно, чем ты таким занимаешься, что наносекунды считаешь?
сам себе задаю тот же вопрос постоянно
у меня дежавю, ты уже вроде страдал с рт-бизилупом?
Оставить комментарий
Phoenix
Хочу сделать busyloop на одном ядре в linux.Как я понимаю, срабатывает LOC один раз в 4 мс и видит, что ничего приоритетнее, чем текущий RT процесс нет. не прерывает его.
вопрос: прерывание есть, nonvoluntary_ctxt_switches не меняется, т.е. переключения нет. Почему?
Как бы 250 убрать? и делать это прерывание, например, по запросу пользователя (когда он хочет kill сделать и т.п.)