"high involuntary context"开关是什么意思?



我在C中重写了一部分代码。当使用getrusage(2)C API记录资源使用情况来测试它时。

更改代码前:

user time (ms): 21503
system time (ms): 372
involuntary context switches: 20

更改后:

user time (ms): 25589
system time (ms): 80732
involuntary context switches: 821

我在重新编写的代码中看到了很多involuntary context switches

我的问题不是关于如何减少上下文切换。但是

  1. 当"非自愿上下文切换"更多时会发生什么
  2. 它将以何种方式影响系统

p.S:磁盘上没有任何活动,因为没有写入任何内容。它只是对服务器进行了几次ping。

更新:

增加了系统和用户花费的时间。

程序是多线程的。在这两种情况下都会产生相同数量的线程(3k线程)。只有C中的底层api正在被重写。

只要线程/进程进行阻塞的系统调用,就会发生自愿上下文切换。

当线程运行时间过长(通常大约10毫秒)而没有进行阻塞的系统调用,并且有进程在等待CPU时,就会发生非自愿的上下文切换。

看起来你的程序现在比以前更占用CPU了。如果你已经使它成为多线程的,那么可能会有所增加。

821上下文切换-根据程序的执行时间,这可能很多,也可能不多。

如果你想减少上下文开关的数量,你可以减少工作线程的数量,这样线程的数量就会少于CPU核心的数量。

更新

假设两种情况下的负载相同,那么代码修改似乎增加了cpu使用量。如果增加的负载是一个问题,您应该分析代码以找到瓶颈。检测可以帮助隔离导致问题的代码部分。

这并不能完全回答您的问题。无论如何,@Klas指出

线程运行时会发生调用上下文切换过长

所以我的想法是,您可以检查哪些线程运行时间过长。使用perf并在代码中查找上下文切换最频繁的位置。并可能将旧版本的程序与新版本的程序的度量值进行比较。

Perf(https://perf.wiki.kernel.org/index.php/Tutorial)具有事件CCD_ 2。你可以测量它,并在它发生的地方收集堆积物。这是一个测量上下文切换的例子:

perf record -e cs -g -p `pidof my_test` sleep 5

然后检查它们发生在哪里。例如,C++上有一个程序有一个不定循环,根本没有系统调用。所有交换机内容都与我的函数my_thread_func:有冲突

perf report --stdio -g --kallsym=/boot/System.map-2.6.32-431.el6.x86_64
# Samples: 7  of event 'cs'
# Event count (approx.): 7
#
# Overhead  Command      Shared Object                         Symbol
# ........  .......  .................  .............................
#
100.00%  my_test  [kernel.kallsyms]  [k] perf_event_task_sched_out
|
--- perf_event_task_sched_out
schedule
retint_careful
my_thread_func(void*)

相反,这是C++上一个程序的度量,该程序有一个带有大量系统调用的无限循环:

# Samples: 6  of event 'cs'
# Event count (approx.): 6
#
# Overhead          Command      Shared Object                         Symbol
# ........  ...............  .................  .............................
#
100.00%  my_test_syscall  [kernel.kallsyms]  [k] perf_event_task_sched_out
|
--- perf_event_task_sched_out
schedule
|
|--83.33%-- sysret_careful
|          syscall
|
--16.67%-- retint_careful
syscall

最新更新