"high involuntary context"开关是什么意思?
What does "high involuntary context" switches mean?
我在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
。
我的问题不是关于如何减少上下文切换。但是
- 当"非自愿上下文切换"更多时会发生什么
- 它将以何种方式影响系统
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
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 当我们说在执行程序时将操作系统的控制权传递给main()函数时,我们的意思是什么
- 这句话在c++中的意思是什么
- 这个typedef的意思是什么
- 这句话的意思是什么
- 意思是什么
- 这个句法的意思是什么?