高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕_第1頁
高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕_第2頁
高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕_第3頁
高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕_第4頁
高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕ideawu百度服務(wù)器研發(fā)高級工程師./高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第1頁!內(nèi)容簡介NotApache/Lighttpd/Nginxsourcecode理論,基礎(chǔ),通用代碼(核心內(nèi)幕)如何進(jìn)化高性能Web服務(wù)器實現(xiàn)核心內(nèi)幕高性能網(wǎng)絡(luò)服務(wù)器的實現(xiàn)原理Web服務(wù)器的實現(xiàn)socket基礎(chǔ),先學(xué)會走再學(xué)會飛高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第2頁!理論結(jié)合實踐,實踐結(jié)合理論“理論要結(jié)合實踐”,是對理論的貶低嗎?Linus不喜歡低級的試錯別告訴我哪個對(錯),告訴我那一個為什么對(錯)理論和實踐理論不結(jié)合實踐-書呆子實踐不結(jié)合理論-業(yè)余者理論結(jié)合實踐-科學(xué)家實踐結(jié)合理論-專業(yè)者三樓能進(jìn)行理論創(chuàng)新的人二樓掌握了理論的人一樓閱讀了XX源碼的人普通碼農(nóng)高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第3頁!最原始的網(wǎng)絡(luò)服務(wù)器網(wǎng)絡(luò)IO的基礎(chǔ)ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);特點:阻塞serv=tcp_socket();listen(serv);sock=accept(serv);read(sock,data);write(sock,data);close(sock)一次性服務(wù)無協(xié)議短連接如何重復(fù)服務(wù)?高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第4頁!帶有協(xié)議的網(wǎng)絡(luò)服務(wù)器如何讀取報文?盡可能多地讀取(read)數(shù)據(jù)到用戶緩沖區(qū)中,即使是固定長度報文,也不要讀取指定長度.判斷用戶緩沖區(qū)中的數(shù)據(jù)是否包含至少一個報文serv=tcp_socket();listen(serv);sock=accept(serv);packet_read(sock,packet);packet_write(sock,packet);close(sock)Packet是協(xié)議的報文

能不能使用TCP報文的格式?UDP?IP?ICMP?高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第5頁!可以處理多個連接的網(wǎng)絡(luò)服務(wù)器在外層加一個循環(huán)while(1){ sock=accept(serv); while(1){ packet_read(sock,request); if(request==EXIT){ break; } response=handle_packet(request); packet_write(sock,response); //close(sock);//短連接 } close(sock);//長連接}缺點:必須等一個連接關(guān)閉或者退出后,才能處理下一個連接,不是并發(fā)服務(wù)器.高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第6頁!阻塞while(1){ //可能阻塞 sock=accept(serv); while(1){ //可能阻塞 packet_read(sock,request); if(request==EXIT){ break; } //可能阻塞 response=handle_packet(request); //可能阻塞 packet_write(sock,response); } close(sock);}至少要有一個阻塞,所以可以在accept()之后進(jìn)行“解阻塞”.奇跡=>...高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第7頁!原始多線程并發(fā)網(wǎng)絡(luò)服務(wù)器(續(xù))缺點:線程的數(shù)量無法得到控制.如果是短連接,創(chuàng)建線程的成本可能相對請求處理的成本更大要解決的問題:如何控制線程的數(shù)量?如何避免創(chuàng)建線程對性能的影響高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第8頁!IO多路復(fù)用(IOMultiplex)前面的架構(gòu)瓶頸在哪?把IO委托給操作系統(tǒng)內(nèi)核操作系統(tǒng)告知是否可讀或者可寫輪詢等通知(select,epoll,kqueue)可讀/寫表示只能最多成功調(diào)用一次read/write而不阻塞IO多路復(fù)用只能解決IO阻塞,阻塞的類型還有很多種!高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第9頁!委托給網(wǎng)絡(luò)服務(wù)回顧避免阻塞(解阻塞)的方法:使用非阻塞的接口來替代IO多路復(fù)用找出阻塞的地方,委托出去.委托給操作系統(tǒng)內(nèi)核sendfile()委托給多線程/多進(jìn)程(后面不討論多進(jìn)程)委托給網(wǎng)絡(luò)服務(wù)如Apache/Lighttpd/Niginx把請求通過fastcgi(網(wǎng)絡(luò))委托給php-cgi進(jìn)程(網(wǎng)絡(luò)服務(wù)器).委托給網(wǎng)絡(luò)服務(wù),這是一個遞歸過程高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第10頁!Web服務(wù)器的一般架構(gòu)Web服務(wù)器將客戶端的請求委托給PHPFastCGI進(jìn)程(是一個獨立的網(wǎng)絡(luò)服務(wù))處理Web服務(wù)器從FastCGI進(jìn)程讀取數(shù)據(jù)后,返回給瀏覽器如果不是獨立的FastCGI服務(wù),也可以是嵌入到Web服務(wù)器內(nèi)的線程/進(jìn)程(如Apachemod_php).高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第11頁!靜態(tài)文件請求的處理文件IO會阻塞委托給線程避免文件IO-內(nèi)存緩存委托給操作系統(tǒng)–sendfile()高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第12頁!FastCGI委托給網(wǎng)絡(luò)高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第13頁!FAQIT牛人.udpwork./高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第14頁!網(wǎng)絡(luò)協(xié)議協(xié)議包含兩個部分語法(報文格式)語義(指令的處理,交互時序等)最重要的TCP協(xié)議是流式協(xié)議,但幾乎所有的應(yīng)用協(xié)議都是基于報文的協(xié)議TCP的”粘包”和”分包”報文分隔用連接關(guān)閉來表示報文結(jié)束.如,HTTP/1.0的響應(yīng)固定長度的報文.如,TFTP的數(shù)據(jù)報文.帶自描述長度的固定長度首部的變長報文.如IP包,TCP分段,nshead(是協(xié)議嗎?).帶結(jié)束符.如,行協(xié)議,HTTP協(xié)議.逐字節(jié)解析和數(shù)據(jù)轉(zhuǎn)義的影響.高層文本,帶結(jié)束符底層二進(jìn)制,固定長度高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第15頁!單個連接的連續(xù)服務(wù)(長連接)在一個循環(huán)里不斷得讀取請求,處理,然后發(fā)送響應(yīng).serv=tcp_socket();listen(serv);sock=accept(serv);while(1){ packet_read(sock,request); if(request==EXIT){ break; } response=handle_packet(request); packet_write(sock,response);}close(sock)高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第16頁!并發(fā)網(wǎng)絡(luò)服務(wù)器并發(fā)服務(wù)器是指,同時處理多個請求的服務(wù)器.并發(fā)的原理:多核(多線程,多進(jìn)程)分片(請求處理的切分)并發(fā)的基本實現(xiàn)–避免阻塞(解阻塞)!使用非阻塞的接口來替代IO多路復(fù)用找出阻塞的地方,委托出去.委托給操作系統(tǒng)內(nèi)核sendfile()委托給多線程/多進(jìn)程(后面不討論多進(jìn)程)委托給網(wǎng)絡(luò)服務(wù)委托有時候也叫做"異步".高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第17頁!原始多線程并發(fā)網(wǎng)絡(luò)服務(wù)器while(1){ //可能阻塞 sock=accept(serv); RUN_IN_NEW_THREAD{ while(1){ //可能阻塞 packet_read(sock,packet); if(packet==EXIT){ break; } //可能阻塞 response=handle_packet(packet); //可能阻塞 packet_write(sock,response); } close(sock); }}"RUN_IN_NEW_THREAD"表示創(chuàng)建線程,這個線程叫做"工作線程".高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第18頁!線程池并發(fā)網(wǎng)絡(luò)服務(wù)器初始化時創(chuàng)建線程池主進(jìn)程中accept()之后,把socket傳給工作線程但又帶來了一個問題:雖然可以不斷地接受連接,但畢竟工作線程有限,還是會出現(xiàn)連接排隊等線程的情況.當(dāng)連接數(shù)少時是線程等連接,但當(dāng)連接數(shù)多時是連接等線程.怎么解決?調(diào)優(yōu)工作線程的數(shù)量.硬件問題,不是軟件所能解決的,增加機(jī)器.改變服務(wù)器架構(gòu),tobecontinued...高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第19頁!IO多路復(fù)用函數(shù)介紹前面的架構(gòu)瓶頸在哪?基本IO多路復(fù)用函數(shù):intselect(intn,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);簡化:(rfds_out,wfds_out)=select(rfds_in,wfds_in,timeout);功能:判斷rfds_in和wfds_in兩個列表中的socket連接,只要有至少一個可讀或者可寫,就返回.或者超時返回.rfds_in:要測試的是否可讀的socket列表wfds_in:要測試的是否可寫的socket列表rfds_out:返回可讀的socket列表wfds_out:返回可寫的socket列表timeout:超時時間,-1表示不永超時高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第20頁!HTTP服務(wù)器(Web服務(wù)器)報文解析:實現(xiàn)packet_read()用抓包工具抓一個HTTP請求報文和一個HTTP響應(yīng)報文對照著RFC上面兩步就是理論結(jié)合實踐,實踐結(jié)合理論語義實現(xiàn):實現(xiàn)handle_packet()靜態(tài)文件大文件小文件腳本處理,以php為例CGIFastCGIApachemod_php相對來說,報文的發(fā)送比較通用.高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第21頁!報文解析./person/pyhttp/使用Python的基本socket接口和字符串處理能力,實現(xiàn)了基本的HTTP協(xié)議報文的解析和協(xié)議實現(xiàn).為IO復(fù)用預(yù)留了接口高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第22頁!CGI多進(jìn)程用環(huán)境變量來傳遞請求的HTTP報頭信息和服務(wù)器信息用stdin傳遞請求的HTTP報體用stdout發(fā)送響應(yīng)報頭(部分)和報體缺點:由于使用環(huán)境變量來通信,擴(kuò)展性受限一個進(jìn)程的生命周期只處理一個請求高性能并發(fā)Web服務(wù)器實現(xiàn)核心內(nèi)幕共25頁,您現(xiàn)在瀏覽的是第23頁!補(bǔ)充話題IO多路復(fù)用模型中,為什么不能用標(biāo)準(zhǔn)IO庫的行讀取函數(shù)fgets()來讀取HTTP的首部.因為fgets()調(diào)用可能多于一次read(),是可阻塞的文本協(xié)議和二進(jìn)制協(xié)議如何取舍報文的格式只是協(xié)議的其中一項內(nèi)容,語義

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論