[dpdk] TSC , HPET, Timer, Event Timer,RDTSCP

关于dpdk timer跨越CPU core调度的准确性问题

首先dpdk的timer接口里边使用 cpu cycle来比较时间。根据之前的内容

[dpdk] dpdk --lcores参数

当一个EAL thread映射在多个processor上的时候,cpu cycle有可能在不同的CPU core上面获得,

又因为cpu cycle是使用rdtsc指令获取的,这样会造成拿到的cpu cycle不准的问题。

首先,调查一下 rdtsc 指令:

https://stackoverflow.com/questions/3388134/rdtsc-accuracy-across-cpu-cores?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Invariant TSC

X86_FEATURE_CONSTANT_TSC + X86_FEATURE_NONSTOP_TSC

"16.11.1 Invariant TSC

The time stamp counter in newer processors may support an enhancement, referred to as invariant TSC. Processor‘s support forinvariant TSC is indicated by CPUID.80000007H:EDX[8].

The invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states. This is the architectural behavior movingforward. On processors with invariant TSC support, the OS may use the TSC for wall clock timer services (instead of ACPI orHPET timers). TSC reads are much more efficient and do not incur the overhead associated with a ring transition oraccess to a platform resource."
[[email protected] ~]# cat /proc/cpuinfo |grep tsc
constant_tsc nonstop_tsc

只能保证在单个core 改变频率或挂起的时候的tsc准确性,不能保证跨CPU core的同步问题。

https://software.intel.com/en-us/forums/software-tuning-performance-optimization-platform-monitoring/topic/388964

Hello Samuel,

The ‘Invariant TSC‘ means that the TSC runs at a fixed frequency and doesn‘t stop when the cpu halts.
The TSCs are not guaranteed to be synchronized although the OS usually does try to synchronize the TSC at boot time. This is one reason for the rdtscp instruction. On Nehalem and later cpus, the rdtscp instruction returns the TSC and an identifier indicating on which cpu you read the TSC. RDTSCP is a serializing instruction... unlike the regular rdtsc instruction.

Pat

HPET

https://en.wikipedia.org/wiki/High_Precision_Event_Timer

An HPET chip consists of a 64-bit up-counter (main counter) counting at a frequency of at least 10 MHz, and a set of (at least three, up to 256) comparators. These comparators are 32- or 64-bit-wide. The HPET is programmed via a memory mapped I/O window that is discoverable via Advanced Configuration and Power Interface (ACPI). The HPET circuit in modern PCs is integrated into the southbridge chip.[a]

HPET是一个芯片全局的计数器,最小精度为10纳秒,一般集成在南桥。

HPET提供最少3最多256个独立的计数器。

The Linux kernel can also use HPET as its clock source. The documentation of Red Hat MRG version 2 states that TSC is the preferred clock source due to its much lower overhead, but it uses HPET as a fallback. A benchmark in that environment for 10 million event counts found that TSC took about 0.6 seconds, HPET took slightly over 12 seconds, and ACPI Power Management Timer took around 24 seconds.[5]

虽然精度高,到底有性能损耗,linux Kernel仍然推荐TSC作为首选计数器,HPET作为备选。

查看HPET是否启用:

[[email protected] cli]# grep hpet /proc/timer_list
Clock Event Device: hpet
 set_next_event: hpet_legacy_next_event
 set_mode:       hpet_legacy_set_mode
[[email protected] jstack-vrouter]# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
kvm-clock hpet acpi_pm
[[email protected] jstack-vrouter]# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
[[email protected] jstack-vrouter]# ll /dev/hpet
crw-------. 1 root root 10, 228 May  3 16:23 /dev/hpet
[[email protected] jstack-vrouter]# 

dpdk如何配置生效:

https://dpdk.org/doc/guides/linux_gsg/enable_func.html#high-precision-event-timer-hpet-functionality

rdtscp 

ACPI

略。

Event Timer Adapter Library

https://dpdk.org/doc/guides/prog_guide/event_timer_adapter.html#id1

看完以上文档,读一下代码,确定两个问题:

1. RDTSC的调用时机

2. Event Timer backend的hardware是什么?

其他参考阅读:

https://www.ibm.com/developerworks/cn/linux/l-cn-timerm/

原文地址:https://www.cnblogs.com/hugetong/p/8987251.html

时间: 2024-10-08 19:02:25

[dpdk] TSC , HPET, Timer, Event Timer,RDTSCP的相关文章

qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

最近抽空又看了下qt,发现用它来实现一些东西真的很容易比如下面这个例子,绘制了个圆形的时钟,但代码却清晰易懂[例子源自奇趣科技提供的例子]因为清晰,所以就只写注释了,吼吼其实也就这么几行代码头文件 //clock.h #ifndef CLOCK_H#define CLOCK_H #include <QWidget> class Clock : public QWidget{//对于具有signal,slot机制的类需要声明    Q_OBJECT public:    Clock(QWidge

python全栈开发基础【第二十五篇】死锁,递归锁,信号量,Event事件,线程Queue

一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 #死锁现象 死锁------------------- from threading import Thread,Lock,RLock import time mutexA = Lock() mutexB = Lock() class

7 死锁,递归锁,信号量,Event事件,线程Queue

一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 死锁------------------- from threading import Thread,Lock,RLock import time mutexA = Lock() mutexB = Lock() class MyThr

Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue

python并发编程之多线程2------------死锁与递归锁,信号量等 一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 1 死锁------------------- 2 from threading import Thread,Lock,RLock 3 import tim

Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是每个事件都对应同一个事件处理器,在该事件处理器中对不同的事件进行分类处理,这样的弊端有两点:第一,导致该事件处理器过于臃肿复杂:第二,这样不便于扩展,当系统新增加事件类型或者是我们需要使用到自定义事件时,就不得不修改Qt的源码来达到目的.所以Qt设计者的做法是针对不同类型的事件提供不同的事件处理器与之对

DICOM:剖析Orthanc中的Web Server,Mongoose之 Flag bit &amp; Event(三)

背景: Orthanc是本专栏中介绍过的一款新型DICOM服务器,具有轻量级.支持REST的特性,可将任意运行Windows和Linux系统的计算机变成DICOM服务器,即miniPACS.Orthanc内嵌多种模块,数据库管理简单,且不依赖于第三方软件.因此通过剖析Orthanc源码可以学习到搭建DICOM系统中的各个环节,例如SQLite嵌入型数据库.GoogleLog日志库.DCMTK医学DICOM库,以及近期要介绍的开源Web Server,Mongoose. 上一篇博文中简单的分析了M

mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

由于项目需要创建定时器(evevt),所以就百度了一下,发现基本都是来源于一个模板,有些功能还不全,现在自己总结一下. 注:mysql版本是从5.1开始才支持event的.如果你的版本低于5.1就先升级版本吧. 查看版本的方法有很多,这里只给大家提供一个    select version(): 1.查看是否开启evevt与开启evevt. 1.1.MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的.               sh

mysql定时脚本(event),类似oracle的job

我有2张表:tb_push_data 和 tb_push_data_log 现在需要每隔一段时间将tb_push_data 符合条件的 数据备份到表 tb_push_data_log www.2cto.com -------------------------------------------------------------------------- 一.创建存储过程 DELIMITER $$ USE `push_server_db`$$ DROP PROCEDURE IF EXISTS

这样理解比较好吧(pageX,pageY,clientX,clientY,eventX,eventY,scrollX,scrollY,screenX,screenY,event.offsetX,event.offsetY,offsetLeft,style.left)

1 pageX,pageY:鼠标指针相对于当前窗口的X,Y坐标,计算区域包括窗口自身的控件和滚动条.(火狐特有) 2 event.clientX,event.clientY:鼠标指针相对于当前窗口的X,Y坐标,和page 不同的是计算区域不包括窗口自身的控件和滚动条. 3 event.X和event.Y:相对于当前窗口,设置或获取鼠标指针位置相对于父文档的x,y像素坐标(可惜火狐不支持,人生总要有些遗憾也是没办法的). 4 scrollX,scrollY:望文生义,相对于浏览器而言的,随滚动条移