將內(nèi)存耗盡處理流程卸載到用戶空間的方法和裝置的制造方法
【專利摘要】本申請公開了將內(nèi)存耗盡處理流程卸載到用戶空間的方法和裝置。所述方法的一【具體實施方式】包括:當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面;所述用戶空間的內(nèi)存耗盡服務(wù)進程通過所述內(nèi)存頁面獲取所述內(nèi)存耗盡事件的相關(guān)信息;所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。該實施方式實現(xiàn)了將內(nèi)核態(tài)的內(nèi)存耗盡處理卸載到用戶態(tài)執(zhí)行,將整個內(nèi)存耗盡處理過程交由一個用戶態(tài)進程來完成,降低內(nèi)存耗盡處理執(zhí)行的復(fù)雜度,也易于內(nèi)存耗盡處理策略的調(diào)整及業(yè)務(wù)的升級替換。
【專利說明】
將內(nèi)存耗盡處理流程卸載到用戶空間的方法和裝置
技術(shù)領(lǐng)域
[0001]本申請涉及計算機技術(shù)領(lǐng)域,具體涉及計算機操作系統(tǒng)技術(shù)領(lǐng)域,尤其涉及將內(nèi)存耗盡處理流程卸載到用戶空間的方法和裝置。
【背景技術(shù)】
[0002]計算機在大壓力高負載的情況下,為提高機器的資源利用率,會經(jīng)常出現(xiàn)將機器的物理內(nèi)存耗盡的情況,進而頻繁觸發(fā)00M(out of memory,內(nèi)存耗盡)處理。內(nèi)核的OOM處理成為降低系統(tǒng)內(nèi)存壓力的最后一道屏障。標(biāo)準(zhǔn)內(nèi)核的OOM處理的執(zhí)行也因使用情景的變化而變的復(fù)雜,大壓力及負載下在內(nèi)核態(tài)執(zhí)行過程也顯得過于冗長,且長時間在操作系統(tǒng)內(nèi)核態(tài)處理易引起系統(tǒng)死鎖而導(dǎo)致系統(tǒng)宕機等問題,降低了服務(wù)的穩(wěn)定性及可用性。
[0003]另一方面,隨著使用場景的變化,業(yè)務(wù)層面對OOM處理的策略也會有一些更多的需求,當(dāng)內(nèi)存超限后,提出了一些新的挑選結(jié)束進程的策略,比如優(yōu)先結(jié)束低優(yōu)先級類型的作業(yè)等。這些策略變更會使OOM處理邏輯更加的復(fù)雜,OOM處理過程越發(fā)的耗時,并且在內(nèi)核中實現(xiàn)這些策略給業(yè)務(wù)的升級和部署也帶來了一定的困難。
【發(fā)明內(nèi)容】
[0004]本申請的目的在于提出一種將內(nèi)存耗盡處理流程卸載到用戶空間的方法和裝置,來解決以上【背景技術(shù)】部分提到的技術(shù)問題。
[0005]第一方面,本申請?zhí)峁┝艘环N將內(nèi)存耗盡處理流程卸載到用戶空間的方法,所述方法包括:當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑;所述用戶空間的內(nèi)存耗盡服務(wù)進程通過所述內(nèi)存頁面獲取所述內(nèi)存耗盡事件的相關(guān)信息;所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。
[0006]在一些實施例中,所述方法還包括:將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將所述觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上;在內(nèi)存耗盡事件處理完成后喚醒所述等待隊列上的所述觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。
[0007]在一些實施例中,所述方法還包括:在將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面之后通知所述用戶空間的內(nèi)存耗盡服務(wù)進程。
[0008]在一些實施例中,所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件,包括:所述用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分;所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程ig號。
[0009]在一些實施例中,所述用戶空間的內(nèi)存耗盡服務(wù)進程不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。
[0010]在一些實施例中,所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件還包括:所述用戶空間的內(nèi)存耗盡服務(wù)進程向所述內(nèi)核空間發(fā)送內(nèi)存耗盡事件處理完成的通知。
[0011]在一些實施例中,所述方法還包括:對所述用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在所述用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報。
[0012]第二方面,本申請?zhí)峁┝艘环N將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述裝置包括:內(nèi)存耗盡內(nèi)核模塊,配置用于當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑;存儲模塊,配置用于存儲所述內(nèi)存耗盡事件的相關(guān)信息;內(nèi)存耗盡服務(wù)模塊,配置用于通過所述存儲模塊獲取所述內(nèi)存耗盡事件的相關(guān)信息,還配置用于利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。
[0013]在一些實施例中,所述裝置還包括:暫停進程模塊,配置用于將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將所述觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上;在內(nèi)存耗盡事件處理完成后喚醒所述等待隊列上的所述觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。
[0014]在一些實施例中,所述內(nèi)存耗盡內(nèi)核模塊還配置用于:在將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊之后通知所述內(nèi)存耗盡服務(wù)模塊。
[0015]在一些實施例中,所述內(nèi)存耗盡服務(wù)模塊還配置用于:所述用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分;所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程信號。
[0016]在一些實施例中,所述內(nèi)存耗盡服務(wù)模塊還配置用于不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。
[0017]在一些實施例中,所述內(nèi)存耗盡服務(wù)模塊還配置用于向所述內(nèi)存耗盡內(nèi)核模塊發(fā)送內(nèi)存耗盡事件處理完成的通知。
[0018]在一些實施例中,所述裝置還包括:監(jiān)控模塊,配置用于對所述用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在所述用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報所述內(nèi)存耗盡內(nèi)核模塊。
[0019]本申請?zhí)峁┑膶?nèi)存耗盡處理流程卸載到用戶空間的方法和裝置,通過內(nèi)核將OOM事件相關(guān)信息寫入內(nèi)核空間與用戶空間共享的內(nèi)存頁面,用戶空間讀取所述寫入的OOM事件相關(guān)信息后進行OOM處理,將內(nèi)核態(tài)的OOM機制卸載到用戶態(tài)執(zhí)行,將整個OOM處理過程交由一個用戶態(tài)進程來完成,降低OOM執(zhí)行的復(fù)雜度,也易于OOM策略的調(diào)整及業(yè)務(wù)的升級替換。
【附圖說明】
[0020]通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
[0021]圖1是本申請可以應(yīng)用于其中的示例性系統(tǒng)架構(gòu)圖;
[0022]圖2是根據(jù)本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的一個實施例的流程圖;
[0023]圖3是根據(jù)本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的一個應(yīng)用場景的不意圖;
[0024]圖4是根據(jù)本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的又一個實施例的流程圖;
[0025]圖5是根據(jù)本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置的一個實施例的結(jié)構(gòu)示意圖;
[0026]圖6是適于用來實現(xiàn)本申請實施例的終端設(shè)備或服務(wù)器的計算機系統(tǒng)的結(jié)構(gòu)示意圖。
【具體實施方式】
[0027]下面結(jié)合附圖和實施例對本申請作進一步的詳細說明??梢岳斫獾氖牵颂幩枋龅木唧w實施例僅僅用于解釋相關(guān)發(fā)明,而非對該發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與有關(guān)發(fā)明相關(guān)的部分。
[0028]需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結(jié)合實施例來詳細說明本申請。
[0029]圖1示出了可以應(yīng)用本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的方法或?qū)?nèi)存耗盡處理流程卸載到用戶空間的裝置的實施例的示例性系統(tǒng)架構(gòu)100。
[0030]如圖1所示,系統(tǒng)架構(gòu)100可以包括終端設(shè)備101、102、103,網(wǎng)絡(luò)104和服務(wù)器105。網(wǎng)絡(luò)104用以在終端設(shè)備101、102、103和服務(wù)器105之間提供通信鏈路的介質(zhì)。網(wǎng)絡(luò)104可以包括各種連接類型,例如有線、無線通信鏈路或者光纖電纜等等。
[0031]用戶可以使用終端設(shè)備101、102、103通過網(wǎng)絡(luò)104與服務(wù)器105交互,以接收或發(fā)送消息等。終端設(shè)備101、102、103上可以安裝有各種通訊客戶端應(yīng)用,例如網(wǎng)頁瀏覽器應(yīng)用、購物類應(yīng)用、搜索類應(yīng)用、即時通信工具、郵箱客戶端、社交平臺軟件等。
[0032]終端設(shè)備101、102、103可以是具有操作系統(tǒng)的各種電子設(shè)備。包括但不限于智能手機、平板電腦、電子書閱讀器、MP3播放器(Moving Picture Experts Group Aud1 LayerIII,動態(tài)影像專家壓縮標(biāo)準(zhǔn)音頻層面3)、MP4(Moving Picture Experts Group Aud1Layer IV,動態(tài)影像專家壓縮標(biāo)準(zhǔn)音頻層面4)播放器、膝上型便攜計算機和臺式計算機等等。
[0033]服務(wù)器105可以是具有Wind0W、LinUX等操作系統(tǒng)的服務(wù)器。
[0034]需要說明的是,本申請實施例所提供的將內(nèi)存耗盡處理流程卸載到用戶空間的方法一般由服務(wù)器105或終端設(shè)備101、102、103執(zhí)行,相應(yīng)地,將內(nèi)存耗盡處理流程卸載到用戶空間的裝置一般設(shè)置于服務(wù)器105中或終端設(shè)備101、102、103中。
[0035]應(yīng)該理解,圖1中的終端設(shè)備、網(wǎng)絡(luò)和服務(wù)器的數(shù)目僅僅是示意性的。根據(jù)實現(xiàn)需要,可以具有任意數(shù)目的終端設(shè)備、網(wǎng)絡(luò)和服務(wù)器。
[0036]繼續(xù)參考圖2,示出了示出了根據(jù)本申請的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的一個實施例的流程200。所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,包括以下步驟:
[0037]步驟201,將內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面。
[0038]在本實施例中,將內(nèi)存耗盡處理流程卸載到用戶空間的方法運行于其上的電子設(shè)備(例如圖1所示的服務(wù)器或終端)可以在內(nèi)核發(fā)生內(nèi)存耗盡時將內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面(mmap)。其中,相關(guān)信息包括:觸發(fā)OOM的進程的身份標(biāo)識PID及觸發(fā)OOM的進程所在的內(nèi)存資源控制子系統(tǒng)(memory cgroup)的路徑。
[0039]在本實施例的一些可選的實現(xiàn)方式中,在將內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面之后通知用戶空間的內(nèi)存耗盡服務(wù)進程。
[0040]在本實施例的一些可選的實現(xiàn)方式中,在內(nèi)存緊張的情況下,為了保證用戶空間的內(nèi)存耗盡服務(wù)進程可以順利申請到內(nèi)存完成計算任務(wù),在內(nèi)存耗盡服務(wù)進程創(chuàng)建時,將為其附加TIF_MEMDIE標(biāo)志,確保其可以使用系統(tǒng)為內(nèi)核保留的位于水位線以下的內(nèi)存。
[0041]在本實施例的一些可選的實現(xiàn)方式中,當(dāng)用戶空間的內(nèi)存耗盡服務(wù)進程出現(xiàn)問題時,內(nèi)存耗盡服務(wù)將自動進入內(nèi)核原有的標(biāo)準(zhǔn)內(nèi)存耗盡處理過程。
[0042]步驟202,用戶空間的內(nèi)存耗盡服務(wù)進程通過內(nèi)存頁面獲取內(nèi)存耗盡事件的相關(guān)
?目息O
[0043]在本實施例中,在內(nèi)核將內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面之后,用戶空間的內(nèi)存耗盡服務(wù)進程讀取該信息。
[0044]在本實施例的一些可選的實現(xiàn)方式中,用戶空間的內(nèi)存耗盡服務(wù)進程在接收到內(nèi)核發(fā)送的內(nèi)存耗盡事件的相關(guān)信息寫入完成的通知后再讀取該信息。
[0045]步驟203,用戶空間的內(nèi)存耗盡服務(wù)進程利用內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件。
[0046]在本實施例中,用戶空間的內(nèi)存耗盡服務(wù)進程利用內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件,結(jié)束一些進程以釋放內(nèi)存空間。
[0047]在本實施例的一些可選的實現(xiàn)方式中,用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分;所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程信號。
[0048]在本實施例的一些可選的實現(xiàn)方式中,用戶空間的內(nèi)存耗盡服務(wù)進程不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。由于內(nèi)存耗盡服務(wù)進程本身作為內(nèi)核功能的一個卸載,要求內(nèi)存耗盡服務(wù)進程在系統(tǒng)運行期間一直存在,由此在內(nèi)存耗盡服務(wù)進程啟動時由內(nèi)核清空進程的信號處理,并置位SIGNAL_UNKILLABLE標(biāo)志,以使內(nèi)存耗盡服務(wù)進程不再響應(yīng)用戶態(tài)發(fā)送的結(jié)束信號,避免內(nèi)存耗盡服務(wù)進程被人為的誤殺掉。
[0049]在本實施例的一些可選的實現(xiàn)方式中,用戶空間的內(nèi)存耗盡服務(wù)進程向內(nèi)核空間發(fā)送內(nèi)存耗盡事件處理完成的通知。內(nèi)存耗盡內(nèi)核模塊接收到來自用戶空間的通知后,喚醒那些等待分配內(nèi)存的任務(wù)。
[0050]在本實施例的一些可選的實現(xiàn)方式中,對用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報。例如,基于內(nèi)核Utrace框架實現(xiàn)對用戶空間的內(nèi)存耗盡服務(wù)進程的監(jiān)控。當(dāng)用戶空間的內(nèi)存耗盡服務(wù)進程異常退出時,在進程退出前會主動將進程的退出事件上報至監(jiān)控模塊,由此可將當(dāng)前內(nèi)存耗盡服務(wù)進程正在處理但未處理完的內(nèi)存耗盡事件中的進程喚醒,以使其再次嘗試申請內(nèi)存,如再次失敗的話會由標(biāo)準(zhǔn)內(nèi)核中的內(nèi)存耗盡機制負責(zé)處理。
[0051]繼續(xù)參見圖3,圖3是根據(jù)本實施例的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的應(yīng)用場景的一個示意圖。在圖3的應(yīng)用場景中,事件處理流程如下所示:
[0052](I)當(dāng)發(fā)生內(nèi)存耗盡事件301時,在內(nèi)核中觸發(fā)內(nèi)存耗盡事件的路徑(典型的路包括:在memory cgroup申請內(nèi)存的路徑和系統(tǒng)缺頁異常處理函數(shù)中)上的代碼首先將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并主動觸發(fā)一次調(diào)度,以使進程讓出CPU,并將其掛到等待隊列302上,然后將內(nèi)存耗盡事件通過eventfd發(fā)送給內(nèi)存耗盡內(nèi)核模塊303;
[0053](2)內(nèi)存耗盡內(nèi)核模塊303會將內(nèi)存耗盡事件的相關(guān)信息,包括觸發(fā)內(nèi)存耗盡的進程PID及進程所在的memory cgroup路徑寫入一個用戶態(tài)與內(nèi)核態(tài)共享的mmap內(nèi)存頁面304;
[0054](3)通過eventfd方式喚醒并通知用戶空間的內(nèi)存耗盡服務(wù)進程305;
[0055](4)用戶空間的內(nèi)存耗盡服務(wù)進程305由mmap內(nèi)存頁面304獲取內(nèi)存耗盡事件的相關(guān)信息,包括觸發(fā)內(nèi)存耗盡的進程PID及進程所在的memory cgroup路徑;
[0056](5)內(nèi)存耗盡服務(wù)進程305遍歷并為各個進程306打分,并基于策略選定將被結(jié)束的進程;
[0057](6)內(nèi)存耗盡服務(wù)進程305向選定的進程發(fā)送SIGKILL信號;
[0058](7)內(nèi)存耗盡服務(wù)進程305向內(nèi)存耗盡內(nèi)核模塊303發(fā)送完成內(nèi)存耗盡事件處理完成通知;當(dāng)內(nèi)存耗盡服務(wù)進程305異常退出時,在進程退出前會主動將進程的退出事件上報至監(jiān)控模塊307,由此可將當(dāng)前內(nèi)存耗盡進程305正在處理但未處理完的內(nèi)存耗盡事件中的進程喚醒,以使其再次嘗試申請內(nèi)存,如再次失敗的話會由標(biāo)準(zhǔn)內(nèi)核中的內(nèi)存耗盡機制負責(zé)處理。
[0059](8)內(nèi)存耗盡內(nèi)核模塊303喚醒等待隊列302上的進程,重新嘗試申請內(nèi)存。
[0060]本申請的上述實施例提供的方法通過將內(nèi)存耗盡處理流程卸載到用戶空間,通過eventfd的方式通知內(nèi)存耗盡內(nèi)核模塊,而不是直接調(diào)用內(nèi)存耗盡內(nèi)核模塊中的函數(shù),從而達到解耦的目的,內(nèi)存耗盡內(nèi)核模塊可以順利的在系統(tǒng)運行時進行加載和卸載,因此降低了內(nèi)存耗盡處理邏輯的復(fù)雜度,減少內(nèi)存耗盡處理過程的耗時,并且使業(yè)務(wù)的升級和部署更容易。
[0061]進一步參考圖4,其示出了將內(nèi)存耗盡處理流程卸載到用戶空間的方法的又一個實施例的流程400。該將內(nèi)存耗盡處理流程卸載到用戶空間的方法的流程400,包括以下步驟:
[0062]步驟401,將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上。
[0063]在本實施例中,將內(nèi)存耗盡處理流程卸載到用戶空間的方法運行于其上的電子設(shè)備(例如圖1所示的服務(wù)器或終端)可以在發(fā)生內(nèi)存耗盡事件時,在內(nèi)核中觸發(fā)內(nèi)存耗盡事件的路徑上的代碼首先將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài)并將其掛到等待隊列上。
[0064]在本實施例的一些可選的實現(xiàn)方式中,當(dāng)內(nèi)存資源控制子系統(tǒng)(memorycgroup)內(nèi)已經(jīng)處于內(nèi)存耗盡狀態(tài)時將暫停memory cgroup組內(nèi)新進程的創(chuàng)建或非組內(nèi)的進程迀移Amemory cgroup組。對已經(jīng)在組內(nèi)的進程新創(chuàng)建進程時,新進程在被創(chuàng)建后如果所處的memory cgroup處于內(nèi)存耗盡狀態(tài),則設(shè)置TIF_MEMCG_THR0TTLE標(biāo)志位,并向進程遞送信號,以使新創(chuàng)建的進程在完成創(chuàng)建后第一次運行時即立刻進出信號處理過程中,并在信號處理過程中,使新創(chuàng)建的進程切換為睡眠狀態(tài)并將其掛入對應(yīng)內(nèi)存組的內(nèi)存耗盡事件等待隊列上,并將其從所在的memory cgroup組中摘除,直至所在的memory cgroup內(nèi)的內(nèi)存耗盡事件被處理完,再將內(nèi)存耗盡事件等待隊列上的進程喚醒,并重新將進程添加至目標(biāo)memory cgroup中。同理,當(dāng)外部進程嘗試迀移入memory cgroup時,如果目標(biāo)memorycgroup已經(jīng)處于內(nèi)存耗盡狀態(tài),則向新進入的進程遞送信號,后續(xù)處理與處理新建進程相同。
[0065]步驟402,將內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面。
[0066]步驟403,用戶空間的內(nèi)存耗盡服務(wù)進程通過內(nèi)存頁面獲取內(nèi)存耗盡事件的相關(guān)
?目息O
[0067]步驟404,用戶空間的內(nèi)存耗盡服務(wù)進程利用內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件。
[0068]由于步驟402-404與步驟201-203基本相同,因此不再贅述。
[0069]步驟405,在內(nèi)存耗盡事件處理完成后喚醒等待隊列上的觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。
[0070]在本實施例中,內(nèi)核收到用戶空間發(fā)送的內(nèi)存耗盡事件處理完成通知后喚醒等待隊列上的觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。
[0071]從圖4中可以看出,與圖2對應(yīng)的實施例相比,本實施例中的將內(nèi)存耗盡處理流程卸載到用戶空間的方法的流程400突出了對已經(jīng)處于內(nèi)存耗盡狀態(tài)的memory cgroup處理的步驟。對已經(jīng)處于內(nèi)存耗盡狀態(tài)的memory cgroup,暫停進程的新建及外部進程向當(dāng)前memory cgroup的迀移,由此可避免新建進程或新進入的進程進一步的消耗內(nèi)存,從而在本已達到內(nèi)存使用上限的memory cgroup組內(nèi)引發(fā)新的一輪內(nèi)存耗盡,極端情況下,頻繁的新建或新調(diào)度進入進程,甚至?xí)l(fā)內(nèi)存耗盡風(fēng)暴,使系統(tǒng)長時間處于內(nèi)存耗盡狀態(tài)而無法提供正常服務(wù),另一方面對正在執(zhí)行的內(nèi)存耗盡處理過程,也可減少待處理的進程數(shù)目,提高內(nèi)存耗盡處理的速度。
[0072]進一步參考圖5,作為對上述各圖所示方法的實現(xiàn),本申請?zhí)峁┝艘环N將內(nèi)存耗盡處理流程卸載到用戶空間的裝置的一個實施例,該裝置實施例與圖2所示的方法實施例相對應(yīng),該裝置具體可以應(yīng)用于各種電子設(shè)備中。
[0073]如圖5所示,本實施例所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置500包括:內(nèi)存耗盡內(nèi)核模塊501、存儲模塊502和內(nèi)存耗盡服務(wù)模塊503。其中,內(nèi)存耗盡內(nèi)核模塊501配置用于當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑;存儲模塊502配置用于存儲所述內(nèi)存耗盡事件的相關(guān)信息;內(nèi)存耗盡服務(wù)模塊503配置用于通過所述存儲模塊獲取所述內(nèi)存耗盡事件的相關(guān)信息,還配置用于利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。
[0074]在本實施例中,內(nèi)存耗盡內(nèi)核模塊501位于內(nèi)核空間,存儲模塊502由用戶空間和內(nèi)核空間共享,內(nèi)存耗盡服務(wù)模塊503位于用戶空間。
[0075]在本實施例的一些可選的實現(xiàn)方式中,將內(nèi)存耗盡處理流程卸載到用戶空間的裝置500還包括:暫停進程模塊,配置用于將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將所述觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上;在內(nèi)存耗盡事件處理完成后喚醒所述等待隊列上的所述觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。
[0076]在本實施例的一些可選的實現(xiàn)方式中,內(nèi)存耗盡內(nèi)核模塊501還配置用于:在將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊之后通知所述內(nèi)存耗盡服務(wù)模塊。
[0077]在本實施例的一些可選的實現(xiàn)方式中,內(nèi)存耗盡服務(wù)模塊503還配置用于:所述用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分;所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程信號。
[0078]在本實施例的一些可選的實現(xiàn)方式中,內(nèi)存耗盡服務(wù)模塊503還配置用于不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。
[0079]在本實施例的一些可選的實現(xiàn)方式中,內(nèi)存耗盡服務(wù)模塊503還配置用于向所述內(nèi)存耗盡內(nèi)核模塊發(fā)送內(nèi)存耗盡事件處理完成的通知。
[0080]在本實施例的一些可選的實現(xiàn)方式中,將內(nèi)存耗盡處理流程卸載到用戶空間的裝置500還包括:監(jiān)控模塊,配置用于對所述用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在所述用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報所述內(nèi)存耗盡內(nèi)核模塊。
[0081]下面參考圖6,其示出了適于用來實現(xiàn)本申請實施例的終端設(shè)備或服務(wù)器的計算機系統(tǒng)600的結(jié)構(gòu)示意圖。
[0082]如圖6所示,計算機系統(tǒng)600包括中央處理單元(CPU)601,其可以根據(jù)存儲在只讀存儲器(R0M)602中的程序或者從存儲部分608加載到隨機訪問存儲器(RAM)603中的程序而執(zhí)行各種適當(dāng)?shù)膭幼骱吞幚?。在RAM 603中,還存儲有系統(tǒng)600操作所需的各種程序和數(shù)據(jù)。CPU 60KROM 602以及RAM 603通過總線604彼此相連。輸入/輸出(I/O)接口605也連接至總線 604。
[0083]以下部件連接至I/O接口605:包括鍵盤、鼠標(biāo)等的輸入部分606 ;包括諸如陰極射線管(CRT)、液晶顯示器(LCD)等以及揚聲器等的輸出部分607;包括硬盤等的存儲部分608;以及包括諸如LAN卡、調(diào)制解調(diào)器等的網(wǎng)絡(luò)接口卡的通信部分609。通信部分609經(jīng)由諸如因特網(wǎng)的網(wǎng)絡(luò)執(zhí)行通信處理。驅(qū)動器610也根據(jù)需要連接至I/O接口 605。可拆卸介質(zhì)611,諸如磁盤、光盤、磁光盤、半導(dǎo)體存儲器等等,根據(jù)需要安裝在驅(qū)動器610上,以便于從其上讀出的計算機程序根據(jù)需要被安裝入存儲部分608。
[0084]特別地,根據(jù)本公開的實施例,上文參考流程圖描述的過程可以被實現(xiàn)為計算機軟件程序。例如,本公開的實施例包括一種計算機程序產(chǎn)品,其包括有形地包含在機器可讀介質(zhì)上的計算機程序,所述計算機程序包含用于執(zhí)行流程圖所示的方法的程序代碼。在這樣的實施例中,該計算機程序可以通過通信部分609從網(wǎng)絡(luò)上被下載和安裝,和/或從可拆卸介質(zhì)611被安裝。在該計算機程序被中央處理單元(CPU)601執(zhí)行時,執(zhí)行本申請的方法中限定的上述功能。
[0085]附圖中的流程圖和框圖,圖示了按照本申請各種實施例的系統(tǒng)、方法和計算機程序產(chǎn)品的可能實現(xiàn)的體系架構(gòu)、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實現(xiàn),或者可以用專用硬件與計算機指令的組合來實現(xiàn)。
[0086]描述于本申請實施例中所涉及到的模塊可以通過軟件的方式實現(xiàn),也可以通過硬件的方式來實現(xiàn)。所描述的模塊也可以設(shè)置在處理器中,例如,可以描述為:一種處理器包括內(nèi)存耗盡內(nèi)核模塊、存儲模塊和內(nèi)存耗盡服務(wù)模塊。其中,這些模塊的名稱在某種情況下并不構(gòu)成對該模塊本身的限定,例如,存儲模塊還可以被描述為“存儲所述內(nèi)存耗盡事件的相關(guān)信息的模塊”。
[0087]作為另一方面,本申請還提供了一種非易失性計算機存儲介質(zhì),該非易失性計算機存儲介質(zhì)可以是上述實施例中所述裝置中所包含的非易失性計算機存儲介質(zhì);也可以是單獨存在,未裝配入終端中的非易失性計算機存儲介質(zhì)。上述非易失性計算機存儲介質(zhì)存儲有一個或者多個程序,當(dāng)所述一個或者多個程序被一個設(shè)備執(zhí)行時,使得所述設(shè)備:當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑;所述用戶空間的內(nèi)存耗盡服務(wù)進程通過所述內(nèi)存頁面獲取所述內(nèi)存耗盡事件的相關(guān)信息;所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。
[0088]以上描述僅為本申請的較佳實施例以及對所運用技術(shù)原理的說明。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,本申請中所涉及的發(fā)明范圍,并不限于上述技術(shù)特征的特定組合而成的技術(shù)方案,同時也應(yīng)涵蓋在不脫離所述發(fā)明構(gòu)思的情況下,由上述技術(shù)特征或其等同特征進行任意組合而形成的其它技術(shù)方案。例如上述特征與本申請中公開的(但不限于)具有類似功能的技術(shù)特征進行互相替換而形成的技術(shù)方案。
【主權(quán)項】
1.一種將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述方法包括: 當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑; 所述用戶空間的內(nèi)存耗盡服務(wù)進程通過所述內(nèi)存頁面獲取所述內(nèi)存耗盡事件的相關(guān)信息; 所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。2.根據(jù)權(quán)利要求1所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述方法還包括: 將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將所述觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上; 在內(nèi)存耗盡事件處理完成后喚醒所述等待隊列上的所述觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。3.根據(jù)權(quán)利要求1所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述方法還包括: 在將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的內(nèi)存頁面之后通知所述用戶空間的內(nèi)存耗盡服務(wù)進程。4.根據(jù)權(quán)利要求1所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件,包括: 所述用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分; 所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程信號。5.根據(jù)權(quán)利要求4所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述用戶空間的內(nèi)存耗盡服務(wù)進程不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。6.根據(jù)權(quán)利要求1所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述用戶空間的內(nèi)存耗盡服務(wù)進程利用所述內(nèi)存耗盡事件的相關(guān)信息處理內(nèi)存耗盡事件還包括: 所述用戶空間的內(nèi)存耗盡服務(wù)進程向所述內(nèi)核空間發(fā)送內(nèi)存耗盡事件處理完成的通知。7.根據(jù)權(quán)利要求1所述的將內(nèi)存耗盡處理流程卸載到用戶空間的方法,其特征在于,所述方法還包括: 對所述用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在所述用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報。8.—種將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述裝置包括: 內(nèi)存耗盡內(nèi)核模塊,配置用于當(dāng)進程觸發(fā)內(nèi)存耗盡事件時,將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊,所述相關(guān)信息包括:所述進程的身份標(biāo)識及所述進程所在的內(nèi)存資源控制子系統(tǒng)的路徑; 存儲模塊,配置用于存儲所述內(nèi)存耗盡事件的相關(guān)信息; 內(nèi)存耗盡服務(wù)模塊,配置用于通過所述存儲模塊獲取所述內(nèi)存耗盡事件的相關(guān)信息,還配置用于利用所述內(nèi)存耗盡事件的相關(guān)信息處理所述內(nèi)存耗盡事件。9.根據(jù)權(quán)利要求8所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述裝置還包括: 暫停進程模塊,配置用于將觸發(fā)內(nèi)存耗盡事件的進程由運行狀態(tài)切換為睡眠狀態(tài),并將所述觸發(fā)內(nèi)存耗盡事件的進程掛到等待隊列上;在內(nèi)存耗盡事件處理完成后喚醒所述等待隊列上的所述觸發(fā)內(nèi)存耗盡的進程,重新嘗試申請內(nèi)存。10.根據(jù)權(quán)利要求8所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述內(nèi)存耗盡內(nèi)核模塊還配置用于: 在將所述內(nèi)存耗盡事件的相關(guān)信息寫入用戶空間與內(nèi)核空間共享的存儲模塊之后通知所述內(nèi)存耗盡服務(wù)模塊。11.根據(jù)權(quán)利要求8所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述內(nèi)存耗盡服務(wù)模塊還配置用于: 所述用戶空間的內(nèi)存耗盡服務(wù)進程將可結(jié)束的進程按照進程的內(nèi)存占用情況打分; 所述用戶空間的內(nèi)存耗盡服務(wù)進程向分數(shù)最高的進程發(fā)送結(jié)束進程信號。12.根據(jù)權(quán)利要求11所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述內(nèi)存耗盡服務(wù)模塊還配置用于不響應(yīng)用戶空間發(fā)送的結(jié)束進程的信號。13.根據(jù)權(quán)利要求8所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述內(nèi)存耗盡服務(wù)模塊還配置用于向所述內(nèi)存耗盡內(nèi)核模塊發(fā)送內(nèi)存耗盡事件處理完成的通知。14.根據(jù)權(quán)利要求8所述的將內(nèi)存耗盡處理流程卸載到用戶空間的裝置,其特征在于,所述裝置還包括: 監(jiān)控模塊,配置用于對所述用戶空間的內(nèi)存耗盡服務(wù)進程進行監(jiān)控,在所述用戶空間的內(nèi)存耗盡服務(wù)進程退出之前,主動將退出事件上報所述內(nèi)存耗盡內(nèi)核模塊。
【文檔編號】G06F9/50GK106020976SQ201610320045
【公開日】2016年10月12日
【申請日】2016年5月13日
【發(fā)明人】袁林思, 王柏生, 孫棟, 李志勇
【申請人】北京百度網(wǎng)訊科技有限公司