精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91porny九色| 好吊操视频这里只有精品| 男人天堂资源在线| 日本欧美加勒比视频| www.欧美三级电影.com| 中文字幕人妻熟女人妻a片| 精品三级久久| 国产亚洲欧美一区在线观看| 91欧美激情另类亚洲| 亚洲激情视频一区| 成人久久一区| 亚洲第一男人天堂| 男人添女人下面免费视频| 婷婷丁香在线| 中文字幕欧美国产| 成人看片视频| a片在线免费观看| 黄色精品网站| 少妇高潮 亚洲精品| 亚洲国产果冻传媒av在线观看| 国产91在线播放精品| 亚洲成年人网站在线观看| 性欧美大战久久久久久久免费观看| www久久久com| 蜜桃av一区二区在线观看| 欧美激情精品在线| 战狼4完整免费观看在线播放版| 老司机精品在线| 欧美肥妇毛茸茸| 免费av网址在线| av资源网在线播放| 亚洲男人天堂av网| 色噜噜色狠狠狠狠狠综合色一 | 91破解版在线观看| 最新国产成人在线观看| 日韩国产欧美精品| 天堂av电影在线观看| 高清成人在线观看| 91欧美日韩一区| 中文在线免费观看| 久久亚洲电影| 91国产精品视频在线| 欧美三根一起进三p| 色婷婷热久久| 最近2019免费中文字幕视频三| 男生裸体视频网站| 国产精品x8x8一区二区| 欧美成人bangbros| 老女人性生活视频| 精品一区视频| 日韩一区国产二区欧美三区| 欧美一级小视频| 欧美成人家庭影院| 欧美日韩精品福利| 视频在线观看免费高清| 欧美日韩尤物久久| 欧美性色黄大片| 国产视频在线视频| 国产电影一区二区三区爱妃记| 日韩欧美中文第一页| 国内外成人激情视频| 新版的欧美在线视频| 五月天一区二区三区| av免费观看国产| 美女网站在线看| 欧美日韩免费区域视频在线观看| 欧美一级片免费播放| 麻豆成全视频免费观看在线看| 欧美日韩国产色视频| 91黄色小网站| 日本一区二区三区视频在线| 欧美性感一区二区三区| 欧美性受xxxxxx黑人xyx性爽| a一区二区三区亚洲| 欧美一二三四区在线| 伊人av在线播放| 老牛影视av一区二区在线观看| 亚洲精品国产欧美| 国产精成人品免费观看| 天天综合网91| 国内精品视频一区二区三区八戒| 亚洲一区在线视频| 激情五月六月婷婷| 黄色污网站在线观看| 日本韩国欧美国产| 老司机久久精品| 中文字幕av一区二区三区四区| 亚洲成人久久网| 不卡一区二区在线观看| 国产精品99久久久久久动医院| 不卡av日日日| 国产成人在线免费观看视频| 日韩精品91亚洲二区在线观看| 成人性生交大片免费看小说| 殴美一级特黄aaaaaa| 久久久不卡网国产精品二区| 少妇熟女一区二区| 第一中文字幕在线| 黑人精品xxx一区| 中文字幕第88页| 亚洲一二三区视频| 一区二区三区www| 免费在线观看亚洲| 老牛国产精品一区的观看方式| 91免费在线视频| 精品无人乱码| 亚洲综合色网站| 免费在线观看的毛片| 深夜福利一区| 国产亚洲人成网站在线观看| 久久久久久久久久综合| 免费观看在线综合| 精品一区二区日本| 中文在线观看免费| 欧美在线视频全部完| 国产69视频在线观看| 日韩毛片视频| 国产成+人+综合+亚洲欧美丁香花| 国产露脸无套对白在线播放| 欧美经典一区二区| 欧美精品99久久| 在线播放一区二区精品视频| 深夜福利一区二区| 欧美成人精品网站| 久久综合九色综合欧美98| 日本精品久久久久久久久久| 伊人久久一区| 中文字幕av一区二区三区谷原希美| 国产成人在线免费观看视频| 成人精品亚洲人成在线| 中国黄色录像片| 亚洲电影有码| 亚洲色图欧美制服丝袜另类第一页| 日本熟妇毛耸耸xxxxxx| 国产精品综合一区二区| 中文字幕日韩一区二区三区不卡| www.久久.com| 在线看片第一页欧美| 欧美 日韩 精品| 成人午夜伦理影院| 日韩欧美亚洲v片| free性护士videos欧美| 欧美一级免费观看| 四虎国产成人精品免费一女五男| 日韩精品欧美精品| 精品无人乱码一区二区三区的优势| 亚洲图区一区| 337p亚洲精品色噜噜| аⅴ天堂中文在线网| 日本特黄久久久高潮| 久久久久久高清| 超免费在线视频| 日韩欧美激情一区| 成人免费视频国产免费观看| 国产在线视频精品一区| 亚洲精品一区二区三区蜜桃久| 新版的欧美在线视频| 亚洲精品久久久久久久久| 国产av 一区二区三区| 久久91精品国产91久久小草| 在线播放 亚洲| 男人天堂久久| 日韩专区中文字幕| 91精品国产乱码久久久久| 中文字幕第一页久久| 老头吃奶性行交视频| 91麻豆精品国产91久久久平台| 国产精品国产自产拍高清av水多| 你懂得在线网址| 色综合久久久久综合99| 亚洲蜜桃精久久久久久久久久久久| 免费永久网站黄欧美| 欧美日韩国产高清视频| 欧美粗大gay| 国产一区二区三区在线观看视频| 国产在线一级片| 国产亚洲精品超碰| 伊人国产精品视频| 欧美精品首页| 国产欧美日韩综合一区在线观看| 国产极品人妖在线观看| 日韩电影中文字幕一区| 在线观看 亚洲| 国产精品久久久99| 久久综合在线观看| 一区久久精品| 久久免费一区| 中文字幕资源网在线观看免费| 国产亚洲一区二区精品| 国产情侣激情自拍| 亚洲国产精品视频| 日韩欧美精品在线观看| 91激情视频在线| 成人精品亚洲| 91久色国产| 蜜桃视频动漫在线播放| 亚洲色图日韩av| 亚洲AV午夜精品| 精品欧美一区二区三区| 亚洲熟妇无码av| 精品午夜一区二区三区在线观看| 国产免费内射又粗又爽密桃视频| 羞羞色国产精品网站| 国产欧美日韩专区发布| 色帝国亚洲欧美在线| 亚洲开心激情网| 国产孕妇孕交大片孕| 午夜激情一区二区| youjizz亚洲女人| 国产盗摄视频一区二区三区| 啊啊啊一区二区| 日韩视频在线观看| 欧美激情视频一区二区三区| 高清在线一区| 羞羞色国产精品| 日本黄色片在线观看| 日韩欧美aaaaaa| 一区二区自拍偷拍| 精品久久久久久久久久久| www亚洲色图| k8久久久一区二区三区| 日韩av影视大全| 久热精品在线| 成年人视频网站免费| 欧美日韩精品一区二区视频| 鬼打鬼之黄金道士1992林正英| 日韩pacopacomama| 欧美激情小视频| av网站在线免费观看| 亚洲成人av在线播放| www.黄色国产| 欧美日韩一区 二区 三区 久久精品| 精品少妇theporn| 国产精品成人午夜| 中文字幕日韩三级片| 床上的激情91.| 精品综合久久久久| 日韩黄色免费网站| 欧美国产亚洲一区| 日韩亚洲在线| 国产成人亚洲综合无码| 日韩毛片视频| 午夜精品电影在线观看| 欧美猛男做受videos| 精品国产乱码久久久久久蜜柚| 欧美片网站免费| 国产日韩在线播放| 日本一区免费网站| 国产精品美女www| 国产不卡网站| 午夜精品一区二区三区在线视| 成人黄色网址| 久久精品亚洲精品| 日韩大片b站免费观看直播| 精品国产制服丝袜高跟| 国产特级黄色片| 欧美精品久久99久久在免费线| 国产又大又粗又长| 制服.丝袜.亚洲.另类.中文| 亚洲在线视频播放| 欧美色视频在线| 91九色蝌蚪91por成人| 欧美网站一区二区| 进去里视频在线观看| 国产一区二区自拍视频| 91久色porny| japanese在线观看| 91在线国产福利| 亚洲国产精品成人综合久久久| 成人国产精品免费观看动漫| 一级黄色片毛片| 91在线国内视频| 精品国产成人亚洲午夜福利| 久久尤物电影视频在线观看| av在线网站观看| av电影一区二区| 国产精品密蕾丝袜| 欧美激情在线看| 黄色录像一级片| 亚洲精品国产无套在线观| 成人免费看片98| 亚洲成年人网站在线观看| 中文字幕一区二区三区精品 | 奇米777第四色| 成人99免费视频| 国产福利短视频| 国产精品免费丝袜| 手机在线免费看片| 亚洲一区二区四区蜜桃| 日本一级黄色录像| 午夜精品久久久久久久99樱桃 | 久久av在线| 九热视频在线观看| 国产乱码精品一区二区三| 亚洲色偷偷色噜噜狠狠99网| 亚洲国产精品成人久久综合一区| 国产老头老太做爰视频| 亚洲综合在线观看视频| 91国产丝袜播放在线| 91久久久免费一区二区| www.好吊色| 亚洲天堂男人天堂| 蜜桃视频网站在线观看| 欧美激情啊啊啊| 国产亚洲精品精品国产亚洲综合| www.久久艹| 精品无人区麻豆乱码久久久| 四虎4hu永久免费入口| 亚洲福利国产| 中文字幕免费高清在线| 9色porny自拍视频一区二区| 日本美女bbw| 夜夜精品视频一区二区| 无码人妻熟妇av又粗又大| 日韩一区二区三区四区| 成人动漫在线免费观看| 欧美成人免费va影院高清| 极品美女一区| 国产成人精品一区二区三区福利 | 天堂久久精品忘忧草| 亚洲综合免费观看高清完整版在线 | 日本免费精品视频| 精品国产91九色蝌蚪| 婷婷视频在线| 日本亚洲精品在线观看| 盗摄系列偷拍视频精品tp| 2021狠狠干| 日本vs亚洲vs韩国一区三区二区| 中国老熟女重囗味hdxx| 中文字幕乱码久久午夜不卡| av一级在线观看| 亚洲第一视频在线观看| 精品视频在线一区二区| 国产精品狠色婷| 国产探花在线精品一区二区| 久久精品国产sm调教网站演员| 精品在线一区二区三区| 性欧美13一14内谢| 一本色道**综合亚洲精品蜜桃冫| 成 人片 黄 色 大 片| 久久偷看各类女兵18女厕嘘嘘| 日本一区二区三区中文字幕| 日本午夜精品电影| 国产亚洲精品久久久久婷婷瑜伽| 91porn在线| 亚洲成人福利片| 免费国产精品视频| 欧美日韩成人网| 国产亚洲高清一区| 婷婷视频在线播放| 韩国精品免费视频| 免费看的黄色网| 91精品国产综合久久精品| 日本中文字幕在线观看| 欧美中文字幕一区| 无码人妻精品一区二区蜜桃百度| 1024成人| 激情小说欧美色图| 一级中文字幕一区二区| 不卡视频免费在线观看| 久久99国产精品自在自在app| 激情不卡一区二区三区视频在线| 亚洲一区二区在线免费观看| 久久精品99久久久| 岛国毛片在线观看| 精品精品国产高清a毛片牛牛 | 欧美精品在线观看| 欧美9999| 欧美精品久久久久久久自慰| 99re热视频精品| 精产国品一区二区| 中文字幕九色91在线| 伊人久久一区| 黄色一级片黄色| 99在线精品观看| 中文字幕网址在线| 久久精品人人做人人爽| 年轻的保姆91精品| 国产成人a亚洲精v品无码| 久久久久99精品国产片| 日本三级一区二区三区| 亚洲午夜精品视频| 精品国产黄a∨片高清在线| 国产卡一卡二在线| 成人黄色av网站在线| 成人h动漫精品一区二区下载| 深夜福利日韩在线看| 日本一区二区三区播放| 免费在线激情视频| 国产精品久久久久久久第一福利 | 日韩国产欧美区| 竹内纱里奈兽皇系列在线观看| 亚洲国产日韩综合一区| 成人免费看视频| 亚洲第一网站在线观看| 久热精品视频在线免费观看| 性欧美lx╳lx╳| 国产人妻精品久久久久野外| 欧美午夜激情视频| 在线免费观看的av|