欢迎来到 DPDK交流社区 ,有什么问题可以尽管在这里提问,您将会收到社区其他成员的回答;也可以将您的总结写在这里,为社区其他成员提供帮助。 QQ交流2群:635461501

cache line 共享导致的CPU使用率不准的问题

+1 投票

在DPDK项目中往往需要自己统计CPU的使用率,来确定自己那部分业务比较耗时,以及当前CPU的使用情况。

这其中我就遇到一个比较奇怪的问题,问题现象为:

当单独跑一个lcore的时候发现cpu_idle 为

u[0]idle:1333104163  ratio:0.00%

跑多个的时候如下:

u[0]idle:713996376  ratio:0.00%  u[1]idle:769687309  ratio:0.00%

u[0]idle:733672029  ratio:0.00%  u[1]idle:735847098  ratio:0.12%  u[2]idle:1647492574  ratio:0.00%

这个问题主要是由于软件设计中,不同lcore的结构体在设计时需要考虑到cache的一致性问题,不能把一个结构体放到同一个cache line 中,这样在取数据时,不同的lcore 会 取到同一个cache line里面的数据,导致数据出错。

之前定义的结构体为:

struct hds_cpu_idle{
        uint32_t cpu_idle;
        uint32_t cpu_idle_old;
        uint32_t cpu_working;
        uint32_t dummy;
};

改正如下:

struct hds_cpu_idle{
        uint64_t cpu_idle;
        uint64_t cpu_idle_old;
        uint64_t cpu_working;
        uint64_t dummy;
}__rte_cache_aligned;

下面为具体的计算cpu使用率的方式:

这个是计算cpu的使用率的模块:

     while(continue_lcore){                         
         
         printf("cpu ratio:\n");
         for(core = 0;core < max_worker;core++){
           core_ratio = MAX_UINT64 - cpu_ratio[core].cpu_idle_old + cpu_ratio[core].cpu_working+1;        
           cpu_ratio[core].cpu_idle_old = cpu_ratio[core].cpu_working ;
 
             if(core_ratio > cpu_ratio[core].cpu_idle)
                 cpu_ratio[core].cpu_idle = core_ratio;
 
             printf("u[%u]idle:%lu  ",core,cpu_ratio[core].cpu_idle);
             printf("ratio:%.2f%%  ",((float)(cpu_ratio[core].cpu_idle -                  core_ratio)/(float)cpu_ratio[core].cpu_idle * 100));
         }
         printf("\n");
         sleep(2);
     }

这个位置是每个lcore loop 收包的模块:

     while (lcore_loop) {
         cpu_ratio[id].cpu_working++;
         for (port = 0; port < num_ports; port++) {
             /* Burst rx from eth */
             const uint16_t rx_c =
                 rte_eth_rx_burst(port, id, buf, MAX_PKT_BURST);
             if (rx_c != 0) {
                 rte_eth_tx_burst(port ^1, id, buf, rx_c);           
             }
         }   
     }   

 

 

最新提问 3月 19 分类:经验之谈 | 用户: oops (2,210 分)
修改于 3月 19 用户:oops

登录 或者 注册 后回答这个问题。

...