亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

國(guó)內(nèi)外個(gè)人免費(fèi)云服務(wù)器推薦 liunx服務(wù)器搭建與管理


國(guó)內(nèi)外個(gè)人免費(fèi)云服務(wù)器推薦 liunx服務(wù)器搭建與管理

文章插圖
這篇文章,我們循序漸進(jìn),從內(nèi)存、磁盤I/O、網(wǎng)絡(luò)I/O、CPU、緩存、架構(gòu)、算法等多層次遞進(jìn),串聯(lián)起高性能開發(fā)十大必須掌握的核心技術(shù) 。
– I/O優(yōu)化:零拷貝技術(shù)– I/O優(yōu)化:多路復(fù)用技術(shù)– 線程池技術(shù)– 無鎖編程技術(shù)– 進(jìn)程間通信技術(shù)– RPC && 序列化技術(shù)– 數(shù)據(jù)庫索引技術(shù)– 緩存技術(shù) && 布隆過濾器– 全文搜索技術(shù)– 負(fù)載均衡技術(shù)準(zhǔn)備好了嗎,坐穩(wěn)了,發(fā)車!
首先,我們從最簡(jiǎn)單的模型開始 。
老板告訴你,開發(fā)一個(gè)靜態(tài)web服務(wù)器,把磁盤文件(網(wǎng)頁、圖片)通過網(wǎng)絡(luò)發(fā)出去,怎么做?
你花了兩天時(shí)間,擼了一個(gè)1.0版本:
主線程進(jìn)入一個(gè)循環(huán),等待連接來一個(gè)連接就啟動(dòng)一個(gè)工作線程來處理工作線程中,等待對(duì)方請(qǐng)求,然后從磁盤讀文件、往套接口發(fā)送數(shù)據(jù),完事兒上線一天,老板發(fā)現(xiàn)太慢了,大一點(diǎn)的圖片加載都有卡頓感 。讓你優(yōu)化,這個(gè)時(shí)候,你需要:
I/O優(yōu)化:零拷貝技術(shù)上面的工作線程,從磁盤讀文件、再通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù),數(shù)據(jù)從磁盤到網(wǎng)絡(luò),兜兜轉(zhuǎn)轉(zhuǎn)需要拷貝四次,其中CPU親自搬運(yùn)都需要兩次 。
零拷貝技術(shù),解放CPU,文件數(shù)據(jù)直接從內(nèi)核發(fā)送出去,無需再拷貝到應(yīng)用程序緩沖區(qū),白白浪費(fèi)資源 。
Linux API:
ssize_t sendfile(int out_fd,int in_fd,off_t *offset,size_t count);函數(shù)名字已經(jīng)把函數(shù)的功能解釋的很明顯了:發(fā)送文件 。指定要發(fā)送的文件描述符和網(wǎng)絡(luò)套接字描述符,一個(gè)函數(shù)搞定!
用上了零拷貝技術(shù)后開發(fā)了2.0版本,圖片加載速度明顯有了提升 。不過老板發(fā)現(xiàn)同時(shí)訪問的人變多了以后,又變慢了,又讓你繼續(xù)優(yōu)化 。這個(gè)時(shí)候,你需要:
I/O優(yōu)化:多路復(fù)用技術(shù)前面的版本中,每個(gè)線程都要阻塞在recv等待對(duì)方的請(qǐng)求,這來訪問的人多了,線程開的就多了,大量線程都在阻塞,系統(tǒng)運(yùn)轉(zhuǎn)速度也隨之下降 。
這個(gè)時(shí)候,你需要多路復(fù)用技術(shù),使用select模型,將所有等待(accept、recv)都放在主線程里,工作線程不需要再等待 。
過了一段時(shí)間之后,網(wǎng)站訪問的人越來越多了,就連select也開始有點(diǎn)應(yīng)接不暇,老板繼續(xù)讓你優(yōu)化性能 。
這個(gè)時(shí)候,你需要升級(jí)多路復(fù)用模型為epoll 。
select有三弊,epoll有三優(yōu) 。
select底層采用數(shù)組來管理套接字描述符,同時(shí)管理的數(shù)量有上限,一般不超過幾千個(gè),epoll使用樹和鏈表來管理,同時(shí)管理數(shù)量可以很大 。select不會(huì)告訴你到底哪個(gè)套接字來了消息,你需要一個(gè)個(gè)去詢問 。epoll直接告訴你誰來了消息,不用輪詢 。select進(jìn)行系統(tǒng)調(diào)用時(shí)還需要把套接字列表在用戶空間和內(nèi)核空間來回拷貝,循環(huán)中調(diào)用select時(shí)簡(jiǎn)直浪費(fèi) 。epoll統(tǒng)一在內(nèi)核管理套接字描述符,無需來回拷貝 。用上了epoll多路復(fù)用技術(shù),開發(fā)了3.0版本,你的網(wǎng)站能同時(shí)處理很多用戶請(qǐng)求了 。
但是貪心的老板還不滿足,不舍得升級(jí)硬件服務(wù)器,卻讓你進(jìn)一步提高服務(wù)器的吞吐量 。你研究后發(fā)現(xiàn),之前的方案中,工作線程總是用到才創(chuàng)建,用完就關(guān)閉,大量請(qǐng)求來的時(shí)候,線程不斷創(chuàng)建、關(guān)閉、創(chuàng)建、關(guān)閉,開銷挺大的 。這個(gè)時(shí)候,你需要:
線程池技術(shù)我們可以在程序一開始啟動(dòng)后就批量啟動(dòng)一波工作線程,而不是在有請(qǐng)求來的時(shí)候才去創(chuàng)建,使用一個(gè)公共的任務(wù)隊(duì)列,請(qǐng)求來臨時(shí),向隊(duì)列中投遞任務(wù),各個(gè)工作線程統(tǒng)一從隊(duì)列中不斷取出任務(wù)來處理,這就是線程池技術(shù) 。
多線程技術(shù)的使用一定程度提升了服務(wù)器的并發(fā)能力,但同時(shí),多個(gè)線程之間為了數(shù)據(jù)同步,常常需要使用互斥體、信號(hào)、條件變量等手段來同步多個(gè)線程 。這些重量級(jí)的同步手段往往會(huì)導(dǎo)致線程在用戶態(tài)/內(nèi)核態(tài)多次切換,系統(tǒng)調(diào)用,線程切換都是不小的開銷 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: