本技術(shù)涉及計(jì)算機(jī)技術(shù)的領(lǐng)域,尤其涉及一種麒麟v10系統(tǒng)中percpu內(nèi)存占用的優(yōu)化方法。
背景技術(shù):
1、容器技術(shù)提供了一種高效的應(yīng)用程序的部署方法,同時(shí)實(shí)現(xiàn)的系統(tǒng)中資源的相互隔離,被大規(guī)模應(yīng)用到了云計(jì)算、集群管理、微服務(wù)、數(shù)據(jù)庫等各個(gè)領(lǐng)域。容器技術(shù)是依賴于系統(tǒng)中的cgroup組來完成資源控制的,每個(gè)上層的容器都會對應(yīng)系統(tǒng)中的一個(gè)cgroup組。在一些進(jìn)行大量頻繁的容器創(chuàng)建刪除的應(yīng)用場景中,經(jīng)常會碰到系統(tǒng)中percpu內(nèi)存占用出現(xiàn)持續(xù)增多的情況,進(jìn)而導(dǎo)致系統(tǒng)中可用內(nèi)存逐漸減少。在cpu數(shù)量較多的設(shè)備上,此問題尤為突出。
2、percpu內(nèi)存指的是為每個(gè)處理器分配的內(nèi)存區(qū)域,這通常用于內(nèi)核為每個(gè)cpu核心存儲其專用的數(shù)據(jù)結(jié)構(gòu)和信息。這部分內(nèi)存主要用于優(yōu)化多核處理器的性能,通過減少不同cpu核心之間的數(shù)據(jù)共享和競爭。
3、導(dǎo)致此問題的主要原因是由于系統(tǒng)中長時(shí)間保留cgroup組管理的緩存頁引起的。當(dāng)容器中的進(jìn)程操作文件時(shí),系統(tǒng)會分配緩存頁用來臨時(shí)保存儲存介質(zhì)中文件的內(nèi)容,同時(shí)將緩存頁放到容器對應(yīng)的cgroup組中來管理。系統(tǒng)為了保證io讀寫效率,在進(jìn)程管理文件時(shí),并不會立即釋放掉緩存頁,緩存頁所屬的cgroup組也就不會被清除。即使上層用戶刪掉了容器,系統(tǒng)中的cgroup組并不會被刪除,演變成一個(gè)僵死的cgroup組,會一直被保留到系統(tǒng)中的緩存頁被清理。
4、當(dāng)設(shè)備長時(shí)間運(yùn)行時(shí),系統(tǒng)中緩存頁會不斷增加,大量的容器刪建之后,系統(tǒng)中僵死的cgroup組也會逐步增加。由于cgroup組中包含很多percpu內(nèi)存用來保存區(qū)分cpu的統(tǒng)計(jì)信息,僵死的cgroup組不斷增多最終會導(dǎo)致系統(tǒng)中percpu內(nèi)存使用量在不斷的增加。
5、此現(xiàn)象是在麒麟v10系統(tǒng)中出現(xiàn)的。為了系統(tǒng)的io讀寫效率及容器刪建的效率,linux內(nèi)核社區(qū)中保留了當(dāng)前的設(shè)計(jì)方案。如果長時(shí)間運(yùn)行的設(shè)備,因緩存頁無法被立即釋放,導(dǎo)致出現(xiàn)大量僵死的cgroup,可手動使用/proc/sys/vm/drop_caches來釋放緩存。
6、對于客戶大規(guī)模業(yè)務(wù)部署的環(huán)境,為了防止此問題影響各場景下正常的業(yè)務(wù),在進(jìn)行大規(guī)模部署時(shí),也要部署緩存頁清理腳本。腳本中定期的清理設(shè)備上的緩存頁,進(jìn)而刪除僵死的cgroup組,同時(shí)釋放出percpu內(nèi)存。手動強(qiáng)制清理掉系統(tǒng)中的緩存頁,短期內(nèi)會引起系統(tǒng)的io讀寫效率降低,影響各應(yīng)用場景下的業(yè)務(wù)能力。同時(shí),額外增加的腳本操作,會增加大規(guī)模部署上層業(yè)務(wù)的復(fù)雜度。
技術(shù)實(shí)現(xiàn)思路
1、為解決上述問題,本發(fā)明提供了一種麒麟v10系統(tǒng)中percpu內(nèi)存占用的優(yōu)化方法,采用如下的技術(shù)方案:
2、一種麒麟v10系統(tǒng)中percpu內(nèi)存占用的優(yōu)化方法,包括:
3、當(dāng)上層用戶刪除容器時(shí),系統(tǒng)內(nèi)核將容器對應(yīng)的cgroup組的組id刪除,并將percpu內(nèi)存釋放的操作封裝成work,并將封裝成的work加入到工作隊(duì)列中以及將cgroup組的狀態(tài)值設(shè)置為1,其中,狀態(tài)值為1表示disable狀態(tài);
4、當(dāng)檢測到系統(tǒng)中存在能夠處理所述封裝成的work的空閑cpu時(shí),cpu執(zhí)行work任務(wù)將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到其對應(yīng)的目標(biāo)上層cgroup組中,并同時(shí)將cgroup組的狀態(tài)值設(shè)置為2,其中,狀態(tài)值為2表示flushed狀態(tài),統(tǒng)計(jì)信息包括:cgroup組中程序使用的匿名頁數(shù)、文件頁數(shù)以及動態(tài)頁數(shù);
5、在cgroup組的狀態(tài)切換為flushed狀態(tài)后,work任務(wù)立即釋放cgroup組中的各種percpu內(nèi)存,在各種percpu內(nèi)存釋放完后,cgroup組狀態(tài)值被設(shè)置為3,其中狀態(tài)值為3表示進(jìn)入freed狀態(tài),標(biāo)識所述cgroup組處于等待被完全釋放的狀態(tài);
6、判斷當(dāng)前所述cgroup組中的進(jìn)程是否存在文件io讀寫;
7、若不存在,則確定當(dāng)前所述cgroup組已被完全清理;
8、若存在,則判斷當(dāng)前系統(tǒng)內(nèi)的可用內(nèi)存是否低于系統(tǒng)設(shè)置的內(nèi)存水位線,若低于,則觸發(fā)內(nèi)存回收機(jī)制,系統(tǒng)中的緩存頁被回收,以使得當(dāng)前所述cgroup組已被完全清理。
9、在另一種可能的實(shí)現(xiàn)方式中,將封裝成的work加入到工作隊(duì)列中,包括:
10、通過queue_work操作將封裝成的work加入到工作隊(duì)列中。
11、在另一種可能的實(shí)現(xiàn)方式中,將cgroup組的狀態(tài)值設(shè)置為1,包括:
12、通過disable_css將cgroup組的狀態(tài)值設(shè)置為1。
13、在另一種可能的實(shí)現(xiàn)方式中,所述work任務(wù)將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到其對應(yīng)的目標(biāo)上層cgroup組中,包括:
14、通過在work任務(wù)實(shí)施flush_percpu_vmstats將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到其對應(yīng)的目標(biāo)上層cgroup組中。
15、在另一種可能的實(shí)現(xiàn)方式中,通過在work任務(wù)實(shí)施flush_percpu_vmstats將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到其對應(yīng)的目標(biāo)上層cgroup組中,包括:
16、步驟sa,判斷當(dāng)前cgroup組的上一層cgroup組的狀態(tài)值是否為0,其中狀態(tài)值為0表示enable狀態(tài);
17、步驟sb,若是,則將上一層cgroup組確定為當(dāng)前cgroup組對應(yīng)的目標(biāo)上層cgroup組,并將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到目標(biāo)上層cgroup組中;
18、步驟sc,若否,則遞歸查找所述上一層cgroup組的上一層cgroup組,直到找到狀態(tài)值為0的cgroup組,并將其確定為當(dāng)前cgroup組的目標(biāo)上層cgroup組,并將當(dāng)前cgroup組中percpu內(nèi)存保存的統(tǒng)計(jì)信息同步到目標(biāo)上層cgroup組中。
19、在另一種可能的實(shí)現(xiàn)方式中,work任務(wù)立即釋放cgroup組中的各種percpu內(nèi)存,包括:
20、通過在work任務(wù)中實(shí)施free_percpu操作來釋放cgroup組中的各種percpu內(nèi)存。
21、在另一種可能的實(shí)現(xiàn)方式中,判斷當(dāng)前所述cgroup組中的進(jìn)程是否存在文件io讀寫,包括:
22、通過檢查當(dāng)前所述cgroup組的被引用次數(shù)是否減為0,判斷當(dāng)前所述cgroup組中的進(jìn)程是否存在文件io讀寫,其中,被引用次數(shù)為0時(shí),說明不存在文件io讀寫,被引用次數(shù)不為0時(shí),說明存在文件io讀寫。
23、在另一種可能的實(shí)現(xiàn)方式中,所述方法還包括:
24、當(dāng)確定出當(dāng)前系統(tǒng)內(nèi)的可用內(nèi)存不低于系統(tǒng)設(shè)置的內(nèi)存水位線時(shí),系統(tǒng)上層用戶可通過內(nèi)存回收工具,強(qiáng)制系統(tǒng)回收緩存頁,以使得所述cgroup組被完全清理掉。
25、綜上所述,本技術(shù)包括以下至少一種有益技術(shù)效果:
26、1、在頻繁大量進(jìn)行容器刪減的環(huán)境中,本發(fā)明可以明顯有效緩解系統(tǒng)中percpu內(nèi)存使用量的增長,防止系統(tǒng)內(nèi)存的過快消耗。
27、2、本發(fā)明的核心操作是通過異步處理的方式進(jìn)行的,對容器刪減效率的影響,同時(shí)也保證了系統(tǒng)中文件io讀寫的效率。