Linux性能優化實戰學習筆記:第二十一講


一 內存性能指標

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會為你輸出內存邪路的進程以及調用堆棧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM