什么是“高度非自愿的背景”开关意味着什么?

C语言重写了一部分代码。使用getrusage(2) C APItesting资源使用情况。

在更改代码之前:

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都是在我重写的代码中完成的。

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

  1. 当“非自愿的上下文切换”更多时会发生什么?
  2. 它会以什么方式影响系统?

PS:没有任何东西正在写入磁盘上没有活动。 它只是多次ping服务器。

更新:

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

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

Solutions Collecting From Web of "什么是“高度非自愿的背景”开关意味着什么?"

每当一个线程/进程产生一个阻塞的系统调用时,就会发生一个volontary上下文切换。

当一个线程运行时间过长(通常类似于10毫秒),而不进行阻塞的系统调用,并且有进程正在等待CPU时,会发生一个神经上下文切换。

看起来您的程序现在比以前更耗费CPU资源。 如果你使它成为多线程,那么可能会增加。

821上下文切换 – 取决于您的程序的执行时间,这可能会或可能不会很多。

如果要减少上下文切换的数量,可以减少工作线程的数量,以使线程数量少于CPU核心数量。

更新

假设在这两种情况下的负载是相同的,看起来代码修改增加了CPU使用率。 如果增加的负载是一个问题,你应该分析代码来找到瓶颈。 仪表可以有助于隔离导致问题的哪部分代码。

这不是你的问题的答案。 无论如何,@Klas指出

当一个线程运行时间过长时,就会产生一个未知的上下文切换

所以我的想法是,你可以检查你的线程运行时间太长。 在上下文切换最频繁的地方使用perf和find代码。 并可能比较旧版本的程序与新版本的测量。

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

 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