成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Io_uring,干翻 Nio!

系統(tǒng) Linux
現(xiàn)在,io_uring已經(jīng)能夠挑戰(zhàn)NIO的,功能非常強大。io_uring在2019加入了Linux內(nèi)核,目前5.1+的內(nèi)核,可以采用這個功能。

大家都知道BIO非常的低效,而網(wǎng)絡(luò)編程中的IO多路復用普遍比較高效。

現(xiàn)在,io_uring已經(jīng)能夠挑戰(zhàn)NIO的,功能非常強大。io_uring在2019加入了Linux內(nèi)核,目前5.1+的內(nèi)核,可以采用這個功能。

隨著一步步的優(yōu)化,系統(tǒng)調(diào)用這個大家伙,調(diào)用次數(shù)越來越少了。

一、性能耗費在哪里?

在Linux的性能指標里,有us和sy?兩個指標,使用top命令可以很方便的看到。

圖片

us?是用戶進程的意思,而sy是在內(nèi)核中所使用的cpu占比。如果進程在內(nèi)核態(tài)和用戶態(tài)切換的非常頻繁,那么效率大部分就會浪費在切換之上。

一次內(nèi)核態(tài)和用戶態(tài)切換的時間,普遍在微秒級別以上,可以說非常昂貴了。

cpu的性能是固定的,在無用的東西上浪費越小,在真正業(yè)務(wù)上的處理就效率越高。影響效率的有兩個方面。

  1. 進程或者線程的數(shù)量,引起過多的上下文切換。進程是由內(nèi)核來管理和調(diào)度的,進程的切換只能發(fā)生在內(nèi)核態(tài)。所以,如果你的代碼切換了線程,它必然伴隨著一次用戶態(tài)和內(nèi)核態(tài)的切換。
  2. IO的編程模型,引起過多的系統(tǒng)態(tài)和內(nèi)核態(tài)切換。比如同步阻塞等待的模型,需要經(jīng)過數(shù)據(jù)接收、軟中斷的處理(內(nèi)核態(tài)),然后喚醒用戶線程(用戶態(tài)),處理完畢之后再進入等待狀態(tài)(內(nèi)核態(tài))。

關(guān)于mmap,可以參考這篇文章。

《OS近距離:mmap給你想要的快!》

二、BIO

可以說,BIO這種模式,在線程數(shù)量上爆炸,編程模型古老,把性能低的原因全給占了。

通常情況下,BIO一條連接就對應(yīng)著一個線程。BIO的讀寫操作是阻塞的,線程的整個生命周期和連接的生命周期是一樣的,而且不能夠被復用。

如果連接有1000條,那就需要1000個線程。線程資源是非常昂貴的,除了占用大量的內(nèi)存,還會占用非常多的CPU調(diào)度時間,所以BIO在連接非常多的情況下,效率會變得非常低。

BIO的編程模型,也存在諸多缺陷。因為它是阻塞性編程模式,在有數(shù)據(jù)的時候,需要內(nèi)核通知它;在沒有數(shù)據(jù)的時候,需要阻塞wait在相應(yīng)的socket上。這兩個操作,都涉及到內(nèi)核態(tài)和用戶態(tài)的切換。如果數(shù)據(jù)報文非常頻繁,BIO就需要這么一直切換。

三、NIO

提到NIO,Java中使用的是Epoll,Netty使用的是改良后的Epoll,它們都是多路復用,只不過叫慣了,所以稱作NIO。

采用Reactor編程模型,可以采用非常少的線程,就能夠應(yīng)對海量的Socket連接。

一旦有新的事件到達,比如有新的連接到來,主線程就能夠被調(diào)度到,程序就能夠向下執(zhí)行。這時候,就能夠根據(jù)訂閱的事件通知,持續(xù)獲取訂閱的事件。

NIO是基于事件機制的,有一個叫做Selector的選擇器,阻塞獲取關(guān)注的事件列表。獲取到事件列表后,可以通過分發(fā)器,進行真正的數(shù)據(jù)操作。

圖片

熟悉Netty的同學可以看到,這個模型就是Netty設(shè)計的基礎(chǔ)。在Netty中,Boss線程對應(yīng)著對連接的處理和分派,相當于mainReactor;Work線程 對應(yīng)著subReactor,使用多線程負責讀寫事件的分發(fā)和處理。

通過Selector選擇器,NIO將BIO中頻繁的wait和notify操作,集中在了一起,大量的減少了內(nèi)核態(tài)和用戶態(tài)的切換。在網(wǎng)絡(luò)流量比較高的時候,Selector甚至都不會阻塞,它將一直處于處理數(shù)據(jù)的過程中。

這種模式將每個組件的職責分的更細,耦合度也更低,能有效的解決C10k問題。

四、io_uring

但是,NIO依然有大量的系統(tǒng)調(diào)用,那就是Epoll的epoll_ctl。另外,獲取到網(wǎng)絡(luò)事件之后,還需要把socket的數(shù)據(jù)進行存取,這也是一次系統(tǒng)調(diào)用。雖然相對于BIO來說,上下文切換次數(shù)已經(jīng)減少很多,但它仍然花費了比較多的時間在切換之上。

IO只負責對發(fā)生在fd描述符上的事件進行通知。事件的獲取和通知部分是非阻塞的,但收到通知之后的操作,卻是阻塞的。即使使用多線程去處理這些事件,它依然是阻塞的。

如果能把這些系統(tǒng)調(diào)用都放在操作系統(tǒng)里完成,那么就可以節(jié)省下這些系統(tǒng)調(diào)用的時間,io_uring就是干這個的。

圖片

如圖,用戶態(tài)和內(nèi)核態(tài)共享提交隊列(submission queue)和完成隊列(completion queue),這兩條隊列通過mmap共享,高效且安全。

(SQ)給內(nèi)核源源不斷的布置任務(wù),然后從另外一條隊列(CQ)獲取結(jié)果;內(nèi)核則按需進行 epoll(),并在一個線程池中執(zhí)行就緒的任務(wù)。

用戶態(tài)支持Polling模式,不會發(fā)生中斷,也就沒有系統(tǒng)調(diào)用,通過輪詢即可消費事件;內(nèi)核態(tài)也支持Polling模式,同樣不會發(fā)生上下文切換。

可以看出關(guān)鍵的設(shè)計在于,內(nèi)核通過一塊和用戶共享的內(nèi)存區(qū)域進行消息的傳遞,可以繞過Linux 的 syscall 機制。

rocksdb、ceph等應(yīng)用,已經(jīng)在嘗試這些功能,隨著內(nèi)核io_uring的成熟,相信網(wǎng)絡(luò)編程在效率上會更上一層樓。

作者簡介:小姐姐味道  (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。

責任編輯:武曉燕 來源: 小姐姐味道
相關(guān)推薦

2023-10-20 06:26:51

Libuvio_uring

2021-07-11 23:25:29

Libuvepoll文件

2023-04-12 18:36:20

IO框架內(nèi)核

2025-06-27 01:44:00

2021-07-07 23:38:05

內(nèi)核IOLinux

2023-12-28 11:24:29

IO系統(tǒng)請求

2021-07-03 08:04:10

io_uringNode.js異步IO

2020-09-30 06:44:39

存儲IO

2025-02-03 09:53:42

2021-09-05 17:46:21

云計算No.jsio_uringJS

2023-11-16 15:10:39

RustJavaZig

2020-06-04 17:13:12

JavaScript語言Web

2021-10-09 20:13:03

ArrayListLinkedList java

2011-12-13 12:32:54

JavaNIO

2020-07-30 13:22:19

語言Android大數(shù)據(jù)

2022-11-30 09:33:56

語言Java系統(tǒng)

2024-05-15 17:34:15

2024-02-07 12:39:00

AI數(shù)據(jù)

2020-03-27 11:14:18

IONIOJava

2025-01-08 09:30:00

Meta大模型訓練
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲免费精品 | 亚洲成人福利在线观看 | 亚洲精品久久久一区二区三区 | 久久久久久免费毛片精品 | 精品欧美二区 | 色婷婷狠狠| 中文字幕在线电影观看 | 日本一区二区三区在线观看 | 日本在线精品视频 | 亚洲天堂成人在线视频 | 狠狠亚洲 | 自拍视频在线观看 | 91 在线 | 91精品国产综合久久久动漫日韩 | 韩日免费视频 | 91精品国产综合久久久久久丝袜 | www.成人.com| 精品国产一区探花在线观看 | 日韩欧美中文在线 | 国产一区欧美 | 看羞羞视频 | 日日夜夜操天天干 | 看亚洲a级一级毛片 | 午夜资源 | 亚洲视频在线一区 | 中文字幕不卡在线观看 | 亚洲视频第一页 | 一级毛片黄片 | 久久久www成人免费精品 | 国产成人精品一区二 | 亚洲成年影院 | 国产精品99久久久久久久久久久久 | 在线免费黄色小视频 | 99综合| 欧美一区二区三区在线 | 精品三级在线观看 | 91久久国产综合久久91精品网站 | 成人免费看片又大又黄 | 亚洲高清在线观看 | 在线看av网址 | 国产成人精品一区二区在线 |