简介
在轮询的场景中,定时做一些业务逻辑,同时需要保障高性能,可以利用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...
}
}
...
}