我有一个简单的单线程应用程序,可以进行几乎纯粹的处理
- 它使用两个相同大小的int缓冲区
- 它逐个读取第一个缓冲区的所有值
- 每个值是第二个缓冲区中的随机索引
- 它读取第二个缓冲区中索引处的值
- 它汇总了从第二个缓冲区中获取的所有值
- 它为更大更大的
做了所有前面的步骤- 最后,我打印了自愿和非自愿CPU上下文切换的次数
醇>
如果缓冲区的大小变得很大,我的PC开始变慢:为什么?我有4个超线程核心,所以3个核心正在重新映射。只有一个人100%忙碌。是因为我的流程几乎100%用于" RAM-bus"?
然后,我创建了一个我想要专用于我的进程的CPU集(我的CPU集包含同一核的两个CPU线程)
$ cat /sys/devices/system/cpu/cpu3/topology/core_id
3
$ cat /sys/devices/system/cpu/cpu7/topology/core_id
3
$ cset set -c 3,7 -s my_cpuset
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 934 1 /
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
似乎完全没有任务在我的CPU上运行。我可以重新启动我的流程,当它运行时,我启动:
$ taskset -c 7 ./TestCpuset # Here, I launch my process
...
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process
PID TID COMMAND USER PSR
25244 - TestCpus phil -
- 25244 - phil 7
PSR = 7:我的进程在预期的CPU线程上运行良好。我希望它是唯一一个在它上面运行的,但最后,我的进程显示:
Number of voluntary context switch: 2
Number of involuntary context switch: 1231
如果我有非自愿的上下文切换,则意味着其他进程正在我的核心上运行:如何可能?我必须做什么才能获得非自愿上下文数量= 0?
上一个问题:当我的进程正在运行时,如果我启动
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 1031 1 /
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
我的CPU设置再次获得0个任务。但我知道有一个进程正在运行:似乎任务不是一个过程?
答案 0 :(得分:1)
如果缓冲区的大小变得很大,我的PC开始变慢:为什么?我有4个超线程核心,所以3个核心正在重新映射。只有一个人100%忙碌。是因为我的流程几乎100%用于“RAM-bus”?
您达到了单线程应用程序的硬件性能限制,即您的程序所分配到的单CPU上的100%CPU时间。您的应用程序线程一次不会在多个CPU上运行(reference)。
为了获得非自愿上下文切换次数= 0,我该怎么做?
--cpu_exclusive
命令中是否遗漏了cset set
选项?
顺便说一句,如果你想要实现更短的执行时间,我建议你制作一个多线程应用程序并让操作系统和硬件并行执行。将进程锁定到CPU集并阻止其进行上下文切换可能会降低操作系统性能,并且不是可移植的解决方案。