DPDK 轮询中高性能定时的方式

464 阅读1分钟

简介

在轮询的场景中,定时做一些业务逻辑,同时需要保障高性能,可以利用TSC来实现。

TSC(时间戳计数器,Time Stamp Counter)是一个高精度计时器,用于在CPU上测量时间。TSC是一个64位的寄存器,每个CPU都有一个TSC,它在每个时钟周期内递增。

rte_get_tsc_hz()

返回该CPU核1s对应的周期数。

uint64_t rte_get_tsc_hz(void ) 

Get the measured frequency of the RDTSC counter

rte_get_tsc_cycles()

返回从开机到现在的tsc周期数,同rte_rdtsc()

static uint64_t rte_get_tsc_cycles(void )

Return the number of TSC cycles since boot

示例

利用当前周期数 - 上次周期数,如果差值 > 自定义定时周期数,则进行业务处理。

#include <rte_cycles.h>

#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */

/* main processing loop */
static int
main_loop(__rte_unused void *dummy)
{
    uint64_t prev_tsc, diff_tsc, cur_tsc;
    // 100微秒周期数
    const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
    prev_tsc = 0;
    
    while (1) {    
		// 获取当前周期数
		cur_tsc = rte_rdtsc();
		// 减去上次周期数
		diff_tsc = cur_tsc - prev_tsc;
		// 判断差值是否大于自定义周期
		if (unlikely(diff_tsc > drain_tsc)) {
                    // 保存当前值
                    prev_tsc = cur_tsc;
                    // 定时业务处理
                    // TODO...
            }
    }
    ...
}