效能中的記憶體分析要注意的地方

2021-09-30 10:43:04 字數 2433 閱讀 8612

昨天做了一晚上的效能,發現web伺服器的效能指標都很正常,只有記憶體的free一直在減少而cache一直在增加,剛開始還認為這是有問題的呢,後來通過分析發現者並不算是記憶體的問題,而且這是正常的,所以拿來給大家分享一下:

開始,先從free命令說起。free 命令相對於top提供了更簡潔的檢視系統記憶體使用情況:

# free

total       used       free     shared    buffers     cached

mem:       4129428    2830048    1299380          0     208524    1838492

-/+ buffers/cache:     783032    3346396

swap:      4192956          0    4192956

解釋下各個引數的意思:

mem:表示物理記憶體統計

-/+ buffers/cached:表示物理記憶體的快取統計。

swap:表示硬碟上交換分割槽的使用情況,這裡我們不去關心。

系統的總物理記憶體:4129428(4096mb),但系統當前真正可用的記憶體並不是第一行free 標記的 2830048,它僅代表未被分配的記憶體。

單位為mb的檢視方法:

# free -m

total       used       free     shared    buffers     cached

mem:          4032       2764       1268          0        203       1795

-/+ buffers/cache:        765       3267

swap:         4094          0       4094

我們使用totala、useda、freea、usedb、freeb等名稱來代表上面統計資料的各值,a和b分別代表第一行和第二行的資料。

[totala] 4032:表示物理記憶體總量。

[useda] 2764:表示總計分配給快取(包含buffers 與cache )使用的數量,但其中可能部分快取並未實際使用。

[freea] 1268:未被分配的記憶體。

[shareda] 0 :共享記憶體,一般系統不會用到,這裡也不討論。

[buffersa] 203:系統分配但未被使用的buffers 數量。

[cacheda] 1795:系統分配但未被使用的cache 數量。buffer 與cache 的區別見後面。

[usedb] 771:實際使用的buffers 與cache 總量,也是實際使用的記憶體總量。

[freeb] 3261:未被使用的buffers 與cache 和未被分配的記憶體之和,這就是系統當前實際可用記憶體。

可以整理出如下等式:

totala = useda + free1

totala = used2 + free2

useda = buffersa + cacheda + usedb

freeb = buffersa + cacheda + freea

buffer 與cache 的區別

a buffer is something that has yet to be "written" to disk. a cache is something that has been "read" from the disk and stored for later use.

對於共享記憶體(shared memory),主要用於在unix 環境下不同程序之間共享資料,是程序間通訊的一種方法,一般的應用程式不會申請使用共享記憶體,筆者也沒有去驗證共享記憶體對上面等式的影響。

cache 和 buffer的區別:

cache:快取記憶體,是位於cpu與主記憶體間的一種容量較小但速度很高的儲存器。由於cpu的速度遠高於主記憶體,cpu直接從記憶體中訪問資料要等待一定時間週期,cache中儲存著cpu剛用過或迴圈使用的一部分資料,當cpu再次使用該部分資料時可從cache中直接呼叫,這樣就減少了cpu的等待時間,提高了系統的效率。cache又分為一級cache(l1 cache)和二級cache(l2 cache),l1 cache整合在cpu內部,l2 cache早期一般是焊在主機板上,現在也都整合在cpu內部,常見的容量有256kb或512kb l2 cache。

buffer:緩衝區,乙個用於儲存速度不同步的裝置或優先順序不同的裝置之間傳輸資料的區域。通過緩衝區,可以使程序之間的相互等待變少,從而使從速度慢的裝置讀入資料時,速度快的裝置的操作程序不發生間斷。

free中的buffer和cache:(它們都是占用記憶體):

buffer : 作為buffer cache的記憶體,是塊裝置的讀寫緩衝區

cache: 作為page cache的記憶體, 檔案系統的cache

如果 cache 的值很大,說明cache住的檔案數很多。如果頻繁訪問到的檔案都能被cache住,那麼磁碟的讀io 必會非常小。

ITextField要注意 的地方

textfield uitextfield alloc initwithframe cgrectmake 100,14,205,20 textfield.placeholder input sms filter content textfield.font uifont systemfontofsi...

textFiled要注意的地方

原帖 textfield uitextfield alloc initwithframe cgrectmake 100,14,205,20 textfield.placeholder input sms filter content textfield.font uifont systemfonto...

Toast要注意的地方

乙個小demo,無意間,在子執行緒中toast了一把,竟然報錯了 因為toast在service和activity中都可以執行。所以開始就認為和ui執行緒沒有有太大的關係,而現在子執行緒toast竟然報錯!無奈之下,花了半天的時間看了一下handler,looper,toast的原始碼,終於搞定了。...