99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據庫為什么有可能喜歡Linux AIO(異步I/O)?

BN7C_zengshouji ? 來源:未知 ? 作者:李倩 ? 2018-09-11 10:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

回憶一下

我們都知道Linux的IO模型有阻塞、非阻塞、SIGIO、多路復用(select,epoll)、AIO(異步I/O)等。

數據庫可能比較傾向于使用AIO。從時序上面來講,AIO是用戶應用發(fā)起IO請求io_submit()后,它就不需要去等待,讓后臺給它搞定讀寫。之后本線程或者其他線程就可以通過io_getevents()去同步I/O的結果。

這樣的AIO有一個極大的好處在于,IO不會阻塞住CPU的行為,有利于充分利用硬件的資源,有利于讓CPU、IO都parallel起來 。當然,同樣的動作,似乎用epoll()、SIGIO也可以呈現出來。尤其是epoll(),幾乎是C10K問題解決方案在Linux的代名詞。epoll_wait()先等待IO請求的read、write可以發(fā)生,而后再根據返回的事件發(fā)起讀寫請求:

事件驅動模型libevent等,看起來是事件到來,callback被執(zhí)行的Reactor模式:

但是其底層其實也是靠epoll()來實現,這個我們透過strace就可以看出。請見我的3分鐘小電影:

大不一樣

epoll()本質上其實還是先等待IO的讀寫可以發(fā)生,而后再以Linux常規(guī)read()、write() API去發(fā)起IO請求。而AIO則是不管三七二十一,直接發(fā)IO請求,但是并不等待這個請求的結束,讓Linux后臺自己去完成讀寫。我們來看一個典型的AIO編程案例:

它是通過io_submit()把IO請求發(fā)出去之后,它并不需要等IO的結束。后面用io_getevents()去同步。上面的代碼中,io_getevents()的代碼與io_submit()的代碼擺在一起,但是其實它們并不需要一定是同一個線程。

AIO和傳統epoll()的本質區(qū)別是,epoll()等方式,它只是一個事件獲取機制,獲取事件后,之后的read(), write()還是要走Linux的傳統路線,經過Linux內核本身的各個層次(如page cache,IO調度等)。而AIO是骨子里面,自己就是一個IO的方式,最終沒有經過傳統的Linux read(),write()這種"all is file"的類VFS接口。Linux native的AIO本身call的函數,本身就是系統調用。strace執(zhí)行AIO動作的進程得到的直接就是類似如下的結果:

strace ./aio....

...

io_setup(128, {3077799936}) = 0

io_submit(3077799936, 1, 0xbfa5e730) = 1

io_getevents(-1217167360, 1, 1, {...}NULL) = 1

ARM Linux的系統調用表里也可以看出:

故而,AIO可以更多地把機會交給用戶空間,讓用戶空間根據自身的IO特點來為自己量身定制IO的行為。AIO一般也直接結合DIO(direct IO)來使用,進一步繞開內核本身的IO調度和cache機制。

我中意你

那么AIO有什么可能的優(yōu)勢被數據庫所青睞呢?

1. 透過AIO,可以屏蔽掉Linux內核底層的page cache。而制定application-level的cache機制。

我們都知道,Linux會針對每個文件對應的inode,創(chuàng)立一個address_space,并以Radix樹來組織它的page cache命中情況,page的替換算法,整體是LRU,預測頁面本身的活躍度。這個策略,固然非常符合局部性原理(Locality),但是不能針對用戶程序本身的特征,進行用戶級的cache。

2.透過AIO(尤其是結合DIO),可以一定程度上,進行用戶級別的IO scheduling。采用AIO,用戶可以控制發(fā)送給內核的IO請求,從而控制誰比誰更重要。內核固然有它的IO調度算法,但是它是比較general的。

3. 透過AIO,可以進行用戶級別的read-ahead和write-behind控制。

我們都知道,Linux內核本身會根據用戶的讀請求,去預測后續(xù)的讀,從而在后續(xù)的讀還沒有發(fā)起的情況下,就提前預讀。詳見:《宋寶華: 文件讀寫(BIO)波瀾壯闊的一生》,但是這種預讀的page,并不一定是上層應用想要的page。而內核的write-behind機制,也可能導致內核累積到很多dirty數據后,出現寫磁盤的突發(fā)性洪泛。現在AIO機制,我們把這些都交給用戶。

4. 透過AIO,不阻塞地在前臺線程,直接dispatch IO請求,帶來很好的

scalability。在InnoDB里面,可以透過innodb_use_native_aio來配置使用同步的IO還是AIO,而且它有一番對比,值得細細地品讀。同步IO的時候,query threads是將IO請求放入queue,由InnoDB后臺線程的每個線程處理一個IO請求。而AIO的時候,query threads直接發(fā)IO請求。

With synchronous I/O, query threads queue I/O requests, andInnoDBbackground threads retrieve the queued requests one at a time, issuing a synchronous I/O call for each. When an I/O request is completed and the I/O call returns, the InnoDBbackground thread that is handling the request calls an I/O completion routine and returns to process the next request. The number of requests that can be processed in parallel isn, wherenis the number ofInnoDBbackground threads. The number ofInnoDBbackground threads is controlled byinnodb_read_io_threadsand innodb_write_io_threads.

With native AIO, query threads dispatch I/O requests directly to the operating system, thereby removing the limit imposed by the number of background threads.InnoDBbackground threads wait for I/O events to signal completed requests. When a request is completed, a background thread calls an I/O completion routine and resumes waiting for I/O events.

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11079

    瀏覽量

    217036
  • Linux
    +關注

    關注

    87

    文章

    11511

    瀏覽量

    213758
  • 數據庫
    +關注

    關注

    7

    文章

    3926

    瀏覽量

    66208

原文標題:今年是“異型屏”轉換年!華映看好手機市場Q4復蘇

文章出處:【微信號:zengshouji,微信公眾號:MCA手機聯盟】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux設備驅動中的異步通知與異步I/O

    (struct fasync_struct **fa, int sig, int band);Linux 2.6 異步I/OAIO概念與GNU C庫函數AIO基本思想是允許進程發(fā)起很多
    發(fā)表于 02-21 10:52

    Android如何使用Db4o數據庫

    db4o是一個被廣泛歡迎的面向對象數據庫,起初它基于Java平臺,而后發(fā)布了.Net平臺的版本,db4o具有雙授權(GPLv2和商業(yè)授 權),所以在很多開源項目中都可以看到db4o的身
    發(fā)表于 05-24 07:32

    Linux上安裝Oracle 11g數據庫

    Linux上安裝Oracle 11g數據庫
    發(fā)表于 09-07 09:14 ?3次下載
    <b class='flag-5'>Linux</b>上安裝Oracle 11g<b class='flag-5'>數據庫</b>

    Java I/O 的相關方法分析

    (select and poll),signal driven I/O (SIGIO),asynchronous I/O (the POSIX a
    發(fā)表于 09-27 13:18 ?0次下載
    Java <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的相關方法分析

    Linux教程之linux下如何備份還原mysql數據庫

    本文介紹了linux下如何備份與恢復mysql數據庫。數據庫備份是非常重要的。如果定期做好備份,這樣就可以在發(fā)生系統崩潰時恢復數據到最后一次正常的狀態(tài),把損失減小到最少。
    發(fā)表于 10-19 17:18 ?4次下載

    數據庫學習教程之數據庫的發(fā)展狀況如何數據庫什么新發(fā)展

    本文檔的主要內容詳細介紹的是數據庫學習教程之數據庫的發(fā)展狀況如何數據庫什么新發(fā)展主要內容包括了:1 數據庫技術發(fā)展概述2
    發(fā)表于 10-25 16:29 ?5次下載
    <b class='flag-5'>數據庫</b>學習教程之<b class='flag-5'>數據庫</b>的發(fā)展狀況如何<b class='flag-5'>數據庫</b><b class='flag-5'>有</b>什么新發(fā)展

    數據庫哪些常見的應用結構數據庫應用結構的使用資料概述

    本文檔的主要內容詳細介紹的是數據庫哪些常見的應用結構數據庫應用結構的使用資料概述 數據庫常見的應用結構:1.集中式結構2.文件服務器結構
    發(fā)表于 10-31 16:57 ?11次下載
    <b class='flag-5'>數據庫</b><b class='flag-5'>有</b>哪些常見的應用結構<b class='flag-5'>數據庫</b>應用結構的使用資料概述

    嵌入式Linux 異步IO機制

    : 用戶進程可以對I/O事件進行阻塞,但是I/O操作并不阻塞。通過select/poll/epoll等函數調用來達到此目的。4. 異步時間非
    發(fā)表于 04-02 14:31 ?462次閱讀

    數據庫和自建數據庫的區(qū)別及應用

    數據庫是指優(yōu)化和部署在云端的數據庫,阿里云和騰訊云都提供云數據庫,云數據庫和自己搭建的數據庫
    的頭像 發(fā)表于 11-20 16:26 ?4965次閱讀
    云<b class='flag-5'>數據庫</b>和自建<b class='flag-5'>數據庫</b>的區(qū)別及應用

    Linux中如何使用信號驅動式I/O

    一、Linux 的 5 種 IO 模型 二、如何使用信號驅動式 I/O? 三、內核何時會發(fā)送 “IO 就緒” 信號? 四、最簡單的示例 五、擴展知識 一、Linux 的 5 種 IO
    的頭像 發(fā)表于 03-12 14:47 ?2700次閱讀
    <b class='flag-5'>Linux</b>中如何使用信號驅動式<b class='flag-5'>I</b>/<b class='flag-5'>O</b>?

    數據庫知識

    數據時代的數據庫 --數據采集、數據清洗和分析、數據可視化:提供決策依據 openGauss是一款高性能、高安全、高可靠的企業(yè)級開源關
    發(fā)表于 06-09 16:10 ?0次下載

    連接到您最喜歡數據庫

    DbVisualizer連接到所有流行的數據庫,并支持特定于數據庫的對象類型等。
    的頭像 發(fā)表于 08-11 16:45 ?923次閱讀

    輕量級數據庫哪些

    輕量級數據庫哪些 隨著互聯網和物聯網等新一代信息技術的廣泛應用,數據庫系統也變得越來越重要。人們對于數據庫數據庫的可靠性、安全性和性能等要
    的頭像 發(fā)表于 08-28 16:41 ?6625次閱讀

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫。
    的頭像 發(fā)表于 09-20 11:46 ?701次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例

    數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫

    一個運行在存儲上的SQLServer數據庫,1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,
    的頭像 發(fā)表于 10-31 13:21 ?696次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>