androidnative內存
A. Android內存性能
最近看到測試同事在模擬Android低內存場景,原來是測試後台Service是否能被殺死。
為了順利測試,我著手編寫了一個內存測試工具,名為Ramtool。
1. 最大可用物理內存
1.1 背景
如何完全佔用Android的物理內存,並非簡單通過new申請內存就能實現。
Android的Framework在java層,因此App進程需要啟動jvm虛擬機,運行在jvm中的程序都會受到jvm最大heap限制。
Android的jvm同樣受到system/build.prop控制,現代Android系統默認jvm啟動heap為64MB,最大擴容256MB。
1.2 方案
1.2.1 佔用內存
總體思路是擺脫android jvm,使用C/C++製作Native動態鏈接庫,直接向Linux內核申請內存。
此外,Native還可以擺脫jvm的操作時內存的cpu損耗,擺脫jvm的gc控制,實現手動釋放內存防止影響後續測試。
現代操作系統,包括Linux,都使用了虛擬內存的概念來進行進程間內存隔離。
如果只是不停通過malloc申請堆內存,即使申請的內存容量已經遠遠超過硬體物理內存,也不會發生OOM崩潰。
1.2.2 工程實現
Native OOM崩潰可能會影響進程穩定性,申請到的內存釋放也會很麻煩,所以,放到子進程里去申請heap內存,每次申請1MB,直到子進程崩潰,catch住binder的跨進程通信異常時,就判斷為可用的最大物理內存。
在大部分機型上都是沒問題的,但在部分超大內存機型上,例如realme的16GB內存機型,單進程系統限制最大內存為10GB,所以為了測試極限物理內存佔用,還要採用多進程方案。
申請完內存,記得要在每次測試完成後,即使進行內存釋放。內存泄漏會影響後續內存測試的准確性。
1.2.3 結果
6GB ram的紅米K30手機上,app最大可用的物理內存極限在4GB左右。
16GB ram的Realme手機上,app最大可用的物理內存極限在11.5GB左右。
2. 內存帶寬
2.1 背景
做完最大可用內存後,感覺做都做了,不如再做一個內存帶寬測試工具。
市面上的內存帶寬測試都太抽象了,不知道對應到代碼上具體是什麼樣的性能。
內存不像是硬碟,可以很直接看到讀寫性能。
所以應該怎樣做呢?
2.2 方案
2.2.1 開源方案
先看下開源的方案都是怎麼做的。
2.2.2 硬體原理
我們再來看下CPU的硬體工作方式。
為了最大程度利用內存帶寬,所以stream中選擇數據類型也使用了double。
所以直接用stream就完了嗎?
Stream的方案並不能最大程度發揮內存帶寬。
2.2.3 小故事
(此段故事可以跳過閱讀)
(故事結束,正文開始)
但實際上內存就是慢的一批,測試發現系統memcpy很慢,開始翻對應Android版本的Linux內核源代碼,發現歷史上Linux的內存拷貝可以簡單理解為就是個for循環,按照最小內存單位進行拷貝...
且現代處理器都支持SIMD指令,例如x86指令集陣營的SSE系列指令集,AVX指令集;arm陣營的neon指令,advanc-simd指令,還有最新arm-v9上的SVE指令,都是SIMD指令集。
使用SIMD指令對於測試內存帶寬,可以最大限度避免CPU的影響,提高帶寬。
2.2.4 最終方案
參考ARM公司最新的優化庫,分段對內存進行拷貝。
使用SIMD指令的memcpy進行內存帶寬測試,相比於stream的內存方案,內存帶寬大很多。
其他內存操作演算法參考stream。
內存帶寬測試功能截圖:
3. 緩存/內存延遲
3.1 背景
做完內存帶寬後,感覺做都做了(梅開二度),專業測試工具怎麼能少了內存延遲測試。
CPU只能操作寄存器上的數據,CPU在操作數據前必須要將數據從內存載入到寄存器。
內存太慢了,所以CPU廠商通過SRAM實現了緩存。
緩存對於程序來說是透明的,只能通過細微的逐步擴大容量訪問內存才能測得緩存延遲。
所以應該怎樣做呢?
3.2 方案
3.2.1 演算法
先看看開源是怎麼做的。
3.2.2 參數
經過多次實驗,步長取2048位元組,容量為256MB時,測試結果較為准確,且測試時長可接受。
3.2.3 數據處理
經過上面的步驟,已經可以成功取到內存延遲的數據。
將數據導入excel,先畫圖觀察下數據曲線。
首先訪問命中cache,隨著訪問容量增大,逐漸沖破cache容量,cache命中率下降。
演算法實現:
3.2.4 結果
通過數據分析,計算出cache和內存的延遲平台的均值大小,還用數據畫了個折線圖:
4. 總結
似乎目前市面上Android平台還沒有比較專業傾向的內存測試工具,簡陋封裝了下UI,發布到了github,讓大家有的用。
測試結果僅具備橫向機型間對比。
Ramtool項目地址:github.com/park671/Ramt...
拒絕白嫖,從你我做起,給個star再拿代碼~