從多硬件核處理器的除目標硬件核之外的其它硬件核中,選擇一個作為新的目標硬件核,將新進程中創(chuàng)建的監(jiān)聽線程與該新的目標硬件核綁定,并將新增加的該網(wǎng)卡隊列與該新的目標硬件核綁定,從而實現(xiàn)將在新進程中創(chuàng)建的監(jiān)聽線程與新增加的該網(wǎng)卡隊列綁定。
[0188]步驟704、進一步的,還可以將在新進程中創(chuàng)建的工作線程綁定一個硬件核,如果此時存在新增加的硬件核,可以與新增加的硬件核綁定,如果不存在新增加的硬件核,可以解除一個原有硬件核綁定的工作線程,并將該原有硬件核與在新進程中創(chuàng)建的工作線程進行綁定。
[0189]本發(fā)明實施例中,在服務(wù)器啟動后,并采用上述圖3所示方法創(chuàng)建進程和線程后,服務(wù)器即可以對來自客戶端的業(yè)務(wù)請求進行業(yè)務(wù)處理,在處理過程中,工作線程的狀態(tài)在工作狀態(tài)與空閑狀態(tài)之間切換,當(dāng)前處于空閑狀態(tài)的工作線程的數(shù)量,可以表示服務(wù)器當(dāng)前的負載情況,以及對將來并發(fā)的業(yè)務(wù)請求的處理能力。
[0190]為了更好地使用硬件資源,服務(wù)器可以具備一定動態(tài)擴展的能力。一方面,當(dāng)業(yè)務(wù)請求負載過高時,如果當(dāng)前的工作線程的數(shù)量無法達到并發(fā)量時,需要增加工作線程的數(shù)量,以便盡可能發(fā)揮硬件的計算能力。反之,如果服務(wù)器在某一時間段內(nèi)的業(yè)務(wù)請求過少,如果始終維護著大量的工作線程,將浪費硬件的資源,例如能耗。
[0191]為了保證對將來并發(fā)的業(yè)務(wù)請求及時處理,可以采用如下第一種方式調(diào)整一個進程中的工作線程:
[0192]第一種方式:針對每個進程,監(jiān)控該進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量與第一預(yù)設(shè)閾值的大小關(guān)系,并當(dāng)該進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量小于第一預(yù)設(shè)數(shù)量閾值時,在該進程中創(chuàng)建新的工作線程,以便為對將來并發(fā)的業(yè)務(wù)請求的及時處理做準備。
[0193]進一步的,還可以將創(chuàng)建的新的工作線程與一個硬件核進行綁定,該硬件核為該新的工作線程所屬的進程對應(yīng)的硬件核。
[0194]另一方面,由于維持創(chuàng)建的工作線程需要消耗系統(tǒng)資源,所以為了節(jié)省系統(tǒng)資源的消耗,還可以采用如下第二種方式調(diào)整一個進程中的工作線程:
[0195]第二種方式:針對每個進程,監(jiān)控該進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量與第二預(yù)設(shè)閾值的大小關(guān)系,并當(dāng)一個進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量大于第二預(yù)設(shè)數(shù)量閾值時,在該進程中撤銷處于空閑狀態(tài)的工作線程,且撤銷后該進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量不大于第二預(yù)設(shè)數(shù)量閾值。
[0196]進一步的,當(dāng)上述兩種方式相結(jié)合時,在第二種方式中,撤銷后處于空閑狀態(tài)的工作線程的數(shù)量不小于第一預(yù)設(shè)數(shù)量閾值,其中,第一預(yù)設(shè)數(shù)量閾值小于第二預(yù)設(shè)數(shù)量閾值,具體數(shù)值可以根據(jù)實際應(yīng)用場景和需要進行靈活設(shè)置,在此不再進行詳細描述。
[0197]上述兩種方式相結(jié)合,即可以在保證對將來并發(fā)的業(yè)務(wù)請求及時處理的同時,還能夠有效節(jié)省維持創(chuàng)建的工作線程所消耗的系統(tǒng)資源。
[0198]實施例2:
[0199]針對本發(fā)明實施例1提供的上述線程創(chuàng)建方法,相應(yīng)的,本發(fā)明實施例2提供一種業(yè)務(wù)請求處理方法,應(yīng)用于服務(wù)器的多隊列網(wǎng)卡,該多隊列網(wǎng)卡的網(wǎng)卡隊列中存儲來自客戶端的業(yè)務(wù)請求,如圖8所示,包括:
[0200]步驟801、多隊列網(wǎng)卡從自身的網(wǎng)卡隊列中獲取來自客戶端的業(yè)務(wù)請求。
[0201]步驟802、向與該網(wǎng)卡隊列綁定的監(jiān)聽線程發(fā)送該業(yè)務(wù)請求。
[0202]步驟803、接收與該監(jiān)聽線程屬于同一進程的工作線程對該業(yè)務(wù)請求進行業(yè)務(wù)處理后發(fā)送的業(yè)務(wù)處理結(jié)果。
[0203]步驟804、向客戶端返回業(yè)務(wù)處理結(jié)果。
[0204]相應(yīng)的,本發(fā)明實施例2還提供了一種業(yè)務(wù)請求處理方法,應(yīng)用于監(jiān)聽線程,如圖9所示,包括:
[0205]步驟901、監(jiān)聽線程接收服務(wù)器的多隊列網(wǎng)卡發(fā)送的從與該監(jiān)聽線程綁定的網(wǎng)卡隊列中獲取的來自客戶端的業(yè)務(wù)請求。
[0206]步驟902、向與該監(jiān)聽線程屬于同一進程的處于空閑狀態(tài)的工作線程發(fā)送該業(yè)務(wù)請求,用于指示該工作線程對該業(yè)務(wù)請求進行業(yè)務(wù)處理,并將得到的業(yè)務(wù)處理結(jié)果發(fā)送給多隊列網(wǎng)卡。
[0207]下面結(jié)合附圖,用具體實施例對本發(fā)明提供的上述業(yè)務(wù)請求處理方法進行詳細描述,如圖10所示,具體包括如下處理步驟:
[0208]步驟1001、客戶端向服務(wù)器發(fā)送業(yè)務(wù)請求。
[0209]本發(fā)明實施例提供的業(yè)務(wù)請求處理方法,可應(yīng)用于各種具體業(yè)務(wù)場景中,例如,月艮務(wù)器可以為Web服務(wù)器,客戶端發(fā)送的業(yè)務(wù)請求為Web請求。
[0210]步驟1002、服務(wù)器通過多隊列網(wǎng)卡接收到客戶端發(fā)送的業(yè)務(wù)請求后,將保存到網(wǎng)卡隊列中,等待被分發(fā)給工作線程進行業(yè)務(wù)處理。
[0211]步驟1003、多隊列網(wǎng)卡從網(wǎng)卡隊列中獲取業(yè)務(wù)請求,并向與該網(wǎng)卡隊列綁定的監(jiān)聽線程發(fā)送該業(yè)務(wù)請求。
[0212]本發(fā)明實施例2中,在多隊列網(wǎng)卡一側(cè)保存的網(wǎng)卡隊列與監(jiān)聽線程的綁定關(guān)系,可以是在創(chuàng)建進程和線程后,預(yù)先在多隊列網(wǎng)卡一側(cè)進行配置的,也可以由已創(chuàng)建的各監(jiān)聽線程分別向多隊列網(wǎng)卡發(fā)送業(yè)務(wù)請求獲取消息,該業(yè)務(wù)請求獲取消息中攜帶監(jiān)聽線程綁定的網(wǎng)卡隊列的隊列標識,多隊列網(wǎng)卡基于接收的每個業(yè)務(wù)請求獲取消息,確定發(fā)送該業(yè)務(wù)請求獲取消息的監(jiān)聽線程,與該業(yè)務(wù)請求獲取消息中攜帶的隊列標識對應(yīng)的網(wǎng)卡隊列相綁定。
[0213]本步驟中,當(dāng)通過與網(wǎng)卡隊列和監(jiān)聽線程分別綁定的目標硬件核,實現(xiàn)該網(wǎng)卡隊列和該監(jiān)聽線程的綁定時,具體可以向與該網(wǎng)卡隊列綁定的目標硬件核上運行的監(jiān)聽線程發(fā)送該業(yè)務(wù)請求。
[0214]步驟1004、監(jiān)聽線程在接收到服務(wù)器的多隊列網(wǎng)卡發(fā)送的業(yè)務(wù)請求后,確定一個與自身屬于同一進程的且處于空閑狀態(tài)的工作線程,作為后續(xù)將要處理該業(yè)務(wù)請求的工作線程。
[0215]本步驟中,監(jiān)聽線程可以從與自身屬于同一進程的且當(dāng)前處于空閑狀態(tài)的全部工作線程中,選擇一個工作線程,當(dāng)不存在處于空閑狀態(tài)的工作線程時,可以創(chuàng)建一個新的工作線程,并在創(chuàng)建完成后,將該新的工作線程作為后續(xù)將要處理該業(yè)務(wù)請求的工作線程。
[0216]當(dāng)創(chuàng)建了新的工作線程時,還可以將該新的工作線程與一個硬件核進行綁定,且該硬件核為新的工作線程所屬進程對應(yīng)的硬件核。
[0217]步驟1005、監(jiān)聽線程向確定的該工作線程發(fā)送該業(yè)務(wù)請求。
[0218]步驟1006、該工作線程在接收到該業(yè)務(wù)請求后,對該業(yè)務(wù)請求進行業(yè)務(wù)處理,得到業(yè)務(wù)處理結(jié)果。
[0219]具體的處理方式可以基于不同的業(yè)務(wù)應(yīng)用場景進行確定,例如,當(dāng)業(yè)務(wù)請求為Web請求時,可以解析Web請求中攜帶的URL地址,并通過從磁盤讀取文件等處理操作進行業(yè)務(wù)處理,在此不再進行詳細描述。
[0220]當(dāng)工作線程已與一個硬件核綁定時,工作線程由綁定的硬件核運行,并對業(yè)務(wù)請求進行業(yè)務(wù)處理,避免了該工作線程在多個硬件核之間的隨機調(diào)度,節(jié)省了調(diào)度工作線程所消耗的系統(tǒng)資源,并提高了處理效率。
[0221]步驟1007、該工作線程向多隊列網(wǎng)卡返回對該業(yè)務(wù)請求處理后得到的業(yè)務(wù)處理結(jié)果O
[0222]步驟1008、多隊列網(wǎng)卡將得到業(yè)務(wù)處理結(jié)果返回給對應(yīng)的客戶端,完成對該客戶端的業(yè)務(wù)請求的響應(yīng)。
[0223]采用本發(fā)明實施例2提供的上述業(yè)務(wù)請求處理方法,針對從一個網(wǎng)卡隊列中獲取的來自客戶端的業(yè)務(wù)請求,可以將該業(yè)務(wù)請求發(fā)送給與該網(wǎng)卡隊列綁定的監(jiān)聽線程,由該監(jiān)聽線程選擇與自身屬于同一進程的工作線程對該業(yè)務(wù)請求進行業(yè)務(wù)處理,相比現(xiàn)有技術(shù),避免了多個監(jiān)聽進程在請求獲取業(yè)務(wù)請求時對鎖的競爭,可以將網(wǎng)絡(luò)隊列中的業(yè)務(wù)請求直接發(fā)送給綁定的監(jiān)聽線程即可,從而提高了服務(wù)器對并發(fā)的業(yè)務(wù)請求的處理效率。
[0224]并且,進一步的,每個工作線程可以由綁定的硬件核運行,避免了多個硬件核對工作線程的調(diào)度,節(jié)省了系統(tǒng)資源的消耗,進一步提高了對并發(fā)的業(yè)務(wù)請求的處理效率。
[0225]實施例3:
[0226]基于同一發(fā)明構(gòu)思,根據(jù)本發(fā)明上述實施例提供的線程創(chuàng)建方法,相應(yīng)地,本發(fā)明實施例3還提供了一種線程創(chuàng)建裝置,應(yīng)用于具有多隊列網(wǎng)卡的服務(wù)器,所述多隊列網(wǎng)卡的網(wǎng)卡隊列中存儲來自客戶端的業(yè)務(wù)請求,其結(jié)構(gòu)示意圖如圖11所示,具體包括:
[0227]數(shù)量獲取單元1101,用于獲取所述服務(wù)器的所述多隊列網(wǎng)卡的網(wǎng)卡隊列數(shù);
[0228]進程創(chuàng)建單元1102,用于創(chuàng)建與所述網(wǎng)卡隊列數(shù)相等數(shù)量的進程;
[0229]線程創(chuàng)建單元1103,用于在每個進程中創(chuàng)建一個監(jiān)聽線程和多個工作線程;
[0230]綁定單元1104,用于將創(chuàng)建的每個監(jiān)聽線程分別與不同的網(wǎng)卡隊列綁定。
[0231]進一步的,所述服務(wù)器具有多硬件核處理器;
[0232]綁定單元1104,具體用于將創(chuàng)建的每個監(jiān)聽線程分別與所述多硬件核處理器中的不同的目標硬件核綁定,將所述多隊列網(wǎng)卡中的每個網(wǎng)卡隊列分別與所述目標硬件核中不同的硬件核綁定,從而實現(xiàn)創(chuàng)建的每個監(jiān)聽線程分別與不同的網(wǎng)卡隊列綁定;其中,所述目標硬件核為所述多硬件核處理器中用于綁定所述監(jiān)聽線程和所述網(wǎng)卡隊列的所有硬件核,所述網(wǎng)卡隊列的數(shù)量等于所述目標硬件核的數(shù)量。
[0233]進一步的,綁定單元1104,還用于將每個進程中創(chuàng)建的工作線程綁定一個硬件核。
[0234]進一步的,不同進程中創(chuàng)建的工作線程綁定的硬件核不同。
[0235]進一步的,線程創(chuàng)建單元1103,還用于當(dāng)所述服務(wù)器的多硬件核處理器的硬件核增加時,針對每個增加的硬件核,在一個進程中創(chuàng)建新的工作線程;
[0236]綁定單元1104,還用于將創(chuàng)建的新的工作線程與新增加的該硬件核綁定。
[0237]進一步的,進程創(chuàng)建單元1102,還用于當(dāng)所述服務(wù)器的多隊列網(wǎng)卡的網(wǎng)卡隊列增加時,針對每個增加的網(wǎng)卡隊列創(chuàng)建新進程;
[0238]線程創(chuàng)建單元1103,還用于在創(chuàng)建的新進程中創(chuàng)建監(jiān)聽線程和工作線程;
[0239]綁定單元1104,還用于將在新進程中創(chuàng)建的監(jiān)聽線程與新增加的該網(wǎng)卡隊列綁定。
[0240]進一步的,線程創(chuàng)建單元1103,還用于當(dāng)一個進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量小于第一預(yù)設(shè)數(shù)量閾值時,在該進程中創(chuàng)建新的工作線程;和/或
[0241]還用于當(dāng)一個進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量大于第二預(yù)設(shè)數(shù)量閾值時,在該進程中撤銷處于空閑狀態(tài)的工作線程,且撤銷后該進程中創(chuàng)建的工作線程中處于空閑狀態(tài)的工作線程的數(shù)量不大于第二預(yù)設(shè)數(shù)量閾值。
[0242]上述進程和線程的創(chuàng)建裝置中各單元的功能可對應(yīng)于圖2、圖3、圖6和圖7所示流程中的相應(yīng)處理步驟,在此不再贅述。
[0243]實施例4:
[0244]基于同一發(fā)明構(gòu)思,根據(jù)本發(fā)明上述實施例提供的應(yīng)用于多隊列網(wǎng)卡的業(yè)務(wù)請求處理方法,相應(yīng)地,本發(fā)明實施例4還提供了一種業(yè)務(wù)請求處理裝置,應(yīng)用于服務(wù)器的多隊列網(wǎng)卡,所述多隊列網(wǎng)卡的網(wǎng)卡隊列中存儲來自客戶端的業(yè)務(wù)請求,所述服務(wù)器上創(chuàng)建有與所述多隊列網(wǎng)卡的網(wǎng)卡隊列數(shù)相等數(shù)量的進程,且每個進程中創(chuàng)建有一個監(jiān)聽線程和多個工作線程,且創(chuàng)建的每個監(jiān)聽線程分別與不同的網(wǎng)卡隊列綁定,其結(jié)構(gòu)示意圖如圖12所示,具體包括:
[0245]業(yè)務(wù)請求獲取單元1201,用于從所述多隊列網(wǎng)卡的網(wǎng)卡隊列中獲取來自客戶端的業(yè)務(wù)請求;
[0246]第一發(fā)送單元1202,用于向與該網(wǎng)卡隊列綁定的監(jiān)聽線程發(fā)送所述業(yè)務(wù)請求;
[0247]接收單元1203,用于接收與該監(jiān)聽線程屬于同一進程的工作線程對所述業(yè)務(wù)請求進行業(yè)務(wù)處理后發(fā)送的業(yè)務(wù)處理結(jié)果;
[0248]第二發(fā)送單元1204,用于向所述客戶端返回所述業(yè)務(wù)處理結(jié)果。
[0249]進一步的,接收單元1203,還用于所述業(yè)務(wù)請求獲取單元1201在從所述多隊列網(wǎng)卡的網(wǎng)卡隊列中獲取來自客戶端的業(yè)務(wù)請求之前,接收已創(chuàng)建的各監(jiān)聽線程分別發(fā)送的業(yè)務(wù)請求獲取消息,所述業(yè)務(wù)請求獲取消息中攜帶監(jiān)聽線程綁定的網(wǎng)卡隊列的隊列標識;
[0250]所述裝置,還包括:
[0251]綁定關(guān)系確定單元1205,用于確定發(fā)送所述業(yè)務(wù)請求獲取消息的監(jiān)聽線程,與所述業(yè)務(wù)請求獲取消息中攜帶的所述隊列標識對應(yīng)的網(wǎng)卡隊列相綁定。
[0252]進一步的,服務(wù)器具有多硬件核處理器,創(chuàng)建的每個監(jiān)聽線程分別與所述多硬件核處理器中的不同的目標硬件核綁定,且所述多隊列網(wǎng)卡中的每個網(wǎng)卡隊列分別與所述目標硬件核中不同的硬件核綁定,從而實現(xiàn)創(chuàng)建的每個監(jiān)聽線程分別與不同的網(wǎng)卡隊列綁定;其中,所述目標硬件核為所述多硬件核處理器中用于綁定所述監(jiān)聽線程和所述網(wǎng)卡隊列的所有硬件核,所述網(wǎng)卡隊列的數(shù)量等于所述目標硬件核的數(shù)量;
[0253]第一發(fā)送單元1202,具體用于向與該網(wǎng)卡隊列綁定的目標硬件核上運行的監(jiān)聽線程發(fā)送所述業(yè)務(wù)請求。