專利名稱:一種多線程網絡負載控制方法
技術領域:
本發明涉及互聯網技術,特別是涉及網絡應用過負荷保護的實現。
背景技術:
隨著互聯網的普及,WEB (網絡,環球網)應用越來越成為電信運營商 向廣大用戶提供服務的重要的形式。各種各樣的游戲、音樂、手機主題的下 載就是很好的例子。在實際的運營中,WEB應用面對的是數量龐大的用戶群, 這樣帶來的后果是,巨大的服務壓力和用戶訪問的不確定性。盡管有各種各 樣的服務器端的軟件的和硬件的方案,比如分布式處理、負載平衡、應用集 群、緩存等等,可以用來提高WEB應用響應用戶請求的能力,但是應用這些 方案帶來的成本需要能夠和實際獲得的效益成正比。從運營商的角度來說, 希望能夠使用較少的硬件投入,為盡量多的用戶提供穩定可靠的服務;從用 戶的角度分析,訪問WEB應用有很大的不確定性。簡單的說,就是用戶單位 時間的訪問量在不同的時間有相當大的波動。那么,在系統設計的時候,就 不能僅僅從最大可能的用戶訪問數出發設計系統的軟硬件方案,否則的話, 在大部分的時間里,系統的處理能力將處于閑置狀態。另一方面、又必須有 相應的措施應對在短時間內大用戶訪問數帶來的對系統處理能力的壓力。
一般來說,將系統應對超過其基本處理能力的訪問請求的方法稱為過負 荷保護。這種過負荷保護方案要達到的目的有三個首先是能夠及時的判斷 出系統處于過負荷狀態,或者是處于正常狀態,也就是根據一些預定的指標 和當前的統計信息的比較對系統狀態進行遷移。第二個目的是能夠平滑用戶 的請求,對于系統暫時沒有能力及時處理的請求,能夠在合理的等待后再進 行處理,或者能夠通知用戶系統目前正處于忙碌狀態。其主要防止的是出現 系統崩潰的現象,也要避免由于很多的用戶競爭系統資源造成系統對所有用 戶的響應都超出合理的時間范圍。另一個很重要的問題是能夠在系統處于忙 碌狀態時,能夠及時的將這個信息記錄下來并通知給管理人員,使得他們可
以盡早的進行干預,避免系統陷入惡性循環。尤其是后一項功能對于電信運 營商保證系統的穩定可靠是非常重要的。
由于目前WEB應用大多是搭建在一定的容器之上的,而這些容器一般都 用流量控制的功能,所以最簡單的過負荷保護措施就是直接利用容器的流量 控制功能。容器提供的流量控制功能盡管能夠提供上面提到的三個功能中第 一個和第二個功能,但是它所提供的通常是通用的,和業務無關的保護功能, 不能針對業務的特點進行定制,使得對各種不同的請求不能區別對待。另外, 這種方法所能夠使用的判別系統狀態的指標是很有限的, 一般都是根據用戶 的連接數來判斷,不能根據系統當前的CPU占用率、內存占用率等其他信息 綜合判斷系統是否需要進入過負荷保護狀態。使用容器提供的流量控制功能 的另一個缺點是不能使用集成在系統中的告警和日志功能。
發明內容
本發明所要解決的技術問題是提供一種多線程網絡負載控制方法,解 決現有過負荷控制技術不能針對業務的特點進行定制,不能區別對待各種不 同請求的技術問題。
為達到上述目的,本發明提供了一種多線程網絡負載控制方法,其特
點在于,包括如下步驟
步驟一,將實時統計得出的系統統計信息和預設的指標進行比較來判斷 系統的過負荷狀態,在系統處于過負荷狀態時將系統暫時不能處理的線程作 預定時間的掛起處理,并在一個有限容量的先進先出隊列中保存所述被掛起 線程對應的鎖對象;
步驟二,另一個正常處理完成的線程從所述先進先出隊列中取出未超過 所述預定時間的被掛起線程對應的鎖對象,并喚醒處于等待狀態的所述被掛
起線程;
步驟三,如果所述被掛起線程在所述預定時間內沒有被喚醒,則在超過 所述預定時間后結束所述被掛起線程。
上述的方法,其特點在于,還包括步驟四設置一個定時器,所述定時 器以固定的時間間隔檢査系統的狀態并判斷是否需要進行告警處理。
上述的方法,其特點在于,在所述步驟一中,根據在線處理的線程數、
CPU占用率和/或內存占用率來確定所述預設的指標。
上述的方法,其特點在于,所述步驟一進一步包括
步驟a,在系統中設置一個狀態標志來保存系統的狀態,系統的狀態包 括正常狀態和過負荷狀態;
步驟b,在系統中設置一種鎖對象,鎖對象中有兩個布爾類型的屬性, 分別是用來表示線程是否已經處理完成的結束標志和用來表示線程是否已 經超時的超時標志,并在系統中設置一個容量有限的先進先出隊列用于保存 所述鎖對象;
步驟c,當系統新收到一個用戶請求時,由一個處理線程來處理這個請 求,該處理線程首先根據所述狀態標志來判斷系統狀態,如果系統處于正常 狀態,則對系統的統計信息進行累加計算,并將所述統計信息和系統預設的 指標進行比較,以確定系統下一步的狀態;
步驟d,如果系統已經處于過負荷狀態,則首先判斷先進先出隊列是否 已滿,是則結束當前的處理線程,向用戶返回出錯信息;否則,創建一個鎖 對象,所述鎖對象的結束標志設置為假、超時標志設置為真,并將所述鎖對 象加入到先進先出隊列中,將當前處理線程暫時掛起一個預設的時間。
上述的方法,其特點在于,所述步驟二進一步包括當系統中另一個處 理線程處理完一個請求的時候,首先對系統的統計信息進行遞減運算,并將 所述統計信息和系統預設的指標進行比較,以確定系統下一步的狀態;然后 判斷先進先出隊列是否不為空,是則取出第一個處理結束標志為假的鎖對 象,并將這個鎖對象的超時標志設為真,并喚醒這個鎖對象對應的處理線程。
上述的方法,其特點在于,所述步驟三進一步包括當等待的線程被喚 醒或者由于等待超時而繼續運行時,首先設置鎖對象的結束標志為真,并判 斷鎖對象的超時標志是否為真,是則結束當前處理線程并向用戶返回出錯信 息;否則對系統的統計信息進行累加計算,并將統計信息和系統預設的指標 進行比較,以確定系統下一步的狀態。
上述的方法,其特點在于,所述過負荷狀態進一步分為多種級別。
上述的方法,其特點在于,所述先進先出隊列能進行如下操作判斷隊 列是否為空、判斷隊列是否已滿、加入一個對象到隊列尾、從隊列頭取出一 個對象;所述各操作對于不同的線程是串行的,只有前一個線程對隊列的操
作完成之后,下一個操作才能夠開始。
上述的方法,其特點在于,所述步驟四進一步包括所述定時器以固定 的時間間隔檢査系統的狀態,如果系統處于和前一次定時器運行時不同的狀 態,并且該狀態是過負荷狀態,則進行告警處理,如果該狀態是正常狀態, 則進行告警恢復處理。
本發明的技術效果在于
同現有的流量控制技術相比較,本發明具有能夠為多線程的WEB應用提 供定制的過負荷保護的功能,并且具有實現簡單,對業務流程影響小等特點。
圖1是本發明提供的一個線程處理新的用戶請求時負載控制流程圖; 圖2是本發明提供的一個線程處理用戶請求結束時調用負載控制功能流 程圖3是本發明提供的一個處于等待狀態的處理線程被喚醒或者等待超時 之后的處理流程圖。
具體實施例方式
下面結合附圖進一步詳細說明本發明的具體實施例。
由于WEB應用都是使用多線程來處理用戶的請求,那么在進行過負荷保 護時只要使這些處理線程暫時中止執行,直到系統處理完其他的請求時再加 以喚醒,就可以起到平滑系統負載的效果。本發明過負荷負載控制的實現方 法的基本工作原理是根據實時統計得出的值和預設的指標進行比較來判斷 系統的過負荷狀態,在系統處于過負荷狀態時將系統暫時不能處理的線程作 掛起處理,并在一個先進先出隊列中保存其對應的鎖對象,另一個正常處理 完成的線程會從先進先出隊列中取出鎖對象,并喚醒處于等待狀態的那個線 程。
圖1是本發明提供的一個線程處理新的用戶請求時負載控制流程圖;如 圖所示,具體包括如下步驟
步驟IOI,處理線程準備處理新的用戶請求;
步驟102,判斷系統是否處于正常狀態,是則執行步驟108,否則執行 步驟103;
步驟103,判斷先進先出隊列是否已滿,是則執行步驟104,否則執行 步驟105;
步驟104,通知用戶,處理結束。
步驟105,創建鎖對象,結束標志設置為假,超時標志設置為真;
步驟106,鎖對象加入到先進先出隊列中; 步驟107,處理線程掛起一個預設的時間。
步驟108,上接步驟102,計算統計值并和預設指標進行比較,確定系 統下一步的狀態;
步驟109,正常處理開始。
圖2是本發明提供的一個線程處理用戶請求結束時調用負載控制功能流 程圖,如圖所示,具體包括如下步驟
步驟201,處理線程結束處理一個用戶請求;
步驟202,計算統計值并和預設指標進行比較,確定系統下一步的狀態; 步驟203,判斷隊列是否為空,是則執行步驟210,否則執行步驟204; 步驟204,取出隊列頭中的鎖對象;
步驟205,判斷對象是否已經設置為處理結束,是則執行步驟206,否 則執行步驟208;
步驟206,判斷隊列是否為空,是則執行步驟210,否則執行步驟207; 步驟207,取出隊列頭中的鎖對象,返回步驟205; 步驟208,設置對象超時標志為真; 步驟209,喚醒等待在鎖對象上的處理線程; 步驟210,正常處理結束。
圖3是本發明提供的一個處于等待狀態的處理線程被喚醒或者等待超時 之后的處理流程圖,如圖所示,具體包括如下步驟-步驟301,處理線程被喚醒或者等待超時; 步驟302,設置鎖對象的結束標志為真;
步驟303,判斷鎖對象的結束標志是否為真,是則執行步驟304,否則 執行步驟305;
步驟304,通知用戶,處理結束。
步驟305,計算統計值并和預設指標進行比較,確定系統下一步的狀態; 步驟306,正常處理開始。。
從附圖1來看,描述了當一個新的用戶請求到達時基本處理流程,其中 已經涉及到系統狀態、鎖對象(結束標志和超時標志)、鎖對象隊列、處理 線程掛起這些本發明中的主要內容。假如一個請求到達時,被加入到等待隊 列中,那么它將在何時被喚醒呢?從附圖2中就可以得到答案,當一個正常 處理的線程處理結束時,會不斷地從等待隊列中移出鎖對象,直到找到一個 還沒有超時的鎖對象,并喚醒等待在這個對象上的處理線程。還有一種情況 就是,等待的線程并不是被正常喚醒的,而是由于等待超時而進入下一步流 程,這在附圖3中得到了描述。和前兩個附圖相對應地,這里的處理就是針 對鎖對象中的標志,保證前兩個流程中對標志的判斷是合理的。在這三個流 程中,都涉及到計算統計值并確定系統的下一步狀態,這個狀態將用于附圖 1中的判斷,因此可以看出,三個附圖中說明的處理流程是相互配合的,可 以正確完成本發明所要實現的過負荷保護功能。
系統中表示狀態可以使用一個整形值變量。基本的狀態可以使用預定義 的常量來表示, 一般預定義的狀態有正常狀態和過負荷狀態,當然,還可以 對過負荷狀態進行細分,比如定義一級過負荷、二級過負荷,等等。不過預 設的系統指標需要和狀態定義保持一致,比如,定義了兩級過負荷,就需要 針對一個統計值定義兩個門限指標。
系統中使用的判斷過負荷的統計指標一般可以使用在線處理數,還可以 用CPU占用率和內存占用率來加以輔助。還可以擴展其他的指標,這取決于
應用的實際需要。
這里要說明的是,系統中設置的先進先出隊列的長度是有限的。這主要 是考慮到先進先出隊列中保存的每一個對象都對應于處于等待狀態的一個 處理線程。線程數量增加會帶來系統調度壓力的增大,所以在實際的系統中, 總的線程數量是有限的,所以先進先出隊列的長度也是有限的。 一般在實現 中,隊列通常可以用數組來實現,用一個頭標志和尾標志來保存隊列起始元 素和結束元素對應的數組單元的下標。這個數組的長度就對應于隊列的最大 長度,而這個數組可以在系統啟動時就一次創建完畢,在其他的運行期間其 長度不再改變;另一種方式是在系統啟動時只創建一定數量數組單元,需要
時才擴展數組的長度,直到預設的最大長度,不過在每次擴展時不會只擴展 一個單元,這樣效率太低,而是使用一個系數乘以當前的數組長度來確定擴 展后的數組長度。
之所以使用鎖對象,是因為在實現線程掛起時一般使用等待在某一個對
象的Monitor(監控器)上的技術。這樣在另一個線程喚醒等待線程時,就是 對這個對象的Monitor進行操作,觸發操作系統或者虛擬機的調度。不過, 在掛起線程時需要注意的是必須設置掛起時間,而不能是無限期的掛起,否 則的話,系統中可能出現過多的等待線程, 一旦總的線程數超過系統的運行 上限,系統將處于死鎖狀態,不能夠再為新的用戶請求提供服務。這個最大 掛起時間應該由系統預先配置。
本負載控制方法中使用定時器線程來處理告警和告警恢復等處理。定時 器線程的超時間隔時間可以通過預配置的方式設定,其值不宜太小,比如可 以設為5秒或者10秒。這樣, 一來對系統的性能壓力比較小,畢竟在每次 發送告警信息時業需要占用系統計算資源,何況這時系統可能處于過負荷的 狀態,二來也可以滿足通知管理人員的需要。
使用本發明中所述的負載控制方法時,需要注意要在系統啟動時初始化 配置信息和各種標志,以及定時器和先進先出隊列。在系統關閉時需要關閉 定時器,釋放分配的資源,還要檢査隊列中是否還有處于等待狀態的處理線 程,并且喚醒這些線程。
下面分別介紹本發明的六個實施例。
第一實施例
假設當前系統處于正常狀態。
當系統新收到一個用戶請求時,將由一個處理線程來處理這個請求。該 處理線程首先判斷系統狀態,如果系統處于正常狀態,則對系統的統計信息 進行累加計算,比如當前增加的連接數,同時和系統預設的指標進行比較, 以確定系統下一步的狀態。這時可能還要把當前的CPU占用率或者內存占用 率和相應的輔助指標進行比較來判斷系統的下一步狀態。
下一步,處理線程將繼續處理這個請求。
第二實施例
假設當前系統處于過負荷狀態,并且隊列未滿。
當系統新收到一個用戶請求時,將由一個處理線程來處理這個請求。該 處理線程首先判斷系統狀態,如果系統己經處于過負荷狀態,則繼續判斷先 進先出隊列是否已滿。如果未滿的話,就創建一個鎖對象(結束標志設置為 假、超時標志設置為真),并將這個對象加入到先進先出隊列中,并將當前 處理線程暫時掛起一個預設的時間。實際就是等待在這個鎖對象對象的
Monitor上。在掛起線程時需要注意的是必須設置掛起時間,而不能是無限 期的掛起。
第三實施例
假設當前系統處于過負荷狀態,并且隊列已滿。
當系統新收到一個用戶請求時,將由一個處理線程來處理這個請求。該 處理線程首先判斷系統狀態,如果系統己經處于過負荷狀態,則繼續判斷先 進先出隊列是否已滿。如果已滿的話,就結束當前的處理線程,向用戶返回 出錯信息。這樣可以避免系統中出現太多的等待線程。
第四實施例
一個處理線程正常處理結束。
當系統中一個處理線程處理完一個請求的時候,需要進行負載控制操 作。操作步驟是這樣的
首先對系統的統計信息進行遞減運算,比如減少當前的連接數,詞時和 系統預設的指標進行比較,以確定系統下一步的狀態。這時可能還要把當前 的CPU占用率或者內存占用率和相應的輔助指標進行比較來判斷系統的下一 步狀態。
然后判斷當前先進先出隊列是否不為空,如果是的話,取出第一個處理 結束標志為假的鎖對象,也就是說,這里要避免處理己經處于結束狀態的鎖 對象,因為,它對應的處理線程已經超時退出了。如果一直取到隊列為空時 還沒有這樣的對象的話,本處理流程將結束。如果找到的話,就將這個鎖對 象的超時標志設為真,并喚醒這個鎖對象對應的處理線程;
第五實施例
假設一個等待的處理線程沒有被喚醒,而是超時了。 當一個處于等待狀態的線程由于等待超時而繼續運行時,會首先設置鎖 對象的結束標志為真(這樣其他的線程處理結束時從隊列中取出的該鎖對象
將被丟棄),并判斷鎖對象的超時標志,由于這時還沒有其他線程對其進行 喚醒操作,所以其標志還是初始值,為真,這時就需要結束當前處理線程并 向用戶返回出錯信息。 第六實施例
假設一個等待的處理線程沒有超時,而是被其他線程喚醒了。
當一個處于等待狀態的線程被其他線程喚醒而繼續運行時,會首先設置 鎖對象的結束標志為真,并判斷鎖對象的超時標志,由于該線程是被其他線 程所喚醒,所以超時標志已經被設置為假,所以下一步可以繼續執行。
這時需要對系統的統計信息進行累加計算,比如當前增加的連接數,同 時和系統預設的指標進行比較,以確定系統下一步的狀態;這時可能還要把 當前的CPU占用率或者內存占用率和相應的輔助指標進行比較來判斷系統的 下一步狀態。
下一步,處理線程將繼續處理這個請求。
以上所述僅為本發明的較佳實施例,并非用來限定本發明的實施范圍; 凡是依本發明所作的等效變化與修改,都被本發明的專利范圍所涵蓋。
權利要求
1、一種多線程網絡負載控制方法,其特征在于,包括如下步驟步驟一,將實時統計得出的系統統計信息和預設的指標進行比較來判斷系統的過負荷狀態,在系統處于過負荷狀態時將系統暫時不能處理的線程作預定時間的掛起處理,并在一個有限容量的先進先出隊列中保存所述被掛起線程對應的鎖對象;步驟二,另一個正常處理完成的線程從所述先進先出隊列中取出未超過所述預定時間的被掛起線程對應的鎖對象,并喚醒處于等待狀態的所述被掛起線程;步驟三,如果所述被掛起線程在所述預定時間內沒有被喚醒,則在超過所述預定時間后結束所述被掛起線程。
2、 根據權利要求1所述的方法,其特征在于,還包括步驟四設置一 個定時器,所述定時器以固定的時間間隔檢査系統的狀態并判斷是否需要進 行告警處理。
3、 根據權利要求1所述的方法,其特征在于,在所述步驟一中,根據 在線處理的線程數、CPU占用率和/或內存占用率來確定所述預設的指標。
4、 根據權利要求1所述的方法,其特征在于,所述步驟一進一步包括-步驟a,在系統中設置一個狀態標志來保存系統的狀態,系統的狀態包括正常狀態和過負荷狀態;步驟b,在系統中設置一種鎖對象,鎖對象中有兩個布爾類型的屬性, 分別是用來表示線程是否已經處理完成的結束標志和用來表示線程是否己 經超時的超時標志,并在系統中設置一個容量有限的先進先出隊列用于保存 所述鎖對象;步驟c,當系統新收到一個用戶請求時,由一個處理線程來處理這個請 求,該處理線程首先根據所述狀態標志來判斷系統狀態,如果系統處于正常 狀態,則對系統的統計信息進行累加計算,并將所述統計信息和系統預設的 指標進行比較,以確定系統下一步的狀態;步驟d,如果系統已經處于過負荷狀態,則首先判斷先進先出隊列是否 已滿,是則結束當前的處理線程,向用戶返回出錯信息;否則,創建一個鎖 對象,所述鎖對象的結束標志設置為假、超時標志設置為真,并將所述鎖對 象加入到先進先出隊列中,將當前處理線程暫時掛起一個預設的時間。
5、 根據權利要求4所述的方法,其特征在于,所述步驟二進一步包括: 當系統中另一個處理線程處理完一個請求的時候,首先對系統的統計信息進 行遞減運算,并將所述統計信息和系統預設的指標進行比較,以確定系統下 一步的狀態;然后判斷先進先出隊列是否不為空,是則取出第一個處理結束 標志為假的鎖對象,并將這個鎖對象的超時標志設為真,并喚醒這個鎖對象 對應的處理線程。
6、 根據權利要求5所述的方法,其特征在于,所述步驟三進一步包括 當等待的線程被喚醒或者由于等待超時而繼續運行吋,首先設置鎖對象的結 束標志為真,并判斷鎖對象的超時標志是否為真,是則結束當前處理線程并 向用戶返回出錯信息;否則對系統的統計信息進行累加計算,并將統計信息 和系統預設的指標進行比較,以確定系統下一步的狀態。
7、 根據權利要求1所述的方法,其特征在于,所述過負荷狀態進一步 分為多種級別。
8、 根據權利要求1所述的方法,其特征在于,所述先進先出隊列能進 行如下操作判斷隊列是否為空、判斷隊列是否己滿、加入一個對象到隊列 尾、從隊列頭取出一個對象;所述各操作對于不同的線程是串行的,只有前 一個線程對隊列的操作完成之后,下一個操作才能夠開始。
9、 根據權利要求2所述的方法,其特征在于,所述步驟四進一步包括: 所述定時器以固定的時間間隔檢査系統的狀態,如果系統處于和前一次定時 器運行時不同的狀態,并且該狀態是過負荷狀態,則進行告警處理,如果該 狀態是正常狀態,則進行告警恢復處理。
全文摘要
本發明公開了一種多線程網絡負載控制方法,包括將實時統計得出的系統統計信息和預設的指標進行比較來判斷系統的過負荷狀態,在系統處于過負荷狀態時將系統暫時不能處理的線程作預定時間的掛起處理,并在一個有限容量的先進先出隊列中保存所述被掛起線程對應的鎖對象;另一個正常處理完成的線程從所述先進先出隊列中取出未超過所述預定時間的被掛起線程對應的鎖對象,并喚醒處于等待狀態的所述被掛起線程;如果所述被掛起線程在所述預定時間內沒有被喚醒,則在超過所述預定時間后結束所述被掛起線程。本發明具有能夠為多線程的網絡應用提供定制的過負荷保護的功能,并且具有實現簡單,對業務流程影響小等特點。
文檔編號H04L12/24GK101114984SQ20061008897
公開日2008年1月30日 申請日期2006年7月27日 優先權日2006年7月27日
發明者良 單, 吉 呂, 唐鯤鵬 申請人:中興通訊股份有限公司