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

單服務(wù)器高性能模式:PPC與TPC

開發(fā) 前端
Apache服務(wù)器的MPM worker模式本質(zhì)上就是一種prethread方案,但進(jìn)行了改進(jìn)。Apache首先創(chuàng)建多個(gè)進(jìn)程,每個(gè)進(jìn)程再創(chuàng)建多個(gè)線程。這樣做的主要考慮是為了提高穩(wěn)定性,即使某個(gè)子進(jìn)程的某個(gè)線程異常退出,仍會(huì)有其他子進(jìn)程繼續(xù)提供服務(wù),不會(huì)導(dǎo)致整個(gè)服務(wù)器崩潰。

高性能是每位程序員的追求。無論我們?cè)O(shè)計(jì)系統(tǒng)還是編寫代碼,都渴望達(dá)到最佳性能。但實(shí)現(xiàn)高性能是極為復(fù)雜的,因?yàn)橹T如磁盤、操作系統(tǒng)、CPU、內(nèi)存、緩存、網(wǎng)絡(luò)、編程語言和架構(gòu)等因素都可能影響系統(tǒng)性能。一個(gè)不當(dāng)?shù)?debug 日志,甚至可能將服務(wù)器的性能從每秒處理 30000 個(gè)事務(wù)降低到 8000 個(gè);一個(gè) tcp_nodelay 參數(shù)的設(shè)置,可能將響應(yīng)時(shí)間從 2 毫秒延長到 40 毫秒。因此,實(shí)現(xiàn)高性能是一項(xiàng)極具挑戰(zhàn)性的任務(wù)。軟件系統(tǒng)開發(fā)的不同階段都會(huì)對(duì)最終的性能產(chǎn)生影響。

站在架構(gòu)師的角度,特別關(guān)注高性能架構(gòu)的設(shè)計(jì)是至關(guān)重要的。高性能架構(gòu)設(shè)計(jì)主要集中在兩個(gè)方面:

  1. 盡量提升單個(gè)服務(wù)器的性能,將其性能發(fā)揮到極致。
  2. 如果單服務(wù)器無法滿足性能需求,則設(shè)計(jì)服務(wù)器集群方案。

除了上述兩點(diǎn),系統(tǒng)最終能否實(shí)現(xiàn)高性能還與具體的實(shí)現(xiàn)和編碼有關(guān)。但架構(gòu)設(shè)計(jì)是實(shí)現(xiàn)高性能的基礎(chǔ)。如果架構(gòu)設(shè)計(jì)不能達(dá)到高性能要求,那么后續(xù)的實(shí)現(xiàn)和編碼優(yōu)化也只能在有限的空間內(nèi)發(fā)揮作用。可以形象地說,架構(gòu)設(shè)計(jì)決定了系統(tǒng)性能的上限,而實(shí)現(xiàn)細(xì)節(jié)則決定了系統(tǒng)性能的下限。

實(shí)現(xiàn)單服務(wù)器高性能的關(guān)鍵之一是選擇合適的并發(fā)模型。并發(fā)模型涉及以下兩個(gè)關(guān)鍵設(shè)計(jì)點(diǎn):

  1. 服務(wù)器如何管理連接。
  2. 服務(wù)器如何處理請(qǐng)求。

這兩個(gè)設(shè)計(jì)點(diǎn)最終都與操作系統(tǒng)的 I/O 模型和進(jìn)程模型相關(guān)。常見的 I/O 模型包括阻塞、非阻塞、同步和異步;而進(jìn)程模型可以是單進(jìn)程、多進(jìn)程或多線程。

PPC

PPC,即 Process Per Connection,意味著每次有新連接時(shí)就會(huì)創(chuàng)建一個(gè)新的進(jìn)程來專門處理該連接的請(qǐng)求。這是傳統(tǒng) UNIX 網(wǎng)絡(luò)服務(wù)器常采用的模型。

圖片圖片

在這種模式下,父進(jìn)程負(fù)責(zé)接受連接,并在接受到連接后通過“fork”創(chuàng)建一個(gè)子進(jìn)程來處理連接的讀寫請(qǐng)求。子進(jìn)程處理完請(qǐng)求后關(guān)閉連接。需要注意的是,在“fork”創(chuàng)建子進(jìn)程后,父進(jìn)程直接調(diào)用 close,看起來好像是關(guān)閉了連接,但實(shí)際上只是減少了連接的文件描述符引用計(jì)數(shù)。真正的關(guān)閉連接是在子進(jìn)程調(diào)用 close 后,連接的文件描述符引用計(jì)數(shù)變?yōu)?0,操作系統(tǒng)才會(huì)真正關(guān)閉連接。

PPC 模式實(shí)現(xiàn)簡(jiǎn)單,適用于連接數(shù)不多的情況,比如數(shù)據(jù)庫服務(wù)器。在互聯(lián)網(wǎng)興起之前,對(duì)于普通的業(yè)務(wù)服務(wù)器,由于訪問量和并發(fā)量相對(duì)較低,這種模式運(yùn)作良好。世界上第一個(gè) web 服務(wù)器 CERN httpd 就采用了這種模式。

然而,隨著互聯(lián)網(wǎng)的發(fā)展,服務(wù)器的并發(fā)和訪問量激增,PPC 模式的弊端也顯現(xiàn)出來:

fork 代價(jià)高:創(chuàng)建一個(gè)進(jìn)程的代價(jià)很高,需要分配大量內(nèi)核資源,將內(nèi)存映像從父進(jìn)程復(fù)制到子進(jìn)程。即使現(xiàn)在的操作系統(tǒng)采用了 Copy on Write 技術(shù),總體上創(chuàng)建進(jìn)程的代價(jià)仍然較高。

父子進(jìn)程通信復(fù)雜:父進(jìn)程“fork”子進(jìn)程后,父子進(jìn)程之間通信復(fù)雜,需要采用 IPC 進(jìn)程通信方案。例如,子進(jìn)程需要在關(guān)閉連接之前告知父進(jìn)程處理了多少個(gè)請(qǐng)求,以支持父進(jìn)程進(jìn)行全局統(tǒng)計(jì)。

并發(fā)連接數(shù)量有限:如果每個(gè)連接存活時(shí)間較長且新連接不斷進(jìn)來,進(jìn)程數(shù)量會(huì)不斷增加,導(dǎo)致操作系統(tǒng)進(jìn)程調(diào)度和切換頻繁,系統(tǒng)壓力增大。因此,一般情況下,PPC 方案最多能處理的并發(fā)連接數(shù)量只有幾百個(gè)。

TPC

TPC,即 Thread Per Connection,意味著每次有新連接時(shí)都會(huì)創(chuàng)建一個(gè)新線程專門處理該連接的請(qǐng)求。相比進(jìn)程,線程更輕量級(jí),創(chuàng)建線程的開銷更小;同時(shí),線程共享進(jìn)程內(nèi)存空間,線程間通信相對(duì)簡(jiǎn)單。因此,TPC 實(shí)際上是解決了或者減輕了 PPC 中 fork 代價(jià)高和父子進(jìn)程通信復(fù)雜的問題。

圖片圖片

在TPC模式下,父進(jìn)程負(fù)責(zé)接受連接,然后創(chuàng)建子線程來處理連接的讀寫請(qǐng)求,最后子線程關(guān)閉連接。與 PPC 不同的是,主進(jìn)程無需手動(dòng)關(guān)閉連接,因?yàn)樽泳€程共享主進(jìn)程的進(jìn)程空間,連接的文件描述符沒有被復(fù)制,只需一次 close 即可。

盡管TPC解決了 fork 代價(jià)高和進(jìn)程通信復(fù)雜的問題,但也帶來了新的挑戰(zhàn):

創(chuàng)建線程雖然比創(chuàng)建進(jìn)程代價(jià)低,但在高并發(fā)情況下(如每秒上萬連接),仍存在性能問題。

雖然無需進(jìn)程間通信,但線程間的互斥和共享帶來了復(fù)雜性,容易導(dǎo)致死鎖問題。

多線程會(huì)出現(xiàn)互相影響的情況,某個(gè)線程異常可能導(dǎo)致整個(gè)進(jìn)程退出(如內(nèi)存越界)。

除了引入新的問題,TPC 仍然面臨 CPU 線程調(diào)度和切換的代價(jià)。因此,在并發(fā)連接幾百個(gè)的場(chǎng)景下,更傾向于使用 PPC,因?yàn)樗鼪]有死鎖風(fēng)險(xiǎn),也不會(huì)受多進(jìn)程相互影響,具有更高的穩(wěn)定性。

prethread

TPC模式中,只有在連接進(jìn)來時(shí)才創(chuàng)建新的線程來處理連接請(qǐng)求。盡管創(chuàng)建線程比創(chuàng)建進(jìn)程更輕量級(jí),但仍然存在一定的代價(jià)。為了解決這個(gè)問題,出現(xiàn)了prethread模式。

圖片圖片

類似于prefork,prethread模式會(huì)預(yù)先創(chuàng)建線程,然后開始接受用戶請(qǐng)求。這樣,當(dāng)新連接進(jìn)來時(shí),就無需再創(chuàng)建線程,從而提升用戶感知的速度和體驗(yàn)。

由于多線程之間數(shù)據(jù)共享和通信更方便,prethread的實(shí)現(xiàn)方式比prefork更靈活。常見的實(shí)現(xiàn)方式包括:

主進(jìn)程accept連接,然后將連接交給某個(gè)線程處理。

多個(gè)子線程嘗試accept連接,只有一個(gè)線程accept成功。

Apache服務(wù)器的MPM worker模式本質(zhì)上就是一種prethread方案,但進(jìn)行了改進(jìn)。Apache首先創(chuàng)建多個(gè)進(jìn)程,每個(gè)進(jìn)程再創(chuàng)建多個(gè)線程。這樣做的主要考慮是為了提高穩(wěn)定性,即使某個(gè)子進(jìn)程的某個(gè)線程異常退出,仍會(huì)有其他子進(jìn)程繼續(xù)提供服務(wù),不會(huì)導(dǎo)致整個(gè)服務(wù)器崩潰。

prethread理論上可以支持比prefork更多的并發(fā)連接。例如,Apache服務(wù)器的MPM worker模式默認(rèn)支持400個(gè)并發(fā)處理線程(16個(gè)進(jìn)程 × 25個(gè)線程)。

責(zé)任編輯:武曉燕 來源: 二進(jìn)制跳動(dòng)
相關(guān)推薦

2009-11-17 14:05:57

微軟高性能計(jì)算服務(wù)器

2019-07-31 14:36:46

Linux服務(wù)器框架

2011-04-07 13:39:24

WebHTTP

2014-04-09 10:50:01

Squid架構(gòu)緩存服務(wù)器

2021-09-22 16:25:17

服務(wù)器戴爾科技集團(tuán)

2010-05-07 17:50:31

Unix服務(wù)器

2011-03-11 09:51:47

Java NIO

2019-01-15 10:54:03

高性能ServerReactor

2021-05-28 05:18:08

PHP語言roadrunnner

2017-12-20 14:59:44

服務(wù)器

2009-02-18 12:45:00

2012-11-08 09:57:29

低功耗高性能服務(wù)器處理器

2012-09-05 09:44:37

IDC高性能服務(wù)器HPC

2011-03-30 10:52:07

SQL Server數(shù)服務(wù)器

2011-05-11 10:23:50

富士通關(guān)鍵業(yè)務(wù)服務(wù)器

2019-01-08 13:32:38

Nginx服務(wù)器IO復(fù)用

2020-11-10 07:46:09

服務(wù)器高并發(fā)高性能

2020-06-02 14:57:06

Linux服務(wù)器架構(gòu)

2021-09-14 10:21:13

CPU高性能服務(wù)器

2019-07-10 15:10:14

高性能服務(wù)器架構(gòu)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 在线视频一区二区三区 | 国产精品 欧美精品 | 亚洲经典一区 | 国产精品成人一区 | 亚洲午夜久久久 | 福利一区二区在线 | 久热久热 | 国产精品国产成人国产三级 | 中文在线一区二区 | h视频在线免费 | 精品av| 午夜精品久久久久99蜜 | 综合五月婷 | 国产日韩欧美一区二区 | 国产精品久久久久999 | 午夜精品| 久热精品免费 | 日本精品一区二区三区在线观看视频 | 国产jizz女人多喷水99 | 亚洲国产电影 | 日本 欧美 国产 | 日日骚视频| 草草视频在线观看 | 欧洲亚洲精品久久久久 | 在线免费观看成人 | 久久亚洲欧美日韩精品专区 | 中文字幕日韩欧美 | 久久99精品久久久久婷婷 | 99热播精品 | 在线欧美a | 九色在线 | 亚洲精品国产电影 | 一区二区三区免费 | 亚洲欧美激情视频 | 日韩欧美一区二区三区免费观看 | 久久一区二区三区电影 | av入口 | 91看片在线观看 | 91在线视频网址 | 欧美一区二区三区国产 | jizz视频 |