在疫情期間,小編不得不待在家中遠程辦公。但變的是辦公方式,不變的是美創(chuàng )運維的7*24小時(shí)不間斷支持。

這不,一位客戶(hù)發(fā)來(lái)了一條消息:
客戶(hù):張工,好像我這個(gè)數據庫服務(wù)器的內存使用率有點(diǎn)高啊,你幫我看看?
隨即發(fā)了個(gè)linux環(huán)境下的free -g的截圖過(guò)來(lái):

小編一看,按照這個(gè)截圖的顯示,的確在總共62Gb的內存里,可使用內存只剩1Gb了。但是,我們也可以觀(guān)察到,cached顯示的是55Gb,我們再獲取了一下top命令的截圖:

那為什么cached的內存使用這么大呢?這樣的內存使用情況是正常的嗎?
要回答這些問(wèn)題,我們需要了解一下buffer與cache的含義。buffer 和 cache 是兩個(gè)在計算機技術(shù)中被用濫的名詞,放在不同語(yǔ)境下會(huì )有不同的意義。我們這里都將其放在linux內存這個(gè)語(yǔ)境中解釋。
什么是buffer
在 Linux 的內存管理中,這里的buffer 指 Linux 內存的:Buffer cache,中文可以解釋為:緩沖區緩存。Buffer cache 主要是設計用來(lái)在系統對塊設備進(jìn)行讀寫(xiě)的時(shí)候,對塊進(jìn)行數據緩存的系統來(lái)使用。
什么是cache
在Linux的內存管理中,這里的 cache 指 Linux 內存中的:Page cache,中文可以解釋為:頁(yè)面緩存。主要用來(lái)作為文件系統上的文件數據的緩存來(lái)用,尤其是針對當進(jìn)程對文件有 read/write 操作的時(shí)候。在當前的系統實(shí)現里, page cache 也被作為其它文件類(lèi)型的緩存設備來(lái)用,所以事實(shí)上 page cache 也負責了大部分的塊設備文件的緩存工作。
自動(dòng)回收 cache機制
Linux 內核會(huì )在內存將要耗盡的時(shí)候,觸發(fā)內存回收的工作,以便釋放出內存給急需內存的進(jìn)程使用。一般情況下,在內存壓力較大的情況下, buffer/cache 空間可以被釋放,以作為 free 空間分給相關(guān)進(jìn)程使用。
但是由于要回收緩存必須保證 cache 中的數據跟對應文件中的數據一致,才能對 cache 進(jìn)行釋放。所以在回收緩存時(shí)一般會(huì )造成IO使用較高的現象。因為內核要對比 cache 中的數據和對應硬盤(pán)文件上的數據是否一致,如果不一致需要寫(xiě)回,之后才能回收。
所以一般情況下不需要特意去釋放已經(jīng)使用的cache。這些cache起來(lái)的內容本來(lái)就是為了增加文件以及的讀寫(xiě)速度。
人工觸發(fā)回收cache
除了系統自己觸發(fā)回收緩存機制外,我們也可以通過(guò)下面這個(gè)腳本來(lái)清理緩存:
1. 查看目前內存使用:

2. 執行sync同步數據,防止數據或操作丟失(重要),將未寫(xiě)的系統緩沖區寫(xiě)到磁盤(pán)中。包含已修改的 i-node、已延遲的塊 I/O 和讀寫(xiě)映射文件
3. 使用/proc/sys/vm/drop_caches 清理cache

4. 查看清理后內存使用情況

可以看到一大部分cached已被回收。
drop_caches詳細文檔如下:
該文件可以設置的值分別為1、2、3。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches:表示清除 page cache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收 slab 分配器中的對象(包括目錄項緩存和 inode 緩存)。slab 分配器是內核中管理內存的一種機制,其中很多緩存數據實(shí)現都是用的 page cache。
echo 3 > /proc/sys/vm/drop_caches:表示清除 page cache 和 slab 分配器中的緩存對象。
(只有內核在2.6.16以上的才支持)
內核版本查看方法如下:

Slab分配器內存:
"Slab"表示內核Slab所占用的內存大小,slab有的可回收有的不可回收,其中可回收的通過(guò)"SReclaimable"表示,不可回收的通過(guò)"SUnreclaim"表示。
我們可以查看/proc/meminfo獲取它的值:

所以一般情況下,人工drop_caches操作是不能回收所有page cache的,它有三塊緩存是無(wú)法回收的:
1. dirty pages
2. Slab中的不可回收緩存
3. 共享內存和tmpfs,即free命令中的shared部分

在正常的業(yè)務(wù)數據庫系統中,cached較高是一件比較普遍的事情,盡量不要去手動(dòng)清緩存,畢竟它是為了提高效率而產(chǎn)生的,如果冒然釋放緩存會(huì )造成IO使用率變高,業(yè)務(wù)系統的效率也會(huì )受影響。
美創(chuàng )科技擁有強大的運維中心數據庫服務(wù)團隊,其中Oracle ACE 1人、OCM 10余人、數十名Oracle OCP、MySQL OCP、紅帽RHCA、中間件weblogic、tuxedo認證、達夢(mèng)工程師 ,并著(zhù)有《Oracle DBA實(shí)戰攻略》,《Oracle數據庫性能優(yōu)化方法和最佳實(shí)踐》,《Oracle內核技術(shù)揭秘》等多本數據運維優(yōu)化書(shū)籍。
今天的運維小技巧就分享到這了,下期再和美創(chuàng )運維團隊一起學(xué)習運維知識吧!本文轉自杭州美創(chuàng )科技有限公司公眾號(新運維新數據),如需二次轉載,請咨詢(xún)marketing@mchz.com.cn。
聯(lián)系客服