无法为我的流程

时间:2016-11-19 12:02:04

标签: multithreading scheduler affinity cpu-cores cpuset

我有一个简单的单线程应用程序,可以进行几乎纯粹的处理

  
      
  1. 它使用两个相同大小的int缓冲区
  2.   
  3. 它逐个读取第一个缓冲区的所有值      
        
    • 每个值是第二个缓冲区中的随机索引
    •   
  4.   
  5. 它读取第二个缓冲区中索引处的值
  6.   
  7. 它汇总了从第二个缓冲区中获取的所有值
  8.   
  9. 它为更大更大的
  10. 做了所有前面的步骤   
  11. 最后,我打印了自愿和非自愿CPU上下文切换的次数
  12.   

如果缓冲区的大小变得很大,我的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个任务。但我知道有一个进程正在运行:似乎任务不是一个过程?

1 个答案:

答案 0 :(得分:1)

  

如果缓冲区的大小变得很大,我的PC开始变慢:为什么?我有4个超线程核心,所以3个核心正在重新映射。只有一个人100%忙碌。是因为我的流程几乎100%用于“RAM-bus”?

您达到了单线程应用程序的硬件性能限制,即您的程序所分配到的单CPU上的100%CPU时间。您的应用程序线程一次不会在多个CPU上运行(reference)

  

为了获得非自愿上下文切换次数= 0,我该怎么做?

--cpu_exclusive命令中是否遗漏了cset set选项?

顺便说一句,如果你想要实现更短的执行时间,我建议你制作一个多线程应用程序并让操作系统和硬件并行执行。将进程锁定到CPU集并阻止其进行上下文切换可能会降低操作系统性能,并且不是可移植的解决方案。