linux性能優化實戰-內存性能指標

轉自:https://blog.csdn.net/san_77227487/article/details/87938546

https://blog.csdn.net/zxcc1314/article/details/86751559ios

內存映射

Linux內核給每一個進程提供了一個獨立的連續虛擬地址空間(獨立!能夠將進程內存隔離)。緩存

每一個進程的虛擬地址分爲內核空間和用戶空間。但內核空間,其實關聯的都是相同的物理內存。進程用戶態只能訪問用戶空間內存;內核態能夠訪問內核空間內存。ide

內存映射就是將虛擬內存地址映射到物理內存地址,內核爲每一個進程都維護了一張頁表,記錄映射關係。
頁表實際存儲在CPU的內存管理單元MMU中,頁表還有一個緩衝TLB(Translation Lookaside Buffer,轉譯後備緩衝器)。函數

頁的大小爲4KB,爲了解決頁過多,Linux提供了兩種機制多級頁表和大頁(HugePage)。
多級頁表就是把內存分紅區塊來管理,將原來的映射關係改爲區塊索引和區塊內的偏移,這樣能夠大大減小頁表的項數。(其實也能夠直接映射正使用的頁,但這會致使頁不連續,不能使用偏移量查找)
Linux使用四級頁表管理內存頁。工具

大頁就是比普通頁更大的內存塊。性能

當訪問虛擬地址在頁表中找不到時,會產生缺頁異常,進入內核空間分配物理內存、更新進程頁表,最後再返回用戶空間,恢復進程的運行。.net

虛擬內存空間分佈3d

上圖爲32位系統虛擬內存空間分佈。
除內核空間外,用戶空間內存,從低到高分別是五種不一樣內存段。對象

只讀段,包括代碼和常量等。
數據段,包括全局變量等。
堆,包括動態分配的內存,從低地址開始向上增加。
文件映射段,包括動態庫、共享內存等,從高地址開始向下增加。
棧,包括局部變量和函數調用的上下文等。棧的大小是固定的,通常是 8 MB。
好比說,使用 C 標準庫的 malloc() 或者 mmap() ,就能夠分別在堆和文件映射段動態分配內存。blog

內存分配
malloc()兩種實現方式:

對小塊內存(小於 128K),C 標準庫使用 brk() 來分配,經過移動堆頂的位置來分配內存。這些內存釋放後並不會馬上歸還系統,而是被緩存起來,這樣就能夠重複使用。
大塊內存(大於 128K),使用內存映射 mmap()在文件映射段找一塊空閒內存分配。釋放時直接歸還給系統。
在內核空間,Linux 則經過 slab 分配器來管理小內存。能夠把 slab 當作構建在夥伴系統上的一個緩存,主要做用就是分配並釋放內核中的小對象。

malloc() 申請內存後,內存並不會當即分配,而是在首次訪問時,才經過缺頁異常陷入內核中分配內存。

理解內存中的Buffer和Cache
man free ,能夠看到buffer 和 cache 的說明:

Buffers 是內核緩衝區用到的內存,對應的是 /proc/meminfo 中的 Buffers 值。
Cache 是內核頁緩存和 Slab 用到的內存,對應的是 /proc/meminfo 中的 Cached與 SReclaimable 之和。
man proc,關於meminfo 說明:

Buffers 是對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,一般不會特別大(20MB 左右)。
Cached 是從磁盤讀取文件的頁緩存,也就是用來緩存從文件讀取的數據。
SReclaimable 是 Slab 的一部分。Slab 包括兩部分,其中的可回收部分,用 SReclaimable 記錄;而不可回收部分,用 SUnreclaim 記錄。

1、IO性能指標

2、IO性能工具

3、基本思路

1. 先用 iostat 發現磁盤 I/O 性能瓶頸;

2. 再借助 pidstat ,定位出致使瓶頸的進程;

3. 分析進程的 I/O 行爲;

4. 結合應用程序的原理,分析這些 I/O 的來源。

相關文章
相關標籤/搜索