頻繁分配釋放記憶體導致的效能問題的分析

2021-05-25 01:23:58 字數 635 閱讀 2921

徵兆:1. system cpu佔用率偏高。

2. 執行命令 用ps -o majflt,minflt -c program命令檢視,majflt或者minflt每秒增量很大。

原因:頻繁的分配釋放記憶體,導致缺頁中斷次數很高。而缺頁中斷的處理是由系統在核心態完成的,所以system cpu利用率偏高,導致效能問題的產生。

解決辦法:

將動態記憶體改為靜態分配,或者啟動的時候,用malloc為每個執行緒分配,然後儲存在threaddata裡面。但是,由於這個模組的特殊性,靜態分配,或者啟動時候分配都不可行。另外,linux下預設棧的大小限制是10m,如果在棧上分配幾m的記憶體,有風險。 

禁止malloc呼叫mmap分配記憶體,禁止記憶體緊縮。

在程序啟動時候,加入以下兩行**:

mallopt(m_mmap_max, 0); // 禁止malloc呼叫mmap分配記憶體

mallopt(m_trim_threshold, -1); // 禁止記憶體緊縮

注意:1. linux記憶體分配,在超過128k時,就會呼叫mmap,而不是移動brk指標。當munmap時,會把記憶體釋放掉。

2. 釋放掉的記憶體數大於128k時,會呼叫brk緊縮邏輯。

以上兩點都會把記憶體釋放掉,導致下次申請記憶體時還會產生缺頁中斷。

頻繁分配釋放記憶體導致的效能問題的分析

現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...

頻繁分配釋放記憶體導致的效能問題的分析

現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...

頻繁分配釋放記憶體導致的效能問題的分析

現象 1 壓力測試過程中,發現被測物件效能不夠理想,具體表現為 程序的系統態cpu消耗20,使用者態cpu消耗10,系統idle大約70 2 用ps o majflt,minflt c program命令檢視,發現majflt每秒增量為0,而minflt每秒增量大於10000。初步分析 majflt...