程中連接數(shù)最少的進(jìn)程,并將該連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,獲取到新連接后,將可接收新連接的進(jìn)程與新連接建立連接,并將該可接收新連接的進(jìn)程標(biāo)記為不可接收新連接的進(jìn)程,實(shí)現(xiàn)了各組內(nèi)進(jìn)程不存在驚群影響,且每次選擇連接數(shù)最少的進(jìn)程作為可接收新連接的進(jìn)程,能均勻配置各進(jìn)程的連接數(shù),降低性能損耗,不會(huì)因進(jìn)程連接不均引起負(fù)載不均而導(dǎo)致處理器頻繁的調(diào)度額外增加中斷和上下文的切換。
[0053]進(jìn)一步的,在一個(gè)實(shí)施例中,在該獲取每組進(jìn)程中連接數(shù)最少的進(jìn)程的步驟之后,該多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法還包括:判斷每組進(jìn)程中連接數(shù)最少的進(jìn)程的連接數(shù)是否小于連接數(shù)閾值;若是,則將每組進(jìn)程中連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,若否,則當(dāng)前組內(nèi)進(jìn)程均標(biāo)記為不可接收新連接。
[0054]具體地,連接數(shù)閾值是指每個(gè)進(jìn)程能接收的最大連接,例如5、6等。若某組進(jìn)程中連接數(shù)最少的進(jìn)程的連接數(shù)不小于連接數(shù)閾值,其他進(jìn)程的連接數(shù)也不小于連接數(shù)閾值,則將當(dāng)前組內(nèi)進(jìn)程均標(biāo)記為不可接收新連接,等待某個(gè)進(jìn)程釋放了連接,可再對(duì)該組內(nèi)進(jìn)程進(jìn)行篩選出連接數(shù)最少的進(jìn)程。
[0055]進(jìn)一步的,在一個(gè)實(shí)施例中,上述多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法還包括:獲取每組進(jìn)程中連接數(shù)小于連接數(shù)閾值、連接數(shù)最少且最早建立連接的進(jìn)程,將該進(jìn)程標(biāo)記為可接收新連接的進(jìn)程。
[0056]具體地,獲取每組進(jìn)程中連接數(shù)小于連接數(shù)閾值的進(jìn)程,再?gòu)倪B接數(shù)小于連接數(shù)閾值的進(jìn)程中選擇連接數(shù)最少的進(jìn)程,若有多個(gè)連接數(shù)最少的進(jìn)程,則按照建立連接的時(shí)間順序選擇最早建立連接的進(jìn)程。進(jìn)一步的均衡了進(jìn)程的連接數(shù),降低了性能損耗。
[0057]圖4為傳統(tǒng)的Nginx對(duì)新連接的處理示意圖。如圖4所示,進(jìn)程有Pl、P2至Pn,新連接到來(lái)時(shí),持有鎖可處理新連接的進(jìn)程P3進(jìn)程一般正在處理已連接數(shù)據(jù)的收發(fā)邏輯,采用階段①標(biāo)識(shí);本次邏輯處理完后,開(kāi)始接收新連接請(qǐng)求I,采用階段②標(biāo)識(shí),對(duì)于新連接請(qǐng)求2,必須等下一次獲得鎖的進(jìn)程來(lái)接收,采用階段③標(biāo)識(shí),如果每個(gè)進(jìn)程比較繁忙,特別是有阻塞操作時(shí),新連接事件需要等長(zhǎng)時(shí)間的本次業(yè)務(wù)邏輯處理完畢才能處理,所以等待建立的時(shí)間可能更長(zhǎng)甚至超時(shí),影響了用戶體驗(yàn)及吞吐量。
[0058]圖5為本發(fā)明的多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法對(duì)新連接的處理示意圖。如圖5所示,多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法配置進(jìn)程有Pl、P2至Pn,多個(gè)分組,例如分組I包括Pl、P2和P3,分組2包括P4、P5和P6等。每個(gè)分組內(nèi)有一個(gè)進(jìn)程接收連接,多個(gè)分組就有多個(gè)進(jìn)程并發(fā)接收連接。如在組I和組2中,只有當(dāng)前P2和P5進(jìn)程可接收新連接。在時(shí)間分布上,各進(jìn)程大部分情況在處理已連接的數(shù)據(jù)收發(fā)等業(yè)務(wù)邏輯,在圖中標(biāo)識(shí)為階段①,本次處理完畢后P2接收新連接I,同樣P5接收新連接2,如此新連接2不用等下一個(gè)分配了可接收的進(jìn)程來(lái)建立連接。尤其在高并發(fā)壓力下,盡快的建立連接,能提高系統(tǒng)的吞吐量。
[0059]圖6為另一個(gè)實(shí)施例中多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法的流程圖。如圖6所示,一種多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法,包括以下步驟:
[0060]步驟602,進(jìn)程初始化。
[0061]具體地,進(jìn)程初始化是指將進(jìn)程分組,得到每組進(jìn)程數(shù),并為每組進(jìn)程中每個(gè)進(jìn)程進(jìn)行標(biāo)號(hào),以表示進(jìn)程的唯一性。例如標(biāo)號(hào)為1、2、3等。
[0062]步驟604,判斷當(dāng)前進(jìn)程是否可接收新連接,若是,執(zhí)行步驟606,若否,執(zhí)行步驟618。
[0063]步驟606,監(jiān)聽(tīng)新連接。
[0064]步驟608,判斷是否有新連接,若是,執(zhí)行步驟610,若否,執(zhí)行步驟618。
[0065]步驟610,獲取新連接,將該標(biāo)記為可接收新連接的進(jìn)程與該新連接建立連接,且增加本進(jìn)程的連接數(shù),并將該本進(jìn)程標(biāo)記為不可接收新連接。
[0066]步驟612,組內(nèi)是否存在連接數(shù)小于連接數(shù)閾值且連接數(shù)最少的進(jìn)程,若是,執(zhí)行步驟614,若否,執(zhí)行步驟616。
[0067]步驟614,將連接數(shù)小于連接數(shù)閾值且連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,再執(zhí)行步驟618。
[0068]步驟616,當(dāng)前組內(nèi)進(jìn)程均標(biāo)記為不可接收新連接,再執(zhí)行步驟618。
[0069]具體地,將連接數(shù)小于連接數(shù)閾值且連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程后或當(dāng)前組內(nèi)進(jìn)程均標(biāo)記為不可接收新連接后,等待Epoll通知,進(jìn)行下一次處理。
[0070]Epol I是Linux內(nèi)核為處理大批量文件描述符事件(建立連接、收發(fā)數(shù)據(jù)等)提供的多路復(fù)用10(Input/0utput,輸入/輸出)接口,能顯著提高程序在大量并發(fā)連接中只有少量活躍的情況下的系統(tǒng)(PU利用率,被大量高性能異步服務(wù)器所采用。
[0071]步驟618,處理已連接數(shù)據(jù)的收發(fā),然后執(zhí)行步驟604。
[0072]步驟620,檢測(cè)每組進(jìn)程中是否有進(jìn)程釋放連接,若是,則執(zhí)行步驟622,若否,不作處理。
[0073]步驟622,減少釋放連接的進(jìn)程的連接數(shù),再執(zhí)行步驟612。
[0074]上述多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法,將設(shè)備的進(jìn)程分成多個(gè)組,每次獲取每組進(jìn)程中連接數(shù)最少的進(jìn)程,并將該連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,獲取到新連接后,將可接收新連接的進(jìn)程與新連接建立連接,并將該可接收新連接的進(jìn)程標(biāo)記為不可接收新連接的進(jìn)程,實(shí)現(xiàn)了各組內(nèi)進(jìn)程不存在驚群影響,且每次選擇連接數(shù)最少的進(jìn)程作為可接收新連接的進(jìn)程,能均勻配置各進(jìn)程的連接數(shù),降低性能損耗,不會(huì)因進(jìn)程連接不均引起負(fù)載不均而導(dǎo)致處理器頻繁的調(diào)度額外增加中斷和上下文的切換。
[0075]進(jìn)一步的,將該每組進(jìn)程中連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程的步驟之后,該多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法還包括:該標(biāo)記為可接收新連接的進(jìn)程處理已連接數(shù)據(jù)的收發(fā);在本次數(shù)據(jù)的收發(fā)處理完畢后,判斷該標(biāo)記為可接收新連接的進(jìn)程是否可接收新連接,若是,則監(jiān)聽(tīng)新連接,若否,則繼續(xù)處理已連接數(shù)據(jù)的收發(fā)。
[0076]在一個(gè)實(shí)施例中,上述多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接方法還包括:將每組進(jìn)程中的各個(gè)進(jìn)程的連接數(shù)在各進(jìn)程間通過(guò)內(nèi)存共享。
[0077]通過(guò)將各個(gè)進(jìn)程的連接數(shù)在各進(jìn)程間通過(guò)內(nèi)存共享,可方便各進(jìn)程間進(jìn)行通信。
[0078]圖7為一個(gè)實(shí)施例中多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接系統(tǒng)的結(jié)構(gòu)框圖。如圖7所示,一種多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接系統(tǒng),包括分組模塊702、第一獲取模塊704、標(biāo)記模塊706、第二獲取模塊708、建立模塊710和計(jì)數(shù)模塊712。其中:
[0079]分組模塊702用于按照配置的組數(shù)及總進(jìn)程數(shù)對(duì)進(jìn)程進(jìn)行分組得到每組的進(jìn)程數(shù)。
[0080]具體地,組數(shù)和總進(jìn)程數(shù)可根據(jù)設(shè)備的處理能力及業(yè)務(wù)邏輯繁忙、阻塞情況進(jìn)行確定。通常,組數(shù)應(yīng)該盡可能少,以最大程序降低驚群的影響。但在業(yè)務(wù)邏輯繁忙、阻塞處理多時(shí),根據(jù)情況提高分組的組數(shù),提高對(duì)連接的響應(yīng)速度。總進(jìn)程數(shù)為N,組數(shù)為M,則每組的進(jìn)程數(shù)為K = N/M。
[0081]第一獲取模塊704用于根據(jù)每組的進(jìn)程數(shù)獲取每組進(jìn)程中連接數(shù)最少的進(jìn)程。
[0082]具體地,獲取每組進(jìn)程中各個(gè)進(jìn)程的連接數(shù),再比較各個(gè)進(jìn)程的連接數(shù),得到連接數(shù)最少的進(jìn)程。
[0083]標(biāo)記模塊706用于將該每組進(jìn)程中連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程。
[0084]具體地,將各組進(jìn)程中連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,方便新連接到來(lái)時(shí),進(jìn)行接收新連接,避免組內(nèi)進(jìn)程競(jìng)爭(zhēng)。標(biāo)記可采用任意方式,如采用“I”標(biāo)記為可接收新連接等,不限于此。
[0085]第二獲取模塊708用于獲取新連接。
[0086]建立模塊710用于將該標(biāo)記為可接收新連接的進(jìn)程與該新連接建立連接。
[0087]計(jì)數(shù)模塊712用于增加本進(jìn)程的連接數(shù)。
[0088]具體地,標(biāo)記為可接收新連接的進(jìn)程與該新連接建立連接后,本進(jìn)程的連接數(shù)增加I。將該本進(jìn)程標(biāo)記為不可接收新連接,開(kāi)始在本進(jìn)程所在組內(nèi)再獲取連接數(shù)最少的進(jìn)程。
[0089]標(biāo)記模塊706還用于將該本進(jìn)程標(biāo)記為不可接收新連接。
[0090]第一獲取模塊704還用于在再該標(biāo)記模塊706將該本進(jìn)程標(biāo)記為不可接收新連接之后,再獲取每組進(jìn)程中連接數(shù)最少的進(jìn)程,以及該標(biāo)記模塊706再將該每組中連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程。
[0091]上述多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接系統(tǒng),將設(shè)備的進(jìn)程分成多個(gè)組,每次獲取每組進(jìn)程中連接數(shù)最少的進(jìn)程,并將該連接數(shù)最少的進(jìn)程標(biāo)記為可接收新連接的進(jìn)程,獲取到新連接后,將可接收新連接的進(jìn)程與新連接建立連接,并將該可接收新連接的進(jìn)程標(biāo)記為不可接收新連接的進(jìn)程,實(shí)現(xiàn)了各組內(nèi)進(jìn)程不存在驚群影響,且每次選擇連接數(shù)最少的進(jìn)程作為可接收新連接的進(jìn)程,能均勻配置各進(jìn)程的連接數(shù),降低性能損耗,不會(huì)因進(jìn)程連接不均引起負(fù)載不均而導(dǎo)致處理器頻繁的調(diào)度額外增加中斷和上下文的切換。
[0092]圖8為另一個(gè)實(shí)施例中多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接系統(tǒng)的結(jié)構(gòu)框圖。如圖8所示,一種多進(jìn)程設(shè)備的網(wǎng)絡(luò)連接系統(tǒng),除了包括分組模塊702、第一獲取模塊704、標(biāo)記模塊706、第二獲取模塊708、建立模塊710和計(jì)數(shù)模塊712,還包括判斷模塊714。其中:
[0093]判斷模塊714用于在該第一獲取模塊704獲取每組進(jìn)程中連接