版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕ideawu百度服務(wù)器研發(fā)高級(jí)工程師./高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第1頁(yè)!內(nèi)容簡(jiǎn)介NotApache/Lighttpd/Nginxsourcecode理論,基礎(chǔ),通用代碼(核心內(nèi)幕)如何進(jìn)化高性能Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕高性能網(wǎng)絡(luò)服務(wù)器的實(shí)現(xiàn)原理Web服務(wù)器的實(shí)現(xiàn)socket基礎(chǔ),先學(xué)會(huì)走再學(xué)會(huì)飛高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第2頁(yè)!理論結(jié)合實(shí)踐,實(shí)踐結(jié)合理論“理論要結(jié)合實(shí)踐”,是對(duì)理論的貶低嗎?Linus不喜歡低級(jí)的試錯(cuò)別告訴我哪個(gè)對(duì)(錯(cuò)),告訴我那一個(gè)為什么對(duì)(錯(cuò))理論和實(shí)踐理論不結(jié)合實(shí)踐-書呆子實(shí)踐不結(jié)合理論-業(yè)余者理論結(jié)合實(shí)踐-科學(xué)家實(shí)踐結(jié)合理論-專業(yè)者三樓能進(jìn)行理論創(chuàng)新的人二樓掌握了理論的人一樓閱讀了XX源碼的人普通碼農(nóng)高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第3頁(yè)!最原始的網(wǎng)絡(luò)服務(wù)器網(wǎng)絡(luò)IO的基礎(chǔ)ssize_tread(intfd,void*buf,size_tcount);ssize_twrite(intfd,constvoid*buf,size_tcount);特點(diǎn):阻塞serv=tcp_socket();listen(serv);sock=accept(serv);read(sock,data);write(sock,data);close(sock)一次性服務(wù)無(wú)協(xié)議短連接如何重復(fù)服務(wù)?高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第4頁(yè)!帶有協(xié)議的網(wǎng)絡(luò)服務(wù)器如何讀取報(bào)文?盡可能多地讀取(read)數(shù)據(jù)到用戶緩沖區(qū)中,即使是固定長(zhǎng)度報(bào)文,也不要讀取指定長(zhǎng)度.判斷用戶緩沖區(qū)中的數(shù)據(jù)是否包含至少一個(gè)報(bào)文serv=tcp_socket();listen(serv);sock=accept(serv);packet_read(sock,packet);packet_write(sock,packet);close(sock)Packet是協(xié)議的報(bào)文
能不能使用TCP報(bào)文的格式?UDP?IP?ICMP?高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第5頁(yè)!可以處理多個(gè)連接的網(wǎng)絡(luò)服務(wù)器在外層加一個(gè)循環(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);//長(zhǎng)連接}缺點(diǎn):必須等一個(gè)連接關(guān)閉或者退出后,才能處理下一個(gè)連接,不是并發(fā)服務(wù)器.高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第6頁(yè)!阻塞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);}至少要有一個(gè)阻塞,所以可以在accept()之后進(jìn)行“解阻塞”.奇跡=>...高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第7頁(yè)!原始多線程并發(fā)網(wǎng)絡(luò)服務(wù)器(續(xù))缺點(diǎn):線程的數(shù)量無(wú)法得到控制.如果是短連接,創(chuàng)建線程的成本可能相對(duì)請(qǐng)求處理的成本更大要解決的問(wèn)題:如何控制線程的數(shù)量?如何避免創(chuàng)建線程對(duì)性能的影響高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第8頁(yè)!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ù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第9頁(yè)!委托給網(wǎng)絡(luò)服務(wù)回顧避免阻塞(解阻塞)的方法:使用非阻塞的接口來(lái)替代IO多路復(fù)用找出阻塞的地方,委托出去.委托給操作系統(tǒng)內(nèi)核sendfile()委托給多線程/多進(jìn)程(后面不討論多進(jìn)程)委托給網(wǎng)絡(luò)服務(wù)如Apache/Lighttpd/Niginx把請(qǐng)求通過(guò)fastcgi(網(wǎng)絡(luò))委托給php-cgi進(jìn)程(網(wǎng)絡(luò)服務(wù)器).委托給網(wǎng)絡(luò)服務(wù),這是一個(gè)遞歸過(guò)程高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第10頁(yè)!Web服務(wù)器的一般架構(gòu)Web服務(wù)器將客戶端的請(qǐng)求委托給PHPFastCGI進(jìn)程(是一個(gè)獨(dú)立的網(wǎng)絡(luò)服務(wù))處理Web服務(wù)器從FastCGI進(jìn)程讀取數(shù)據(jù)后,返回給瀏覽器如果不是獨(dú)立的FastCGI服務(wù),也可以是嵌入到Web服務(wù)器內(nèi)的線程/進(jìn)程(如Apachemod_php).高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第11頁(yè)!靜態(tài)文件請(qǐng)求的處理文件IO會(huì)阻塞委托給線程避免文件IO-內(nèi)存緩存委托給操作系統(tǒng)–sendfile()高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第12頁(yè)!FastCGI委托給網(wǎng)絡(luò)高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第13頁(yè)!FAQIT牛人.udpwork./高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第14頁(yè)!網(wǎng)絡(luò)協(xié)議協(xié)議包含兩個(gè)部分語(yǔ)法(報(bào)文格式)語(yǔ)義(指令的處理,交互時(shí)序等)最重要的TCP協(xié)議是流式協(xié)議,但幾乎所有的應(yīng)用協(xié)議都是基于報(bào)文的協(xié)議TCP的”粘包”和”分包”報(bào)文分隔用連接關(guān)閉來(lái)表示報(bào)文結(jié)束.如,HTTP/1.0的響應(yīng)固定長(zhǎng)度的報(bào)文.如,TFTP的數(shù)據(jù)報(bào)文.帶自描述長(zhǎng)度的固定長(zhǎng)度首部的變長(zhǎng)報(bào)文.如IP包,TCP分段,nshead(是協(xié)議嗎?).帶結(jié)束符.如,行協(xié)議,HTTP協(xié)議.逐字節(jié)解析和數(shù)據(jù)轉(zhuǎn)義的影響.高層文本,帶結(jié)束符底層二進(jìn)制,固定長(zhǎng)度高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第15頁(yè)!單個(gè)連接的連續(xù)服務(wù)(長(zhǎng)連接)在一個(gè)循環(huán)里不斷得讀取請(qǐng)求,處理,然后發(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ù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第16頁(yè)!并發(fā)網(wǎng)絡(luò)服務(wù)器并發(fā)服務(wù)器是指,同時(shí)處理多個(gè)請(qǐng)求的服務(wù)器.并發(fā)的原理:多核(多線程,多進(jìn)程)分片(請(qǐng)求處理的切分)并發(fā)的基本實(shí)現(xiàn)–避免阻塞(解阻塞)!使用非阻塞的接口來(lái)替代IO多路復(fù)用找出阻塞的地方,委托出去.委托給操作系統(tǒng)內(nèi)核sendfile()委托給多線程/多進(jìn)程(后面不討論多進(jìn)程)委托給網(wǎng)絡(luò)服務(wù)委托有時(shí)候也叫做"異步".高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第17頁(yè)!原始多線程并發(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)建線程,這個(gè)線程叫做"工作線程".高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第18頁(yè)!線程池并發(fā)網(wǎng)絡(luò)服務(wù)器初始化時(shí)創(chuàng)建線程池主進(jìn)程中accept()之后,把socket傳給工作線程但又帶來(lái)了一個(gè)問(wèn)題:雖然可以不斷地接受連接,但畢竟工作線程有限,還是會(huì)出現(xiàn)連接排隊(duì)等線程的情況.當(dāng)連接數(shù)少時(shí)是線程等連接,但當(dāng)連接數(shù)多時(shí)是連接等線程.怎么解決?調(diào)優(yōu)工作線程的數(shù)量.硬件問(wèn)題,不是軟件所能解決的,增加機(jī)器.改變服務(wù)器架構(gòu),tobecontinued...高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第19頁(yè)!IO多路復(fù)用函數(shù)介紹前面的架構(gòu)瓶頸在哪?基本IO多路復(fù)用函數(shù):intselect(intn,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);簡(jiǎn)化:(rfds_out,wfds_out)=select(rfds_in,wfds_in,timeout);功能:判斷rfds_in和wfds_in兩個(gè)列表中的socket連接,只要有至少一個(gè)可讀或者可寫,就返回.或者超時(shí)返回.rfds_in:要測(cè)試的是否可讀的socket列表wfds_in:要測(cè)試的是否可寫的socket列表rfds_out:返回可讀的socket列表wfds_out:返回可寫的socket列表timeout:超時(shí)時(shí)間,-1表示不永超時(shí)高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第20頁(yè)!HTTP服務(wù)器(Web服務(wù)器)報(bào)文解析:實(shí)現(xiàn)packet_read()用抓包工具抓一個(gè)HTTP請(qǐng)求報(bào)文和一個(gè)HTTP響應(yīng)報(bào)文對(duì)照著RFC上面兩步就是理論結(jié)合實(shí)踐,實(shí)踐結(jié)合理論語(yǔ)義實(shí)現(xiàn):實(shí)現(xiàn)handle_packet()靜態(tài)文件大文件小文件腳本處理,以php為例CGIFastCGIApachemod_php相對(duì)來(lái)說(shuō),報(bào)文的發(fā)送比較通用.高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第21頁(yè)!報(bào)文解析./person/pyhttp/使用Python的基本socket接口和字符串處理能力,實(shí)現(xiàn)了基本的HTTP協(xié)議報(bào)文的解析和協(xié)議實(shí)現(xiàn).為IO復(fù)用預(yù)留了接口高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第22頁(yè)!CGI多進(jìn)程用環(huán)境變量來(lái)傳遞請(qǐng)求的HTTP報(bào)頭信息和服務(wù)器信息用stdin傳遞請(qǐng)求的HTTP報(bào)體用stdout發(fā)送響應(yīng)報(bào)頭(部分)和報(bào)體缺點(diǎn):由于使用環(huán)境變量來(lái)通信,擴(kuò)展性受限一個(gè)進(jìn)程的生命周期只處理一個(gè)請(qǐng)求高性能并發(fā)Web服務(wù)器實(shí)現(xiàn)核心內(nèi)幕共25頁(yè),您現(xiàn)在瀏覽的是第23頁(yè)!補(bǔ)充話題IO多路復(fù)用模型中,為什么不能用標(biāo)準(zhǔn)IO庫(kù)的行讀取函數(shù)fgets()來(lái)讀取HTTP的首部.因?yàn)閒gets()調(diào)用可能多于一次read(),是可阻塞的文本協(xié)議和二進(jìn)制協(xié)議如何取舍報(bào)文的格式只是協(xié)議的其中一項(xiàng)內(nèi)容,語(yǔ)義
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度數(shù)據(jù)中心PPP項(xiàng)目運(yùn)維服務(wù)合同3篇
- 2024食用菌菌種生產(chǎn)技術(shù)改造與升級(jí)合同3篇
- 2025年度水電工程安全防護(hù)與應(yīng)急處理合同樣本4篇
- 2024私家車短期租賃合同
- 2025年農(nóng)業(yè)科技園區(qū)土地承包種植合同4篇
- 2025年度新能源汽車充電車棚建設(shè)及運(yùn)營(yíng)管理合同4篇
- 北京朗視儀器股份有限公司介紹企業(yè)發(fā)展分析報(bào)告
- 2025年度個(gè)人戶外活動(dòng)組織管理合同范本4篇
- 2025年度個(gè)人藝術(shù)品鑒定與評(píng)估合同4篇
- 2025年山東兗礦煤化供銷有限公司招聘筆試參考題庫(kù)含答案解析
- 稱量與天平培訓(xùn)試題及答案
- 超全的超濾與納濾概述、基本理論和應(yīng)用
- 2020年醫(yī)師定期考核試題與答案(公衛(wèi)專業(yè))
- 2022年中國(guó)育齡女性生殖健康研究報(bào)告
- 各種靜脈置管固定方法
- 消防報(bào)審驗(yàn)收程序及表格
- 教育金規(guī)劃ppt課件
- 呼吸機(jī)波形分析及臨床應(yīng)用
- 常用緊固件選用指南
- 私人借款協(xié)議書新編整理版示范文本
- 自薦書(彩色封面)
評(píng)論
0/150
提交評(píng)論