完全是本著記憶體吃緊的情況下的一些優化點,都是在文件有介紹的,自己多除錯下就出來了,好不好用,還請自己評估,這裡只是給出一些點的介紹。本著有坑也不填的原則,這裡只做交流使用,後果自負。
海思的安防平台晶元的記憶體主要劃分兩部分來管理,一部分是系統使用的os記憶體,一部分是稱為mmz的記憶體,具體這兩部分如何配置和使用的,文件中已有相當清析的描述了,這裡主要介紹一下海思mpp業務裡mmz如何節省記憶體的一般基本方法。
當然,如果你的記憶體足夠富足,基本按海思給的sample的配置方式就好了,但一些記憶體比較緊的時候,還是可以做一些工作來優化節省出一定的記憶體的。
在介紹前,先了解下海思mpp的一些除錯工具,主要還是依賴 /proc裡的一些資訊來優化。
mpp日記 /dev/logmpp
這個檔案裡的日記資訊,相當重要,在開發海思平台的mpp業務時,是否有錯誤,有不合理的地方,都有可能這裡發現,如果你不會使用這個資訊,說明你還真沒太了解mpp業務裡的東西。
這個檔案會列印當前sdk mpp的一些當前執行資訊,這個是有個級別可以除錯的,如果你想看更詳細的資訊就把列印的級別調低點,缺省會列印警告和錯誤信,我們在除錯記憶體時就有可能你把記憶體調得過低了,mpp報錯時,最直接的表現即在這裡。
mmz記憶體分配 /proc/media-mem
這裡記錄了當前mmz記憶體被分配至哪些模組,被誰使用了。
/proc/umap/*
各個模組的除錯資訊,當然也包括記憶體的一些使用情況。
以上這些資訊,在他的sdk的文件中都有提及介紹了,詳細的還是需要細細讀一下他的文件。
現在新出的sdk裡海思也給出了乙個xls的文件來配置mmz的一些使用情況,可以參考他的各個模組的記憶體使用進行優化。
在海思的mpp裡,有乙個vb管理記憶體池的概念,也就是先根據自己各個模組需要的記憶體,預先分配好一定的記憶體,各個模組用時從這個池中去取,像他文件裡的這個圖說的:
可以為各個模組分配不同的vb記憶體塊。
以為vi分配記憶體為例,一般乙個vi通道占用2個vb塊,如果你的乙個vi的影象通道大小是1080p,那有幾個vi通道的影象進來,就對應的分配相應的vb塊。
如果使用的vb塊大小不同,那就盡量分配不同大小的vb塊,mpp會從分配的陣列裡,從小到大的找到乙個合適的記憶體塊使用。
如何確認你分配的記憶體塊數量是否足夠?
在/proc/umap/vb中
如以下資訊:
iscomm為1時表示是你自己分配的vb記憶體池,blkcnt是分配的數量,free是表示當前空閒的個數,minfree表示歷史中最小的空閒個數,如果free大於0,表示當前使用的是夠的,如果minfree大於0,表示一直有記憶體塊是空閒的。
如何分最少的記憶體塊,不浪費,又不影響業務呢?
還是看minfree值,調小vb的記憶體塊分配,當minfree為0時,並且/dev/logmpp裡一直沒有報使用這個大小vb池的模組的錯誤,那麼就是合適的,記憶體塊也就沒有浪費了。
如何合理分配記憶體塊大小
vb分配就是乙個是塊的數量,塊的大小,不同模組需要不同大小的塊時,分別為其分配不同的vb大小的塊池,這樣一般就不會有什麼內存在這上面浪費了。
下面還是以業務的方式來介紹一下mmz記憶體使用的一些可以優化的方法。
各個模組使用記憶體塊的大小及數量
每個模組使用的記憶體塊的數量,及大小在不同的晶元上有一些小的差異,建議還是參考海思給出的mpp中模組記憶體計算的那個xls文件。
在檢視vb塊時,如果一些模組佔著vb塊一直不放,你分配再多的記憶體都沒用,那就要考慮一下是不是效能不夠了,在效能不夠的情況下,一些模組會一直佔著記憶體塊不能釋放。
vpss
vpss通道一般可以預先建立放在那裡,也不會占用太多的記憶體,一般我是把業務需要的vpss建立好不釋放。
有乙個backup屬可以關注一下,這個可以節省不少記憶體,但***也是相當明顯的啦!
還有各個通道的功能使用,不過之前記憶體收益也不太明顯,看最近新出的sdk裡有一些新新增進來的功能,沒有去試過了。
venc
venc是個記憶體大戶啊,先確認你使用venc的記憶體分配方式,後端的晶元一般都是三種,也就是文件中說的:編碼幀存方式
這裡以hi3521a為例,支援兩種方式,一種是privatevb,一種是uservb,具體的記憶體計算方式見文件,這裡如查為了節省記憶體,就用uservb方式了。
編碼重構幀復用參考幀亮度記憶體模式,也是乙個直接記憶體節省收益的配置。
碼流buff的配置:這個有兩種方式,一般模式和省記憶體方式,***也比較高啊,自己評估,如果記憶體緊張,也是乙個有效的記憶體節省收益的配置。
vecn的通道建立起來就是需要占用比較大的記憶體的,一般通道動態的建立,不過dvr中一般都是實時在錄相,所以這個一般情況下都是一直建立的。
vo輸出這乙個,乙個fb的配置上根據自己最大的解析度指定合適的記憶體大小,把不用的fb輸出的記憶體配置去掉(load指令碼裡).
再乙個就是vo輸出的一些快取配置,如hi_mpi_vo_setdispbuflen使用等。
vdec
vdec也很佔記憶體,在dvr裡一般按需建立vdec,不用進就把他銷毀掉吧,放在那也是很佔記憶體的。
同venc一樣有乙個編碼幀存方式和碼流buff的配置,如果是回放自身的錄相還好吧,venc相應的配置對應的節省記憶體配置也無太多的問題。
另乙個是回放方式的選擇上,在回放時,如果效能不夠的情況下,記憶體有可能也被一直佔著不釋放,你可以使用預覽模式試試,這個***就是會丟幀啊!
nvr的產品基本同dvr的方式的優化方法類似。最多的也是vdec,venc上下做功夫,不重複講了。
ipc產品這裡以3518ev200為例來說一些,因為這傢伙只有64mb的記憶體,看過一些人做的產品記憶體上還是非常吃緊的。
這裡以1080p@20fps + vga@25fps為例說明,mmz記憶體使用上大概在22mb這樣子。
2:vpss開啟lowdelay,把vpss,vpss兩個通道,乙個是1080p的主碼流,乙個是vga的子碼流,把主碼流的通道同venc的編碼主通道繫結在一起。
2:venc,開啟h264eminibufmode,jpegeminibufmod,h264ercnequalref開啟,根據這些配置,計算編碼的記憶體大小。
基本也就是上面這些點吧,最重要的兩個方面的優化,乙個是vb池的使用上,dvr的venc,nvr的vdec,ipc的venc這些文件如都有提及的。同時注內占用mmz大塊記憶體的地方,看是否有合適的方式修改。
最主要的還是檢視/proc/umap裡的執行資訊,檢視各個模組的vb、記憶體使用情況,是否有報錯等。
同樣除錯完記憶體,還是得檢視/proc/umap裡的資訊是否正常,如vi裡的vb塊申請情況,是否有失敗的問題,h264e裡是否有丟失影象,掉幀。
HISI(海思)平台MMZ記憶體
os記憶體和mmz記憶體 海思平台記憶體主要劃分兩部分,一部分是系統使用的os記憶體,一部分是mmz的記憶體。os就是作業系統的記憶體,會隨著程序的退出而自動釋放,而mmz只要是給海思的mpp系統,還有nnie引擎等硬體資源使用的,如果不手動釋放的話,即使程序退出,也不會自動釋放。會導致多次啟動退出...
海思mpp學習(4) mpp各模組介紹
關於每個模組的具體功能和使用,可以通過後面的例子邊學習邊了解,剛開始先簡單了解即可。mpp 提供系統繫結介面 hi mpi sys bind 即通過資料接收者繫結資料來源來建立兩者之間的關聯關係 只允許資料接收者繫結資料來源 繫結後,資料來源生成的資料將自動傳送給接收者。模式說明 模式vi cap ...
海思mpp編碼完整流程
系統初始化 sys int 5 配置mipi 6 初始化isp 7 執行isp執行緒 8 配置開啟vi 裝置捕獲 9 配置開啟vi 通道捕獲 10 建立vpss的group 11 獲取,配置group屬性 12 啟動group 13 繫結vi到vpss的group 14 配置vpss的通道chn屬性...