天天看點

Linux性能優化3.1 記憶體性能統計資訊

<b>摘要</b>

性能工具:系統記憶體

本章概述了系統級的linux記憶體性能工具。本章将讨論這些工具可以測量的記憶體統計資訊,以及如何使用各種工具收集這些統計結果。閱讀本章後,你将能夠:

了解系統級性能的基本名額,包括記憶體的使用情況。

明白哪些工具可以檢索這些系統級性能名額。

<b></b>

<b>3.1 記憶體性能統計資訊</b>

每一種系統級linux性能工具都提供了不同的方式來提取類似的統計結果。雖然沒有工具能顯示全部的資訊,但是有些工具顯示的統計資訊是相同的。本章開始将對這些統計資料的詳細資訊進行說明,之後在介紹工具時會引用這些描述。

3.1.1 記憶體子系統和性能

在現代處理器中,與cpu執行代碼或處理資訊相比,向記憶體子系統儲存資訊或從中讀取資訊一般花費的時間更長。通常,在cpu執行指令或處理資料前,它會消耗相當多的空閑時間來等待從記憶體中取出指令和資料。處理器用不同層次的高速緩存(cache)來彌補這種緩慢的記憶體性能。工具,如oprofile,可以顯示各種處理器高速緩存缺失所發生的位置。

3.1.2 記憶體子系統(虛拟存儲器)

任何給定的linux系統都有一定容量的ram或實體記憶體。在這個實體記憶體中尋址時,linux将其分成塊或記憶體“頁”。當對記憶體進配置設定或傳送時,linux操作的機關是頁,而不是單個位元組。在報告一些記憶體統計資料時,linux核心報告的是每秒頁面的數量,該值根據其運作的架構可以發生變化。清單3.1建立了一個小的應用程式來顯示目前架構中每一頁的位元組數。

清單3.1

對ia32架構而言,頁面大小為4kb。極少數情況下,這些頁面大小的記憶體塊會導緻極高的跟蹤開銷,是以,核心用更大的塊來操作記憶體,這些塊被稱為hugepage(大頁面)。它們的容量為2048kb,而不是4kb,這大大降低了管理龐大記憶體的開銷。某些應用,如oracle,用這些大頁面加載記憶體中的大量資料,同時又最小化linux核心的管理開銷。如果hugepage不能完全被填滿,就會浪費相當多的記憶體。一個半填充的普通頁面浪費2kb記憶體,而一個半填充的hugepage就會浪費1024kb的記憶體。

linux核心可以分散收集這些實體頁面,向應用程式呈現出一個精心設計的虛拟記憶體空間。

3.1.2.1 交換(實體記憶體不足)

所有系統ram晶片的實體記憶體容量都是固定的。即使應用程式需要的記憶體容量大于可用的實體記憶體,linux核心仍然允許這些程式運作。linux核心使用硬碟作為臨時存儲器,這個硬碟空間被稱為交換分區(swap space)。

盡管交換是讓程序運作的極好的方法,但它卻慢的要命。與使用實體記憶體相比,應用程式使用交換的速度可以慢到一千倍。如果系統性能不佳,确定系統使用了多少交換通常是有用的。

3.1.2.2 緩沖區(buffer)和緩存(cache)(實體記憶體太多)

相反,如果你的系統實體記憶體容量超過了應用程式的需求,linux就會在實體記憶體中緩存近期使用過的檔案,這樣,後續通路這些檔案時就不用去通路硬碟了。對要頻繁通路硬碟的應用程式來說,這可以顯著加速其速度,顯然,對經常啟動的應用程式而言,這是特别有用的。應用程式首次啟動時,它需要從硬碟讀取;但是,如果應用程式留着緩存中,那它就需要從更快速的實體記憶體讀取。這個硬碟緩存不同于前面章節提到的處理器緩存。除了oprofile、valgrind和kcachegrind之外,大多數工具在報告“緩存”的統計資訊時實際指的是硬碟緩存。

除了高速緩存,linux還使用了額外的存儲作為緩沖區。為了進一步優化應用程式,linux為需要被寫回硬碟的資料預留了存儲空間。這些預留白間被稱為緩沖區。如果應用程式要将資料寫回硬碟,通常需要花費較長時間,linux讓應用程式立刻繼續執行,但将檔案資料儲存到記憶體緩沖區。在之後的某個時刻,緩沖區被重新整理到硬碟,而應用程式可以立即繼續。

高速緩存和緩沖區的使用使得系統内空閑的記憶體很少,這會讓人感到洩氣,但這未必是件壞事。預設情況下,linux試圖盡可能多的使用你的記憶體。這是好事。如果linux偵測到有空閑記憶體,它就會将應用程式和資料緩存到這些記憶體以加速未來的通路。由于通路記憶體的速度比通路硬碟的速度快了幾個數量級,是以,這就可以顯著地提升整體性能。如果系統需要緩存空間做更重要的事情,那麼緩存空間将被擦除并交給系統。之後,對原來被緩存對象的通路就需要轉向硬碟來滿足。

3.1.2.3 活躍與非活躍記憶體

活躍記憶體是指目前被程序使用的記憶體。不活躍記憶體是指已經被配置設定了,但暫時還未使用的記憶體。這兩種類型的記憶體沒有本質上的差別。需要時,linux找出程序最近最少使用的記憶體頁面,并将它們從活躍清單移動到不活躍清單。當要選擇把哪個記憶體頁交換到硬碟時,核心就從不活躍記憶體清單中進行選擇。

3.1.2.4 高端與低端記憶體

對擁有1gb或更多實體記憶體的32位處理器(比如ia32)來說,linux管理記憶體時必須将其分為高端與低端記憶體。高端記憶體不能直接被linux核心通路,而是必須在使用前映射到低端記憶體範圍内。64位處理器(比如amd64/em6t、alpha或itanium)沒有這個問題,因為它們可以直接尋址目前系統可用的額外記憶體。

3.1.2.5 核心的記憶體使用情況(分片)

除了應用程式需要配置設定記憶體外,linux核心也會為了記賬的目的消耗一定量的記憶體。記賬包括,比如跟蹤從網絡或磁盤i/o來的資料,以及跟蹤哪些程序正在運作,哪些正在休眠。為了管理記賬,核心有一系列緩存,包含了一個或多個記憶體分片。每個分片為一組對象,個數可以是一個或多個。核心消耗的記憶體分片數量取決于使用的是linux核心的哪些部分,而且還可以随着機器負載類型的變化而變化。

繼續閱讀