一 內存性能指標
1、系統內存使用情況
共享內存:是通過tmpfs實現的,所以它的大小也就是tmpfs使用的大小了tmpfs其實也是一種特殊的緩存
可用內存:是新進程可以使用的最大內存它包括剩余內存和可回收緩存。
緩存包括兩部分:
1、一部分是磁盤讀取文件的頁緩存,用來緩存從磁盤讀取的數據,可以加快以后再次訪問的速度。
2、另一部分,則是 Slab 分配器中的可回收內存2、進程內存使用情況,
緩沖區是對原始磁盤塊的臨時存儲,用來緩存將要寫入磁盤的數據。這樣,內核就可以把分散的寫集中起來,統一優化磁盤寫入。
2、進程內存使用情況
虛擬內存:包括了進程代碼段、數據段、共享內存、已經申請的堆內存和已經換出的內存等。這里要注意,已經申請的內存,即使還沒有分配物理內存,也算作虛擬內存
常駐內存:是進程實際使用的物理內存,不過,它不包括 Swap 和共享內存,常駐內存一般會換算成占系統總內存的百分比,也就是進程的內存使用率。
共享內存:既包括與其他進程共同使用的真實的共享內存,還包括了加載的動態鏈接庫以及程序的代碼段等。
Swap 內存:是指通過 Swap 換出到磁盤的內存。
3、缺頁異常
兩種缺頁異常
1、可以直接從物理內存中分配時,被稱為次缺頁異常。
2、需要磁盤 I/O 介入(比如 Swap)時,被稱為主缺頁異常.
顯然,主缺缺頁異常升高,就意味着需要磁盤 I/O,那么內存訪問也會慢很多
4、內存指標思維導圖
二、內存性能工具
1、案例總結分析
首先,你應該注意到了,所有的案例中都用到了 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 所影響的進程。
2、根據指標找工具
3、根據工具找指標
三、如何迅速分析內存的性能瓶頸
1、如何定位系統瓶頸?
在實際生產環境中,我們希望的是,盡可能快地定位系統瓶頸,然后盡可能快地優化性能,也就是要又快又准地解決性能問題。
舉個最簡單的例子,當你看到系統的剩余內存很低時,是不是就說明,進程一定不能申請分配新內存了呢?當然不是,因為進程可以使用的內存,除了剩余內存,還包括了可回收的緩存和緩沖區。
所以,為了迅速定位內存問題,我通常會先運行幾個覆蓋面比較大的的性能工具,比如 free、top、vmstat、pidstat 等。
具體的分析思路主要有這幾步。
1、先用 free 和 top,查看系統整體的內存使用情況。
2、再用 vmstat 和 pidstat,查看一段時間的趨勢,,從而判斷出內存問題的類型。
3、最后進行詳細分析,比如內存分配分析、緩存 / 緩沖區分析、具體進程的內存使用分析等。
2、定位系統瓶頸流程圖
3、使用方法
第一個例子,當你通過 free,發現大部分內存都被緩存占用后,可以使用 vmstat 或者 sar 觀察一下緩存的變化趨勢,確認緩存的使用是否還在繼續增大。
如果繼續增大,則說明導致緩存升高的進程還在運行,那你就能用緩存 / 緩沖區分析工具(比如 cachetop、、slabtop 等),分析這些緩存到底被哪里占用。
第二個例子,當你 free 一下,發現系統可用內存不足時,首先要確認內存是否被緩存 / 緩沖區占用。排除緩存 / 緩沖區后,你可以繼續用 pidstat 或者 top,定位占用內占用內存最多的進程
找出進程后,再通過進程內存空間工具(比如pmap),分析進程地址空間中內存的使用情況就可以了
第三個例子,通過vmstat或者sar發現內存在不斷增長后,可以分析是否存在內存泄漏的問題,比如你可以使用內存分配工具memleak,檢查是否存在內存泄漏
問題,memleak會為你輸出內存邪路的進程以及調用堆棧。