容器智能營運平台提供記憶體診斷功能,可以覆蓋Kubernetes叢集上常見的記憶體問題,包括記憶體流失、記憶體片段化、OOM等。診斷結果以圖表的方式展示系統記憶體整體使用方式,將容器內的緩衝和共用記憶體歸屬到具體的檔案夾下,清晰展示系統記憶體使用量情況,便於營運。本文介紹記憶體診斷的具體內容。
記憶體診斷套件括記憶體總覽、記憶體分析和OOM分析,用於瀏覽節點及Pod記憶體使用量情況,可以幫您快速瞭解系統的記憶體狀態。
根據叢集配置,具體檢查項可能稍有不同。實際結果請以診斷頁面結果為準。
使用故障診斷功能時,系統將在您的叢集節點上執行資料擷取程式並收集檢查結果。採集的資訊包括系統版本,負載、Docker、Kubelet等運行狀態及系統日誌中嚴重錯誤資訊。資料擷取程式不會採集您的商務資訊及敏感性資料。
記憶體總覽
記憶體總覽主要對記憶體相關風險一鍵檢查,快速識別系統是否存在記憶體問題。主要包括以下檢查項。
檢查項 | 說明 |
記憶體泄露 | 排查作業系統核心是否存在泄露,以及泄露的類型,支援slab、Vmalloc和夥伴系統(allocpage)三種泄露識別。 |
記憶體利用率 | 系統記憶體利用率。 |
Memcg殘留 | 評估Memory cgroup是否存在殘留,過多的殘留會嚴重影響系統效能,以及造成統計資料異常。 |
記憶體片段化 | 評估系統是否存在記憶體片段化,記憶體片段化會導致系統效能下降。 |
THP浪費率 | 評估透明大頁浪費率。 |
記憶體總覽以圖表形式展示系統所有記憶體的使用方式,包括核心記憶體、使用者態的應用記憶體和空閑記憶體。
核心記憶體(kernel):作業系統核心記憶體總使用量。
應用記憶體(app):使用者態程式記憶體總使用量。
空閑記憶體(free):系統空閑記憶體。
相關概念
名詞 | 解釋 |
記憶體泄露 | 指程式動態分配的記憶體由於某種原因未釋放,造成系統記憶體利用率升高,導致程式運行速度減慢甚至系統崩潰等嚴重後果。 |
記憶體利用率 | 記憶體利用率=(總記憶體-可用記憶體)x100/總記憶體,其中檔案快取屬於可用記憶體,不影響記憶體利用率。 |
Memcg殘留 | 當記憶體控制組(Memory cgroup)由於系統異常,沒有正常釋放時,Memcg殘留會影響系統效能。 |
記憶體片段化 | 記憶體片段是指系統長時間遠行後,由於閒置連續記憶體地區太小,導致不能滿足系統連續記憶體配置請求,從而出現記憶體配置延時,引起業務抖動。 |
THP浪費率 | THP(Transparent Huge Page)是指核心中2 MiB或1 GiB大小的大頁面(普通的小頁面大小為4 KiB)。 當系統開啟透明大頁時,核心會根據進程的實際情況動態分配透明大頁,透明大頁可以減少TLB(Translation Lookaside Buffer) Miss的出現機率,從而提升應用程式的效能。 THP帶來效能提升的同時,產生了一定副作用,即可能產生Memory bloating(記憶體膨脹)問題。由於透明大頁申請釋放的粒度為2 MiB(即512個小頁面),透明大頁更容易產生記憶體浪費,進而導致核心分配的記憶體容量大於實際需要的記憶體容量。Memory bloating可能引發OOM(Out Of Memory)。例如,一個應用程式實際需要使用2個小頁面,即8 KiB記憶體,但核心分配了1個透明大頁。此時,除去應用程式實際需要的記憶體(2個小頁面),透明大頁剩下的記憶體(510個小頁面)大小均為0。最終可能會因RSS(Resident Set Size)記憶體用量增加而導致OOM。 THP浪費率=THP零頁數x100%/THP總頁面數。 |
夥伴系統 | 夥伴系統是Linux核心用來管理實體記憶體頁的一種演算法,它管理起來的記憶體分為了不同的組,總共11組,每個組中的記憶體塊大小都是一樣的,都是2的冪次方個物理頁,一個記憶體頁一般是4 KB,所以大小一般是4 KB、8 KB、16 KB、32 KB……4 MB。 |
Slab | Linux作業系統的一種基於夥伴系統的小記憶體 Clerk。 |
Vmalloc | Linux作業系統的一種基於夥伴系統的非線性映射記憶體 Clerk。 |
filecache | Linux在讀寫檔案時,用記憶體緩衝磁碟檔案的內容,程式訪問檔案時直接操作記憶體,從而加快程式對檔案的讀寫。 |
匿名記憶體 | 在系統運行過程中動態分配(new、malloc、mmap)給進程的堆和棧所佔的記憶體,沒有實際的檔案名稱與之相關聯。 |
共用記憶體 | 共用記憶體允許兩個或更多進程訪問同一塊記憶體,是進程通訊方式之一。 |
tmpfs | Linux臨時檔案系統,是一種基於記憶體的檔案系統,讀寫的檔案內容只存在記憶體中。 |
hugetlb | 基於檔案系統的大頁記憶體。 |
核心記憶體
核心態記憶體重點關注Sunreclaim及夥伴系統的使用量,記憶體泄露通常都是指這兩個指標異常。
指標 | 說明 |
Sreclaimable | Slab可回收記憶體。 |
Sunreclaim | Slab不可回收記憶體。 |
PageTables | 核心頁表佔用記憶體。 |
Vmalloc | 核心調用Vmalloc分配的記憶體。 |
KernelStack | 進程的核心堆棧總記憶體。 |
AllocPages | 核心調用alloc_pages等介面直接從夥伴系統分配的記憶體量,此類記憶體無法通過任何節點檔案擷取,使用過多會造成記憶體黑洞。 |
應用記憶體
使用者態的應用記憶體重點關注匿名記憶體、共用記憶體及檔案快取記憶體。
指標 | 說明 |
filecache | 檔案快取記憶體,此類記憶體可以通過drop caches回收。 |
anon | 匿名記憶體,程式堆和棧記憶體,匿名記憶體佔用過多,需要評估業務進程是否有記憶體泄露,系統是否開啟了透明大頁。 |
mlock | 系統鎖住的記憶體量。 |
huge | hugetlb大頁記憶體量。 |
buffer | 塊裝置以及檔案系統元資訊佔用的記憶體量。 |
shmem | 共用記憶體(tmpfs)。業務進程退出後,經常會忘記刪除tmpfs檔案,或者在開啟狀態直接刪掉tmpfs檔案,都會操作shmem泄露。 |
記憶體分析
記憶體分析包括進程記憶體和Pod記憶體分析。
進程記憶體
以進程維度按記憶體大小排序,並分解成匿名記憶體、檔案快取和共用記憶體。
Pod記憶體
Pod記憶體分析功能夠解析容器組和容器內部檔案快取和共用記憶體對應的檔案,以及檔案快取活躍和非活躍的佔比。
檢查項 | 說明 |
Pod | Pod名稱。 |
容器 | 容器名稱。 |
檔案名稱 | 檔案名稱全路徑。 |
緩衝 | 檔案佔用的緩衝(filecache)大小。 |
容器內緩衝 | 檔案佔用緩衝在容器內的大小(存在不同容器的進程操作相同檔案)。 |
活躍緩衝 | 檔案快取最近已被使用部分的大小。 |
非活躍緩衝 | 檔案快取處於最近未被使用的大小。 |
OOM分析
對系統發生的OOM進行快速診斷,並輸出診斷結論,主要包括以下內容。
檢查項 | 說明 |
主機OOM次數 | 從開機到診斷時刻,主機OOM總次數。 |
剩餘記憶體 | 系統剩餘記憶體。 |
Low水線 | 系統配置的Low水線,剩餘記憶體低於Low水線時,會觸發記憶體非同步回收。 |
容器 | Pod名字、容器ID或者cgroup名稱。 |
limit | 容器設定的記憶體limit。 |
usage | 容器記憶體使用量量。 |
OOM次數 | 容器發生OOM總次數。 |
OOM類型 | OOM的類型,目前包括Host(主機)和cgroup。 |