共享內存:是經過tmpfs實現的,因此它的大小也就是tmpfs使用的大小了tmpfs其實也是一種特殊的緩存緩存
可用內存:是新進程可使用的最大內存它包括剩餘內存和可回收緩存。工具
緩存包括兩部分:性能
一、一部分是磁盤讀取文件的頁緩存,用來緩存從磁盤讀取的數據,能夠加快之後再次訪問的速度。優化
二、另外一部分,則是 Slab 分配器中的可回收內存二、進程內存使用狀況,spa
緩衝區是對原始磁盤塊的臨時存儲,用來緩存將要寫入磁盤的數據。這樣,內核就能夠把分散的寫集中起來,統一優化磁盤寫入。3d
虛擬內存:包括了進程代碼段、數據段、共享內存、已經申請的堆內存和已經換出的內存等。這裏要注意,已經申請的內存,即便尚未分配物理內存,也算做虛擬內存blog
常駐內存:是進程實際使用的物理內存,不過,它不包括 Swap 和共享內存,常駐內存通常會換算成佔系統總內存的百分比,也就是進程的內存使用率。進程
共享內存:既包括與其餘進程共同使用的真實的共享內存,還包括了加載的動態連接庫以及程序的代碼段等。內存
Swap 內存:是指經過 Swap 換出到磁盤的內存。思維導圖
一、能夠直接從物理內存中分配時,被稱爲次缺頁異常。
二、須要磁盤 I/O 介入(好比 Swap)時,被稱爲主缺頁異常.
顯然,主缺缺頁異常升高,就意味着須要磁盤 I/O,那麼內存訪問也會慢不少
首先,你應該注意到了,全部的案例中都用到了 free。這是個最經常使用的內存工具,能夠查看系統的總體內存和 Swap使用狀況。相對應的,你能夠用 top 或 ps,查看進程的內
而後,在緩存和緩衝區的原理篇中,咱們經過 proc 文件系統,找到了內存指標的來源;並經過 vmstat,動態觀察了內存的變化狀況。與 free 相比,
vmstat 除了能夠動態查看內存變化,還能夠區分緩存和緩衝區、Swap 換入和換出的內存大小。
接着,在緩存和緩衝區的案例篇中,爲了弄清楚緩存的命中狀況,咱們又用了 cachestat ,查看整個系統緩存的讀寫命中狀況,並用 cachetop 來觀察每一個進程緩存的讀寫命中狀況
再接着,在內存泄漏的案例中,咱們用 vmstat,發現了內存使用在不斷增加,又用 memleak,確認發生了內存泄漏。經過 memleak 給出的內存分配棧,咱們找到了內存泄漏的泄漏。經過 memleak 給出的內存分配棧,咱們找到了內存泄漏的可疑位置。
最後,在 Swap 的案例中,咱們用 sar 發現了緩衝區和和 Swap 升高的問題。經過 cachetop,咱們找到了緩衝區升高的根源;經過對比剩餘內存跟 /proc/zonei/zoneinfo 的內存閾,咱們發現 Swap 升高是內存回收致使的。案例最後,咱們還經過 /proc 文件系統,找出了 Swap 所影響的進程。
在實際生產環境中,咱們但願的是,儘量快地定位系統瓶頸,而後儘量快地優化性能,也就是要又快又準地解決性能問題。
舉個最簡單的例子,當你看到系統的剩餘內存很低時,是否是就說明,進程必定不能申請分配新內存了呢?固然不是,由於進程可使用的內存,除了剩餘內存,還包括了可回收的緩存和緩衝區。
因此,爲了迅速定位內存問題,我一般會先運行幾個覆蓋面比較大的的性能工具,好比 free、top、vmstat、pidstat 等。
具體的分析思路主要有這幾步。
一、先用 free 和 top,查看系統總體的內存使用狀況。
二、再用 vmstat 和 pidstat,查看一段時間的趨勢,,從而判斷出內存問題的類型。
三、最後進行詳細分析,好比內存分配分析、緩存 / 緩衝區分析、具體進程的內存使用分析等。
第一個例子,當你經過 free,發現大部份內存都被緩存佔用後,可使用 vmstat 或者 sar 觀察一下緩存的變化趨勢,確認緩存的使用是否還在繼續增大。
若是繼續增大,則說明致使緩存升高的進程還在運行,那你就能用緩存 / 緩衝區分析工具(好比 cachetop、、slabtop 等),分析這些緩存到底被哪裏佔用。
第二個例子,當你 free 一下,發現系統可用內存不足時,首先要確認內存是否被緩存 / 緩衝區佔用。排除緩存 / 緩衝區後,你能夠繼續用 pidstat 或者 top,定位佔用內佔用內存最多的進程
找出進程後,再經過進程內存空間工具(好比pmap),分析進程地址空間中內存的使用狀況就能夠了
第三個例子,經過vmstat或者sar發現內存在不斷增加後,能夠分析是否存在內存泄漏的問題,好比你可使用內存分配工具memleak,檢查是否存在內存泄漏
問題,memleak會爲你輸出內存邪路的進程以及調用堆棧。