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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

BN7C_zengshouji ? 來源:未知 ? 作者:李倩 ? 2018-09-11 10:42 ? 次閱讀

回憶一下

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

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

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

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

但是其底層其實(shí)也是靠epoll()來實(shí)現(xiàn),這個(gè)我們透過strace就可以看出。請(qǐng)見我的3分鐘小電影:

大不一樣

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

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

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

strace ./aio....

...

io_setup(128, {3077799936}) = 0

io_submit(3077799936, 1, 0xbfa5e730) = 1

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

ARM Linux的系統(tǒng)調(diào)用表里也可以看出:

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

我中意你

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

1. 透過AIO,可以屏蔽掉Linux內(nèi)核底層的page cache。而制定application-level的cache機(jī)制。

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

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

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

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

4. 透過AIO,不阻塞地在前臺(tái)線程,直接dispatch IO請(qǐng)求,帶來很好的

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

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.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10876

    瀏覽量

    212124
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11314

    瀏覽量

    209807
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3821

    瀏覽量

    64506

原文標(biāo)題:今年是“異型屏”轉(zhuǎn)換年!華映看好手機(jī)市場(chǎng)Q4復(fù)蘇

文章出處:【微信號(hào):zengshouji,微信公眾號(hào):MCA手機(jī)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步I/O

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

    Android如何使用Db4o數(shù)據(jù)庫

    db4o是一個(gè)被廣泛歡迎的面向?qū)ο?b class='flag-5'>數(shù)據(jù)庫,起初它基于Java平臺(tái),而后發(fā)布了.Net平臺(tái)的版本,db4o具有雙授權(quán)(GPLv2和商業(yè)授 權(quán)),所以在很多開源項(xiàng)目中都可以看到db4o的身
    發(fā)表于 05-24 07:32

    Linux上安裝Oracle 11g數(shù)據(jù)庫

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

    Java I/O 的相關(guān)方法分析

    (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> 的相關(guān)方法分析

    Linux教程之linux下如何備份還原mysql數(shù)據(jù)庫

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

    數(shù)據(jù)庫學(xué)習(xí)教程之數(shù)據(jù)庫的發(fā)展?fàn)顩r如何數(shù)據(jù)庫什么新發(fā)展

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫學(xué)習(xí)教程之數(shù)據(jù)庫的發(fā)展?fàn)顩r如何數(shù)據(jù)庫什么新發(fā)展主要內(nèi)容包括了:1 數(shù)據(jù)庫技術(shù)發(fā)展概述2
    發(fā)表于 10-25 16:29 ?5次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>學(xué)習(xí)教程之<b class='flag-5'>數(shù)據(jù)庫</b>的發(fā)展?fàn)顩r如何<b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>有</b>什么新發(fā)展

    數(shù)據(jù)庫哪些常見的應(yīng)用結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用結(jié)構(gòu)的使用資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫哪些常見的應(yīng)用結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用結(jié)構(gòu)的使用資料概述 數(shù)據(jù)庫常見的應(yīng)用結(jié)構(gòu):1.集中式結(jié)構(gòu)2.文件服務(wù)器結(jié)構(gòu)
    發(fā)表于 10-31 16:57 ?11次下載
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>有</b>哪些常見的應(yīng)用結(jié)構(gòu)<b class='flag-5'>數(shù)據(jù)庫</b>應(yīng)用結(jié)構(gòu)的使用資料概述

    嵌入式Linux 異步IO機(jī)制

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

    數(shù)據(jù)庫和自建數(shù)據(jù)庫的區(qū)別及應(yīng)用

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

    Linux中如何使用信號(hào)驅(qū)動(dòng)式I/O

    一、Linux 的 5 種 IO 模型 二、如何使用信號(hào)驅(qū)動(dòng)式 I/O? 三、內(nèi)核何時(shí)會(huì)發(fā)送 “IO 就緒” 信號(hào)? 四、最簡(jiǎn)單的示例 五、擴(kuò)展知識(shí) 一、Linux 的 5 種 IO
    的頭像 發(fā)表于 03-12 14:47 ?2439次閱讀
    <b class='flag-5'>Linux</b>中如何使用信號(hào)驅(qū)動(dòng)式<b class='flag-5'>I</b>/<b class='flag-5'>O</b>?

    數(shù)據(jù)庫知識(shí)

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

    連接到您最喜歡數(shù)據(jù)庫

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

    輕量級(jí)數(shù)據(jù)庫哪些

    輕量級(jí)數(shù)據(jù)庫哪些 隨著互聯(lián)網(wǎng)和物聯(lián)網(wǎng)等新一代信息技術(shù)的廣泛應(yīng)用,數(shù)據(jù)庫系統(tǒng)也變得越來越重要。人們對(duì)于數(shù)據(jù)庫數(shù)據(jù)庫的可靠性、安全性和性能等要
    的頭像 發(fā)表于 08-28 16:41 ?5980次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫出現(xiàn)823錯(cuò)誤的數(shù)據(jù)恢復(fù)案例

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

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—通過拼接數(shù)據(jù)庫碎片恢復(fù)SQLserver數(shù)據(jù)庫

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