線程創(chuàng)建方法、業(yè)務(wù)請求處理方法及相關(guān)設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種線程創(chuàng)建方法、業(yè)務(wù)請求處理方法及相關(guān)設(shè)備。
【背景技術(shù)】
[0002]隨著Internet的迅猛發(fā)展,人們對Web服務(wù)器的訪問日益頻繁,從而對Web服務(wù)器的性能也提出越來越高的要求。為了能夠向用戶提供更加快捷的服務(wù),Web服務(wù)器對處理并發(fā)訪問的要求越來越高。當(dāng)用戶并發(fā)訪問量過高時(shí),服務(wù)器就會(huì)超載,Web站點(diǎn)的訪問速度就會(huì)下降。為了能夠容納更多的用戶同時(shí)訪問,盡可能提升Web服務(wù)器性能,需要盡量改善Web服務(wù)器的處理器能力,使用更加強(qiáng)大的計(jì)算機(jī)芯片。
[0003]近幾年,計(jì)算機(jī)芯片制作工藝的不斷提高,眾核處理器已經(jīng)成為了處理器發(fā)展的一個(gè)重要趨勢。眾核處理器比多核處理器中的處理內(nèi)核數(shù)量還要多,計(jì)算能力更強(qiáng)大。當(dāng)前的軟件結(jié)構(gòu)可以在當(dāng)前的多核結(jié)構(gòu)上得到較好的擴(kuò)展,但如果超過八個(gè)處理器核,當(dāng)前軟件結(jié)構(gòu)的擴(kuò)展能力將會(huì)很差。超過八個(gè)處理器核的設(shè)計(jì)即被稱為“眾核”處理器。
[0004]眾核處理器擁有比普通的多核處理器更多的處理單元,以及更加強(qiáng)大的并行處理能力。越來越多的Web服務(wù)器正在采用這種強(qiáng)大的眾核環(huán)境作為其提升性能的基礎(chǔ)。當(dāng)今的軟件結(jié)構(gòu)已經(jīng)可以在普通的多核處理器上得到較好的擴(kuò)展。但是,在眾核處理器環(huán)境下,如何保證軟件能夠隨著硬件核數(shù)地增多更加高效地?cái)U(kuò)展,已經(jīng)逐漸變成眾核軟件設(shè)計(jì)的核心問題。
[0005]另一方面,基于眾核處理器的多內(nèi)核操作系統(tǒng)也在不斷發(fā)展。在多內(nèi)核操作系統(tǒng)中,每一個(gè)硬件核(core)都有自已的一個(gè)內(nèi)核(kernel),并且不共享內(nèi)存,這一點(diǎn)有別于現(xiàn)存的Windows與基于Linux內(nèi)核的操作系統(tǒng)。內(nèi)核之間的通信通過消息傳遞方式,在內(nèi)核數(shù)量很大的情況下要優(yōu)于傳統(tǒng)的共享內(nèi)存的通信方式,能充分利用眾核處理芯片。目前,已經(jīng)有一些基于多內(nèi)核操作系統(tǒng)的應(yīng)用,例如基于Barrelfish的Haskell編譯器、虛擬機(jī)等。在眾核環(huán)境下,它們的性能明顯地高出傳統(tǒng)的操作系統(tǒng)。
[0006]伴隨著Web服務(wù)器對處理器的需求顯著增加,如果能夠利用多內(nèi)核操作系統(tǒng)的優(yōu)勢,就可以盡可能充分發(fā)揮眾核環(huán)境的處理能力,所以,如何將Web服務(wù)器的軟件部署在多內(nèi)核操作系統(tǒng)中即成為核心的問題。
[0007]在Windows、Linux等操作系統(tǒng)中,目前的Web服務(wù)器軟件是針對操作系統(tǒng)的進(jìn)程線程模型,使用特定的方式創(chuàng)建和管理進(jìn)程線程來進(jìn)行多任務(wù)的管理,從而同時(shí)響應(yīng)并發(fā)請求。如果將現(xiàn)有的多任務(wù)管理方式直接地運(yùn)用在多內(nèi)核操作系統(tǒng)中,會(huì)引人一些不必要的系統(tǒng)開銷,從而導(dǎo)致無法發(fā)揮眾核環(huán)境的優(yōu)越性。
[0008]在針對多任務(wù)管理的問題上,現(xiàn)有技術(shù)中已經(jīng)存在了一些成熟的方法和模型。一個(gè)典型的多任務(wù)管理方法叫做Prefork (預(yù)派生)。Prefork實(shí)現(xiàn)了一個(gè)非線程型的、預(yù)派生的web服務(wù)器。
[0009]在Prefork方法中,一個(gè)單獨(dú)的控制進(jìn)程(父進(jìn)程)負(fù)責(zé)產(chǎn)生子進(jìn)程,這些子進(jìn)程用于監(jiān)聽請求并作出應(yīng)答。并且,Web服務(wù)器總是試圖保持一些備用的(spare)或者是空閑的子進(jìn)程,用于準(zhǔn)備對將到來的請求進(jìn)行處理,從而使得客戶端不需要在得到服務(wù)前等候子進(jìn)程的產(chǎn)生,以提高對請求的處理效率。
[0010]然而,在上述Prefork方法中,雖然可以讓預(yù)先創(chuàng)建好的進(jìn)程處理新的請求,以避免客戶端等待服務(wù)端創(chuàng)建處理進(jìn)程而影響響應(yīng)速度,但仍然存在如下問題:
[0011]進(jìn)程過多會(huì)占有過多的不必要的系統(tǒng)資源,浪費(fèi)了系統(tǒng)的空間資源,并且增加操作系統(tǒng)調(diào)度進(jìn)程的開銷,浪費(fèi)了系統(tǒng)的時(shí)間資源,并且是利用進(jìn)程來完成對請求的處理,而沒有利用線程的優(yōu)勢,代價(jià)較大。
[0012]另一種常用的Web服務(wù)器的多任務(wù)管理方法是Worker, Worker方法支持混合的多線程多進(jìn)程。
[0013]在Worker方法中,總是試圖維持一個(gè)備用(spare)或是空閑的服務(wù)線程池,這樣,客戶端的請求無須等待新線程或新進(jìn)程的建立即可得到處理。初始化時(shí)建立一定數(shù)量進(jìn)程,隨后父進(jìn)程檢測所有子進(jìn)程中空閑線程的總數(shù),并新建或結(jié)束子進(jìn)程使空閑線程的總數(shù)維持在一定的范圍內(nèi)。
[0014]并且,如圖1所示,可以創(chuàng)建多個(gè)進(jìn)程,例如,進(jìn)程I至進(jìn)程4,一個(gè)進(jìn)程下所創(chuàng)建的線程中,可以包括一個(gè)監(jiān)聽線程(listener)和多個(gè)工作線程(worker),且各個(gè)線程會(huì)被隨機(jī)調(diào)度到空閑的硬件核上,如圖1中的硬件核I至硬件核8。在創(chuàng)建多進(jìn)程和多線程后,由多個(gè)進(jìn)程的多個(gè)監(jiān)聽線程向系統(tǒng)請求競爭一個(gè)鎖,并在請求到鎖后才能監(jiān)聽,并將監(jiān)聽得到的業(yè)務(wù)請求分配給與自身屬于同一個(gè)進(jìn)程的空閑的工作線程。
[0015]在Worker方法中,由于使用線程來處理業(yè)務(wù)請求,所以可以處理海量請求,而系統(tǒng)資源的開銷小于基于進(jìn)程的管理方法。
[0016]然而,由于多個(gè)監(jiān)聽線程需要向系統(tǒng)請求競爭一個(gè)鎖,隨著硬件核數(shù)的增加,競爭加劇,導(dǎo)致服務(wù)器的處理能力無法隨著硬件核數(shù)的增加而線性增加,進(jìn)而由于進(jìn)程和線程創(chuàng)建的不合理,導(dǎo)致服務(wù)器對并發(fā)的多業(yè)務(wù)請求的處理效率較低。
【發(fā)明內(nèi)容】
[0017]本發(fā)明實(shí)施例提供一種線程創(chuàng)建方法、業(yè)務(wù)請求處理方法及相關(guān)設(shè)備,用以解決現(xiàn)有技術(shù)中存在的線程創(chuàng)建不合理的問題,以及因此導(dǎo)致的服務(wù)器對并發(fā)的業(yè)務(wù)請求的處理效率較低的問題。
[0018]第一方面,提供一種線程創(chuàng)建方法,應(yīng)用于具有多隊(duì)列網(wǎng)卡的服務(wù)器,所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列中存儲來自客戶端的業(yè)務(wù)請求,包括:
[0019]獲取所述服務(wù)器的所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列數(shù);
[0020]創(chuàng)建與所述網(wǎng)卡隊(duì)列數(shù)相等數(shù)量的進(jìn)程;
[0021]在每個(gè)進(jìn)程中創(chuàng)建一個(gè)監(jiān)聽線程和多個(gè)工作線程;
[0022]將創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定。
[0023]結(jié)合第一方面,在第一種可能的實(shí)現(xiàn)方式中,所述服務(wù)器具有多硬件核處理器;
[0024]將創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定,包括:
[0025]將創(chuàng)建的每個(gè)監(jiān)聽線程分別與所述多硬件核處理器中的不同的目標(biāo)硬件核綁定,將所述多隊(duì)列網(wǎng)卡中的每個(gè)網(wǎng)卡隊(duì)列分別與所述目標(biāo)硬件核中不同的硬件核綁定,從而實(shí)現(xiàn)創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定;其中,所述目標(biāo)硬件核為所述多硬件核處理器中用于綁定所述監(jiān)聽線程和所述網(wǎng)卡隊(duì)列的所有硬件核,所述網(wǎng)卡隊(duì)列的數(shù)量等于所述目標(biāo)硬件核的數(shù)量。
[0026]結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,還包括:
[0027]將每個(gè)進(jìn)程中創(chuàng)建的工作線程綁定一個(gè)硬件核。
[0028]結(jié)合第一方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,不同進(jìn)程中創(chuàng)建的工作線程綁定的硬件核不同。
[0029]結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式、第一方面的第二種可能的實(shí)現(xiàn)方式或者第一方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,還包括:
[0030]當(dāng)所述服務(wù)器的多硬件核處理器的硬件核增加時(shí),針對每個(gè)增加的硬件核,在一個(gè)進(jìn)程中創(chuàng)建新的工作線程;
[0031]將創(chuàng)建的新的工作線程與新增加的該硬件核綁定。
[0032]結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式、第一方面的第二種可能的實(shí)現(xiàn)方式或者第一方面的第三種可能的實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,還包括:
[0033]當(dāng)所述服務(wù)器的多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列增加時(shí),針對每個(gè)增加的網(wǎng)卡隊(duì)列創(chuàng)建新進(jìn)程;
[0034]在創(chuàng)建的新進(jìn)程中創(chuàng)建一個(gè)監(jiān)聽線程和多個(gè)工作線程;
[0035]將在新進(jìn)程中創(chuàng)建的監(jiān)聽線程與新增加的該網(wǎng)卡隊(duì)列綁定。
[0036]結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式、第一方面的第二種可能的實(shí)現(xiàn)方式或者第一方面的第三種可能的實(shí)現(xiàn)方式,在第六種可能的實(shí)現(xiàn)方式中,還包括:
[0037]當(dāng)一個(gè)進(jìn)程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量小于第一預(yù)設(shè)數(shù)量閾值時(shí),在該進(jìn)程中創(chuàng)建新的工作線程;和/或
[0038]當(dāng)一個(gè)進(jìn)程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量大于第二預(yù)設(shè)數(shù)量閾值時(shí),在該進(jìn)程中撤銷處于空閑狀態(tài)的工作線程,且撤銷后該進(jìn)程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量不大于第二預(yù)設(shè)數(shù)量閾值。
[0039]第二方面,提供一種業(yè)務(wù)請求處理方法,應(yīng)用于服務(wù)器的多隊(duì)列網(wǎng)卡,所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列中存儲來自客戶端的業(yè)務(wù)請求,所述服務(wù)器上創(chuàng)建有與所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列數(shù)相等數(shù)量的進(jìn)程,且每個(gè)進(jìn)程中創(chuàng)建有一個(gè)監(jiān)聽線程和多個(gè)工作線程,且創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定,所述方法包括:
[0040]所述多隊(duì)列網(wǎng)卡從自身的網(wǎng)卡隊(duì)列中獲取來自客戶端的業(yè)務(wù)請求;
[0041]向與該網(wǎng)卡隊(duì)列綁定的監(jiān)聽線程發(fā)送所述業(yè)務(wù)請求;
[0042]接收與該監(jiān)聽線程屬于同一進(jìn)程的工作線程對所述業(yè)務(wù)請求進(jìn)行業(yè)務(wù)處理后發(fā)送的業(yè)務(wù)處理結(jié)果;
[0043]向所述客戶端返回所述業(yè)務(wù)處理結(jié)果。
[0044]結(jié)合第二方面,在第一種可能的實(shí)現(xiàn)方式中,在從自身的網(wǎng)卡隊(duì)列中獲取來自客戶端的業(yè)務(wù)請求之前,還包括:
[0045]接收已創(chuàng)建的各監(jiān)聽線程分別發(fā)送的業(yè)務(wù)請求獲取消息,所述業(yè)務(wù)請求獲取消息中攜帶監(jiān)聽線程綁定的網(wǎng)卡隊(duì)列的隊(duì)列標(biāo)識;
[0046]確定發(fā)送所述業(yè)務(wù)請求獲取消息的監(jiān)聽線程,與所述業(yè)務(wù)請求獲取消息中攜帶的所述隊(duì)列標(biāo)識對應(yīng)的網(wǎng)卡隊(duì)列相綁定。
[0047]結(jié)合第二方面,在第二種可能的實(shí)現(xiàn)方式中,所述服務(wù)器具有多硬件核處理器,創(chuàng)建的每個(gè)監(jiān)聽線程分別與所述多硬件核處理器中的不同的目標(biāo)硬件核綁定,且所述多隊(duì)列網(wǎng)卡中的每個(gè)網(wǎng)卡隊(duì)列分別與所述目標(biāo)硬件核中不同的硬件核綁定,從而實(shí)現(xiàn)創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定;其中,所述目標(biāo)硬件核為所述多硬件核處理器中用于綁定所述監(jiān)聽線程和所述網(wǎng)卡隊(duì)列的所有硬件核,所述網(wǎng)卡隊(duì)列的數(shù)量等于所述目標(biāo)硬件核的數(shù)量;
[0048]向與該網(wǎng)卡隊(duì)列綁定的監(jiān)聽線程發(fā)送所述業(yè)務(wù)請求,包括:
[0049]向與該網(wǎng)卡隊(duì)列綁定的目標(biāo)硬件核上運(yùn)行的監(jiān)聽線程發(fā)送所述業(yè)務(wù)請求。
[0050]結(jié)合第二方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,每個(gè)進(jìn)程中創(chuàng)建的工作線程綁定一個(gè)硬件核。
[0051]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,不同進(jìn)程中創(chuàng)建的工作線程綁定的硬件核不同。
[0052]第三方面,提供一種業(yè)務(wù)請求處理方法,應(yīng)用于服務(wù)器上創(chuàng)建的監(jiān)聽線程,所述服務(wù)器具有多隊(duì)列網(wǎng)卡,所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列中存儲來自客戶端的業(yè)務(wù)請求,所述服務(wù)器上創(chuàng)建有與所述多隊(duì)列網(wǎng)卡的網(wǎng)卡隊(duì)列數(shù)相等數(shù)量的進(jìn)程,且每個(gè)進(jìn)程中創(chuàng)建有一個(gè)監(jiān)聽線程和多個(gè)工作線程,且創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定,所述方法包括:
[0053]監(jiān)聽線程接收所述服務(wù)器的多隊(duì)列網(wǎng)卡發(fā)送的從與該監(jiān)聽線程綁定的網(wǎng)卡隊(duì)列中獲取的來自客戶端的業(yè)務(wù)請求;
[0054]向與該監(jiān)聽線程屬于同一進(jìn)程的處于空閑狀態(tài)的工作線程發(fā)送所述業(yè)務(wù)請求,用于指示該工作線程對所述業(yè)務(wù)請求進(jìn)行業(yè)務(wù)處理,并將得到的業(yè)務(wù)處理結(jié)果發(fā)送給所述多隊(duì)列網(wǎng)卡。
[0055]結(jié)合第三方面,在第一種可能的實(shí)現(xiàn)方式中,在接收所述服務(wù)器的多隊(duì)列網(wǎng)卡發(fā)送的從與該監(jiān)聽線程綁定的網(wǎng)卡隊(duì)列中獲取的來自客戶端的業(yè)務(wù)請求之前,還包括:
[0056]向所述多隊(duì)列網(wǎng)卡發(fā)送業(yè)務(wù)請求獲取消息,所述業(yè)務(wù)請求獲取消息中攜帶該監(jiān)聽線程綁定的網(wǎng)卡隊(duì)列的隊(duì)列標(biāo)識,用于所述多隊(duì)列網(wǎng)卡確定該監(jiān)聽線程與所述隊(duì)列標(biāo)識對應(yīng)的網(wǎng)卡隊(duì)列相綁定。
[0057]結(jié)合第三方面,在第二種可能的實(shí)現(xiàn)方式中,所述服務(wù)器具有多硬件核處理器,創(chuàng)建的每個(gè)監(jiān)聽線程分別與所述多硬件核處理器中的不同的目標(biāo)硬件核綁定,且所述多隊(duì)列網(wǎng)卡中的每個(gè)網(wǎng)卡隊(duì)列分別與所述目標(biāo)硬件核中不同的硬件核綁定,從而實(shí)現(xiàn)創(chuàng)建的每個(gè)監(jiān)聽線程分別與不同的網(wǎng)卡隊(duì)列綁定;其中,所述目標(biāo)硬件核為所述多硬件核處理器中用于綁定所述監(jiān)聽線程和所述網(wǎng)卡隊(duì)列的所有硬件核,所述網(wǎng)卡隊(duì)列的數(shù)量等于所述目標(biāo)硬件核的數(shù)量;
[0058]監(jiān)聽線程接收所述服務(wù)器的多隊(duì)列網(wǎng)卡發(fā)送的從與該監(jiān)聽線程綁定的網(wǎng)卡隊(duì)列中獲取的來自客戶端的業(yè)務(wù)請求,包括:
[0059]監(jiān)聽線程接收所述服務(wù)器的多隊(duì)列網(wǎng)卡發(fā)送的從與運(yùn)行該監(jiān)聽線程的目標(biāo)硬件核綁定的網(wǎng)卡隊(duì)列中獲取的來自客戶端的業(yè)務(wù)請求。
[0060]結(jié)合第三方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,每個(gè)進(jìn)程中創(chuàng)建的工作線程綁定一個(gè)硬件核。
[0061]結(jié)合第三方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,不同進(jìn)程中創(chuàng)建的工作線程綁定的硬件核不同。
[0062]結(jié)合第三方面、第三方面的第一種可能的實(shí)現(xiàn)方式、第三