精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

x86 Linux 下實現 10us 誤差的高精度延時

系統 Linux
在 Linux 下實現高精度延時,網上所能找到的大部分方法只能實現 50us 左右的延時精度。今天讓我們來看下嘉友創信息科技的董文會是如何解決這個問題的,將延時精度提升到 10us。

[[417793]]

在 Linux 下實現高精度延時,網上所能找到的大部分方法只能實現 50us 左右的延時精度。今天讓我們來看下嘉友創信息科技的董文會是如何解決這個問題的,將延時精度提升到 10us。

問題描述

最近在開發一個項目,需要用到高精度的延時機制,設計需求是 1000us 周期下,誤差不能超過 1%(10us)

由于項目硬件方案是用英特爾的 x86 處理器,熟悉 Linux 硬件的人都知道這個很難實現。當時評估方案時候有些草率,直接采用了 “PREEMPT_RT 補丁+內核 hrtimer+信號通知” 的方式來評估。當時驗證的結果也很滿意,于是興沖沖的告訴領導說方案可行,殊不知自己挖了一個巨大的坑……

實際項目開始的時候,發現這個方案根本行不通,有兩個原因:

  • 信號通知只能通知到進程,而目前移植的方案無法做到被通知的進程中無其他線程。這樣高頻的信號發過來,其他線程基本上都會被干掉。(補充說明:這里特指的是內核驅動通知到應用層,在用戶層中是有專門的函數可以通知不同線程的。并且這個問題經過研究,可以通過設置線程的 sigmask 來解決,但是依舊無法改變方案行不通的結論)
  • 這也是主要原因,項目中需要用的 Ethercat 的同步周期雖然可以在程序開始時固定,但是實際運行時的運行周期是需要動態調整的,調整范圍在 5us 以內。這樣一來,動態調整 hrtimer 的開銷就變得無法忽略了,換句話說,我們需要的是一個延時機制,而不是定時器。

所以這個方案被否定了。

解決思路

既然信號方式不行,那只能通過其他手段來分析。總結下來我大致進行了如下的嘗試:

1、sleep方案的確定

嘗試過 usleepnanosleepclock_nanosleepcond_timedwaitselect 等,最終確定用 clock_nanosleep,選它的原因并不是因為它支持 ns 級別的精度。因為經過測試發現,上述幾個調用在周期小于 10000us 的情況下,精度都差不多,誤差主要都來自于上下文切換的開銷。選它的主要原因是因為它支持 TIME_ABSTIME 選項,即支持絕對時間。這里舉個簡單的例子,解釋一下為什么要用絕對時間:

  1. while(1){
  2. do_work();
  3. sleep(1);
  4. do_post();
  5. }

假設上面這個循環,我們目的是讓 do_post 的執行以 1s 的周期執行一次,但是實際上,不可能是絕對的 1s,因為 sleep() 只能延時相對時間,而目前這個循環的實際周期是 do_work 的開銷 + sleep(1) 的時間。所以這種開銷放在我們需求的場景中,就變得無法忽視了。而用 clock_nanosleep 的好處就是一方面它可以選擇時鐘源,其次就是它支持絕對時間喚醒,這樣我在每次 do_work 之前都設置一下 clock_nanosleep 下一次喚醒時的絕對時間,那么 clock_nanosleep 實際執行的時間其實就會減去 do_work 的開銷,相當于是鬧鐘的概念。

2、改用實時線程

將重要任務的線程改成實時線程,調度策略改成 FIFO,優先級設到最高,減少被搶占的可能性。

3、設置線程的親和性

對應用下所有的線程進行規劃,根據負載情況將幾個負載比較重的任務線程分別綁定到不同的 CPU 核上,這樣減少切換 CPU 帶來的開銷。

4、減少不必要的sleep調用

由于很多任務都存在 sleep 調用,我用 strace 命令分析了整個系統中應用 sleep 調用的比例,高達 98%,這種高頻次休眠+喚醒帶來的開銷勢必是不可忽略的。所以我將 main 循環中的 sleep 改成了循環等待信號量的方式,因為 pthread 庫中信號量的等待使用了 futex,它使得喚醒線程的開銷會小很多。其他地方的 sleep 也盡可能的優化掉。這個效果其實比較明顯,能差不多減少 20us 的誤差

5、絕招

從現有應用中剝離出最小任務,減少所有外界任務的影響。

經過上述五點,1000us 的誤差從一開始的 ±100us,控制到了 ±40us。但是這還遠遠不夠……

黔驢技窮的我開始漫長的搜索研究中……

這期間也發現了一些奇怪的現象,比如下面這張圖。

 

圖片是用 Python 對抓包工具的數據進行分析生成的,參考性不用質疑。縱軸代表實際這個周期所耗費的時間。可以發現很有意思的現象:

  1. 每隔一定周期,會集中出現規模的誤差抖動
  2. 誤差不是正態分布,而是頻繁出現在 ±30us 左右的地方
  3. 每次產生較大的誤差時,下個周期一定會出現一次反向的誤差,而且幅度大致相同(這點從圖上看不出來,通過其他手段分析的)。

簡單描述一下就是假設這個周期的執行時間是 980us,那下個周期的執行時間一定會在 1020us 左右。

第 1 點和第 2 點可以經過上面的 4 條優化措施消除,第 3 點沒有找到非常有效的手段,我的理解可能內核對這種誤差是知曉的并且有意在彌補,如果有知道相關背后原理的大神歡迎分享一下。

針對這個第三點奇怪的現象我也嘗試做了手動的干預,比如設一個閾值,當實際程序執行的誤差大于這個閾值時,我就在設置下一個周期的喚醒時間時,手動減去這個誤差,但是運行效果卻大跌眼鏡,更差了……

柳暗花明

在嘗試了 200 多次參數調整,被這個問題卡了一個多禮拜之后,偶然發現了一篇戴爾的技術文檔《Controlling Processor C-State Usage in Linux》,受到這篇文章的啟發,終于解決了這個難題。

隨后經過一番針對性的查找終于摸清了來龍去脈:

原來英特爾的 CPU 為了節能,有很多功耗模式,簡稱 C-state。

 

 

 

< 如顯示不全,請左右滑動 >

模式

名字

作用

CPU

C0

操作狀態

CPU完全打開

所有CPU

C1

停止

通過軟件停止 CPU 內部主時鐘;總線接口單元和 APIC 仍然保持全速運行

486DX4及以上

C1E

增強型停止

通過軟件停止 CPU 內部主時鐘并降低 CPU 電壓;總線接口單元和 APIC 仍然保持全速運行

所有socket 775 CPU

C1E

停止所有CPU內部時鐘

Turion 64、65-nm Athlon X2和Phenom CPU

C2

停止授予

通過硬件停止 CPU 內部主時鐘;總線接口單元和 APIC 仍然保持全速運行

486DX4及以上

C2

停止時鐘

通過硬件停止CPU內部和外部時鐘

僅限486DX4、Pentium、Pentium MMX、K5、K6、K6-2、K6-III

C2E

擴展的停止授予

通過硬件停止 CPU 內部主時鐘并降低 CPU 電壓;總線接口單元和 APIC 仍然保持全速運行

Core 2 Duo和更高版本(僅限Intel)

C3

睡眠

停止所有CPU內部時鐘

Pentium II、Athlon以上支持,但Core 2 Duo E4000和E6000上不支持

C3

深度睡眠

停止所有CPU內部和外部時鐘

Pentium II以上支持,但Core 2 Duo E4000、E6000和Turion 64上不支持

C3

AltVID

停止所有CPU內部時鐘和降低CPU電壓

AMD Turion 64

C4

更深入的睡眠

降低CPU電壓

Pentium M以上支持,但Core 2 Duo E4000、E6000和Turion 64上不支持

C4E/C5

增強的更深入的睡眠

大幅降低CPU電壓并關閉內存高速緩存

Core Solo、Core Duo和45-nm移動版Core 2 Duo支持

C6

深度電源關閉

將 CPU 內部電壓降低至任何值,包括 0 V

僅45-nm移動版Core 2 Duo支持

 

 

 

圖表來自 DELL

當程序運行的時候,CPU 是在 C0 狀態,但是一旦操作系統進入休眠,CPU 就會用 Halt 指令切換到 C1 或者 C1E 模式,這個模式下操作系統如果進行喚醒,那么上下文切換的開銷就會變大!

這個選項按道理 BIOS 是可以關掉的,但是坑的地方就在于版本相對較新的 Linux 內核版本,默認是開啟這個狀態的,并且是無視 BIOS 設置的!這就很坑了!

 

針對性查找之后,發現網上也有網友測試,2.6 版本的內核不會默認開啟這個,但是 3.2 版本的內核就會開啟,而且對比測試發現,這兩個版本內核在相同硬件的情況下,上下文切換開銷可以相差 10 倍,前者是 4us,后者是 40-60us。

解決辦法

1、永久修改

可以修改 Linux 的引導參數,修改 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX_DEFAULT 選項,改成下面的內容:

  1. intel_idle.max_cstate=0 processor.max_cstate=0 idle=poll

然后使用 update-grub 命令使參數生效,重啟即可。

2、動態修改

可以通過向 /dev/cpu_dma_latency 這個文件中寫值,來調整 C1/C1E 模式下上下文切換的開銷。我選擇寫 0 直接關閉。當然你也可以選擇寫一個數值,這個數值就代表上下文切換的開銷,單位是 us。比如你寫 1,那么就是設置開銷為 1us。當然這個值是有范圍的,這個范圍在 /sys/devices/system/cpu/cpuX/cpuidle/stateY/latency 文件中可以查到,X 代表具體哪個核,Y 代表對應的 idle_state。

至此,這個性能問題就得到了完美的解決,目前穩定測試的性能如下圖所示:

 

實現了 x86 Linux 下高精度延時 1000us 精確延時,精度 10us。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2011-04-25 14:51:59

Linux任務切換TSS

2009-06-18 09:11:03

微軟Windows 7下載

2011-12-01 11:09:48

AMDx86服務器英特爾

2011-04-21 10:49:28

Linux時間定時器

2012-09-19 09:51:45

Windows Serx86服務器選型

2021-06-07 15:20:22

Linux X861MB內存BIOS

2014-12-24 09:41:05

x86C#

2013-01-31 10:04:20

x86服務器虛擬化

2011-02-20 22:23:43

X86虛擬化XenServer

2011-12-19 10:55:58

云計算中國電信

2011-11-10 09:26:48

Solaris 11

2009-08-28 14:38:33

2020-09-23 12:42:08

Linux

2020-10-13 10:51:10

Linux內核

2010-02-04 16:27:24

Android X86

2010-05-07 17:47:12

Unix Solari

2019-03-22 08:25:20

x86PythonARM

2021-07-07 11:35:17

Linux內存段尋址

2011-12-14 13:02:05

Power虛擬機X86平臺服務器

2010-04-29 17:50:15

點贊
收藏

51CTO技術棧公眾號

精品少妇一二三区| 国产sm在线观看| 91高清在线| 国产麻豆精品在线| 欧美中文字幕精品| www色aa色aawww| 欧美人与动xxxxz0oz| 欧美丝袜自拍制服另类| 91午夜在线观看| 国产三级视频在线看| 国产成人亚洲综合a∨猫咪| 久久免费国产视频| 精品无码国产污污污免费网站| 国产美女精品视频免费播放软件| 福利二区91精品bt7086| 亚洲 欧洲 日韩| 全部免费毛片在线播放网站| 国产伦理精品不卡| 国产精品视频导航| 亚洲男人的天堂在线视频| 日韩高清电影免费| 日韩视频一区二区在线观看| wwwwww.色| 九色porny自拍视频在线播放| 国产精品一区二区婷婷| 神马香蕉久久| 91精品在线麻豆| 欧洲熟妇精品视频| 女厕盗摄一区二区三区| 亚洲精品成人悠悠色影视| 亚洲开发第一视频在线播放| 十九岁完整版在线观看好看云免费| 国产在线观看一区二区| 国产精品老牛影院在线观看| 国产精品黄色大片| 亚洲一级网站| 欧美大片大片在线播放| 天天色影综合网| 欧美综合一区| 亚洲一区二区福利| av小说在线观看| 网友自拍一区| 日韩成人在线视频| 国产伦精品一区三区精东| 日韩欧美一级| 日韩欧美成人午夜| 97免费公开视频| 欧美一区一区| 欧美大片免费久久精品三p| 国产传媒免费观看| 国产精品99久久免费| 精品视频在线看| 超碰超碰在线观看| 青娱乐极品盛宴一区二区| 在线免费av一区| 精品999在线| 久久久免费人体| 欧美美女一区二区三区| 高潮一区二区三区| 国产激情综合| 精品国产一区二区三区不卡| 成年人看片网站| 成人知道污网站| 亚洲国产私拍精品国模在线观看| 国产 xxxx| 亚欧日韩另类中文欧美| 亚洲欧美日本另类| 日韩女同一区二区三区| 久久一本综合| 九九热最新视频//这里只有精品| 黄色一级视频免费| 亚洲理论在线| 国产精品jizz在线观看麻豆| 伊人免费在线观看高清版| 蓝色福利精品导航| 不卡视频一区| 日韩精品福利| 国产精品精品国产色婷婷| 男女啪啪免费观看| 国产伦久视频在线观看| 91久久精品国产91性色tv| 天天干天天综合| 亚洲一区二区三区中文字幕在线观看| 亚洲高清色综合| www.狠狠爱| 欧美精品九九| 青草青草久热精品视频在线网站 | 99热精品久久| 欧美黑人巨大精品一区二区| 超碰中文字幕在线| 久久99精品国产.久久久久久| 福利精品视频| 在线激情网站| 亚洲成人777| 色免费在线视频| 国语一区二区三区| 在线观看国产成人av片| 久久久精品视频在线| 久久精品日产第一区二区| 成人免费观看a| 亚洲av激情无码专区在线播放| 欧美经典三级视频一区二区三区| 精品国产一区二区三区在线| 欧洲av不卡| 日韩精品一区二区三区在线观看 | 亚洲图片 自拍偷拍| 欧美久久香蕉| 久久国产加勒比精品无码| 日本中文字幕在线| 国产成人综合在线| 亚洲第一综合| 最近高清中文在线字幕在线观看1| 欧美人狂配大交3d怪物一区| 免费a级黄色片| 午夜欧美精品| 国产情人节一区| 日韩资源在线| 亚洲高清中文字幕| 中文 日韩 欧美| 欧美日韩在线二区| 全球成人中文在线| 欧美一级视频免费| 亚洲黄色小说网站| 91亚洲免费视频| 国产一区网站| 奇米一区二区三区四区久久| 色噜噜在线播放| 亚洲自拍偷拍九九九| www.国产福利| 亚洲国产老妈| 91在线视频成人| 日本三级视频在线观看| 欧美在线高清视频| 一级黄色片大全| 国产精品日韩欧美一区| 国产一区不卡在线观看| 男人天堂亚洲| 精品久久一区二区| 欧美日韩在线视频免费| 国产精品影视在线| 最新av网址在线观看| 国产精品亚洲综合在线观看| 精品国产依人香蕉在线精品| 中国女人一级一次看片| 中文字幕av不卡| 一区二区三区网址| 日本欧美视频| 国产一区二区丝袜| 黄视频网站在线| 日韩视频在线你懂得| 欧美国产日韩综合| 成人精品在线视频观看| 丁香花在线影院观看在线播放| 99久久人爽人人添人人澡| 欧美黑人一区二区三区| 丰满岳乱妇国产精品一区| 亚洲国产欧美日韩另类综合 | 中文无字幕一区二区三区 | bt欧美亚洲午夜电影天堂| 全黄性性激高免费视频| 欧美有码在线| 国产精品大陆在线观看| 色三级在线观看| 制服丝袜中文字幕一区| 久久久精品99| 久久久综合精品| 亚洲综合日韩欧美| 中文av一区| 国产欧美亚洲日本| 精品国产第一福利网站| 最近的2019中文字幕免费一页| 国产精品久久久久久久免费| 亚洲综合一二三区| 在线精品一区二区三区| 日本中文在线一区| 亚洲欧美日韩不卡| 国产精品qvod| 国产精品久久久久7777婷婷| 免费av在线网址| 精品国产免费久久| 无码视频一区二区三区| 最新国产成人在线观看| 妖精视频一区二区| 蜜桃av噜噜一区| 欧美精品卡一卡二| 国产欧美日韩| 99精品欧美一区二区三区| 亚洲黄色网址| 欧美成人小视频| 国产一区精品| 亚洲成人精品视频在线观看| 五月婷婷激情五月| 亚洲午夜免费电影| 99精品欧美一区二区| 成人在线视频首页| 五月婷婷六月丁香激情| 日韩视频在线一区二区三区| 一区在线电影| 亚洲国产欧美日韩在线观看第一区 | 久久99国内精品| 欧美丰满熟妇bbbbbb百度| 亚洲深深色噜噜狠狠爱网站| 秋霞久久久久久一区二区| 天堂精品久久久久| 国产精品久久视频| 草草视频在线观看| 欧美成人精品激情在线观看| 九一国产在线| 亚洲国产美女精品久久久久∴| 在线视频 中文字幕| 粉嫩av一区二区三区免费野| 久草视频在线资源| 亚洲天天做日日做天天谢日日欢| 91网站免费视频| 99九九99九九九视频精品| 污污视频在线免费| 免费的成人av| 老头吃奶性行交视频| 99热这里只有精品8| 国产亚洲精品久久久久久久| 国产精品99一区二区三区| 日本黑人久久| 女人丝袜激情亚洲| 精品国产综合久久| 成人爽a毛片免费啪啪红桃视频| 91亚洲精品久久久| 91成人在线网站| 国产美女搞久久| 日本精品在线中文字幕| 欧美一级电影久久| 日本黄色免费在线| 欧美激情奇米色| 污视频网站免费在线观看| 色偷偷噜噜噜亚洲男人的天堂| 成人全视频高清免费观看| 亚洲全黄一级网站| 国内av一区二区三区| 亚洲欧美国产日韩中文字幕| 亚洲 美腿 欧美 偷拍| 亚洲成av人片在线观看香蕉| 丰满肥臀噗嗤啊x99av| 精品国产乱码久久久久久牛牛| 精品人妻一区二区三区日产乱码 | 国产精品久久波多野结衣| 亚洲午夜国产成人| 91精品国产综合久久久久久久久 | 欧美精品三级日韩久久| 懂色av蜜臀av粉嫩av喷吹| 色嗨嗨av一区二区三区| 无码视频在线观看| 欧美性生活久久| 亚洲一线在线观看| 这里只有精品视频在线观看| 国产又黄又粗又猛又爽| 337p亚洲精品色噜噜噜| 国产高潮在线观看| 精品久久五月天| 天堂av中文字幕| 亚洲精品中文字幕有码专区| 加勒比一区二区三区在线| 伊人伊人伊人久久| 欧美日本高清| 欧美成人免费播放| av资源一区| 日韩av电影在线免费播放| 日韩免费小视频| 国产一区二区丝袜| 亚洲啊v在线免费视频| 国产精品免费在线播放| 五月激激激综合网色播| 视频一区视频二区视频三区视频四区国产 | 日韩欧美一区二区三区久久婷婷| 日韩国产专区| 国产黄色激情视频| 麻豆亚洲精品| 99国产精品久久久久久| 成人性生交大片| 色哟哟精品观看| 亚洲免费在线看| 国产精品999在线观看| 欧美怡红院视频| www.香蕉视频| 亚洲欧美色图片| 在线免费观看的av| 日本免费久久高清视频| 国产精品视频一区二区三区| 久久国产精品一区二区三区四区| 国内黄色精品| 欧妇女乱妇女乱视频| 老牛国产精品一区的观看方式| 人人爽人人爽av| 91网上在线视频| 成人三级视频在线观看| 欧美日韩国产在线播放| 一级片在线免费观看视频| 亚洲精品一线二线三线| 成人激情电影在线看| 久久777国产线看观看精品| 日本韩国欧美| http;//www.99re视频| 精品久久久久中文字幕小说 | 免费网站在线观看人| 欧美在线视频免费| 亚洲精品不卡在线观看| 午夜精品美女久久久久av福利| 欧美另类综合| 色噜噜狠狠永久免费| 99久精品国产| 少妇久久久久久被弄高潮| 欧美三级韩国三级日本三斤| 国 产 黄 色 大 片| 日韩中文字幕在线免费观看| 在线女人免费视频| 精品国产a毛片| 精品视频免费在线播放| 伊人久久综合| 亚洲一区二区三区四区精品| 国产女同互慰高潮91漫画| 国产成人啪精品午夜在线观看| 欧美欧美欧美欧美| 国产免费av在线| 欧美又大又粗又长| 嗯用力啊快一点好舒服小柔久久| 亚洲国产精品影视| 奇米一区二区三区av| 久久久精品人妻无码专区| 亚洲狠狠爱一区二区三区| 国产精品综合在线| 色哟哟入口国产精品| 欧美影视资讯| 茄子视频成人在线观看 | 三级视频中文字幕| 久久伊人中文字幕| 一级成人黄色片| 日韩福利在线播放| 国产精品论坛| 久久超碰亚洲| 亚洲理伦在线| 亚洲黄色免费在线观看| 亚洲777理论| 免费国产羞羞网站视频| 久久免费视频在线观看| 99国产精品久久一区二区三区| 国产欧美精品aaaaaa片| 国产91丝袜在线18| 久久久久久久久久久久久久久久久| 欧美一卡二卡三卡| 在线播放免费av| 成人av资源| 亚洲黄色成人| 黄色在线观看av| 色素色在线综合| 搞黄视频在线观看| 国产免费一区二区三区在线能观看| 日韩免费看片| 国产探花在线观看视频| 一区二区三区日韩欧美| 欧美一区二区三区激情| 7m第一福利500精品视频| 中文字幕av一区二区三区人| 亚洲色精品三区二区一区| 日本一区二区视频在线| 91在线观看喷潮| 欧美激情一级精品国产| 另类ts人妖一区二区三区| 成年网站在线免费观看| 国产欧美一区二区三区网站| 91中文字幕在线播放| 久久久久女教师免费一区| 亚洲第一论坛sis| 一道本在线免费视频| 亚洲精品自拍动漫在线| 日韩一级在线播放| 国产成人精品综合| 91精品高清| 熟女人妻在线视频| 欧美在线播放高清精品| 在线你懂的视频| 欧美大陆一区二区| 久久国产福利国产秒拍| 免费在线观看黄色av| 亚洲美女av在线播放| 亚洲高清影院| 国产成人永久免费视频| 久久综合一区二区| 国产人妖在线播放| 欧美亚洲一级片| 午夜片欧美伦| 欧美无人区码suv| 3atv一区二区三区| 深夜av在线| 法国空姐在线观看免费| 91在线观看视频| 国产精品久久免费| 日产精品久久久一区二区福利| 欧美三级小说| 女人十八毛片嫩草av| 亚洲国产成人一区| 国产人与zoxxxx另类91| 成人在线观看a|