calloc在4u和5u上效能差異的分析

2021-05-28 07:20:44 字數 1747 閱讀 5734

年初在維護乙個http server程式的時候,發現5u下效能比4u下降了一倍不止。最後通過程式埋點的方法確認,問題出在calloc呼叫上。程式上有一段邏輯,每來乙個鏈結,通過calloc申請一塊2m的空間,在5u下calloc效能下降厲害。當時通過malloc+欄位例項化的方式替換了calloc,解決了這個問題,沒有太往下糾結。

今天收到封郵件,也是程式從4u公升級到5u下,效能下降嚴重,最後定位到也是calloc的問題;但他們更進一步,分析了為啥calloc效能會下降,很不錯,這裡分享下。

大致的意思是:calloc效能下降是由於glibc版本不同引起的,在5u下記憶體分配的策略和4u不同。記憶體分配有兩種方式:brk呼叫,或mmap呼叫;對於小空間一般在brk中分配,大空間通過mmap分配。在4u中,大小空間的閥值是定死的128k,在5u下這個閥值是動態調整的,最大可以到32m。由於分配的都是大空間,由於這個策略調整,在4u下calloc空間是通過mmap獲得的,5u下是通過brk獲得的。mmap分配的空間有乙個特點:不發生讀寫操作是不會分配實際物理記憶體的;載入記憶體時,系統會把page全部清零。所以在4u下,calloc分配大記憶體的效率跟malloc效率差不多;而在5u下,由於在brk中分配,必須要做一次清零操作;這就是問題了。

從應用上,建議不要使用calloc函式,而改用malloc+例項化。

先簡要總結一下速度降低的原因:

1.        4u和5u的glibc版本不同,分別是2.3.4和2.5.

2.        glibc中記憶體分配使用的是ptmalloc,ptmalloc在2023年有乙個改動,體現到了glibc2.5中,以前(glibc2.3.4)觸發mmap的閾值是固定的,是128k,超過128k的記憶體申請都是通過mmap申請的,小於128k的記憶體申請使用brk;這次改動(glibc2.5)對於mmap的使用是動態調整閾值的,預設是128k,但是如果有超過128k的記憶體通過mmap申請、釋放,那麼觸發mmap的閾值會被調整,有可能會變大。 這個調整的原因是因為mmap的開銷比較大,而且現在記憶體也越 來越便宜,頻繁分配臨時記憶體也比以前大,所以系統更傾向於使用brk來降低開銷。如果使用者申請了大內 存又釋放了,那麼系統認為,可能這個程式對大記憶體的申請和釋放是平常的事情,所以會把mmap的閾值調大,減小mmap的呼叫次數,改用開銷更小的brk。

3.        malloc不負責將申請的記憶體區域清零,但calloc負責。

4.        核心在分配匿名頁時為了保證安全,不會被這個程序讀到其他程序已經釋放的空間,會做清零的工作。但如果分配的不是匿名頁,比如是由mmap檔案導致的分配頁,不會清零。對 於mmap申請的匿名頁記憶體的清零,是發生 在缺頁時,由作業系統保證。brk分配的記憶體,需要calloc自己清零。

5.        如果沒有寫記憶體,只是mmap申請了一塊虛擬記憶體,不會發生缺 頁,沒有分配物理記憶體,也不會引起清零的操作。一般作業系統中4k為1頁。

6.        pidmatch由於邏輯調整,以前每次呼叫需要 申請一塊超過128k的記憶體,且通過calloc呼叫。但現在實際上不需要那麼大 記憶體,申請了也沒有寫那麼多頁。所以在glibc2.3.4下,通過mmap申請記憶體,但沒有觸發很多缺頁, 所以其實很多清零的操作也沒有做,而在glibc2.5下 面,觸發mmap的閾值會自動變大,通過brk來分配記憶體,無論是否寫了記憶體, 都會做清零操作,所以導致模組變大,效能下降。本來是ptmalloc乙個改進的設計,但由於程式使用 不當,優點倒成了缺點。

7.        改進方法:由於模組實際不需要那麼多記憶體,且現在也不需要清零,所以將申請記憶體改小,從使用calloc改為使用malloc,效能恢復到4u的狀態。

美超微推出4U人工智慧推論優化新GPU伺服器

這款新伺服器支援多達20個nvidia tesla t4加速器 推論優化系統可拓展美超微的領先 gpu伺服器組合,為客戶提供前所未有的人工智慧推論 培訓與深度學習解決方案選擇,包括單根 雙根 縱向擴充套件和橫向擴充套件設計 加州聖何塞2018年9月20日電 美通社 企業計算 儲存 網路解決方案和綠色...

rhel5U4下掛在ntfs檔案系統

fuse ntfs 3g 完了後,編譯安裝 1 先安裝fuse軟體 root server1 tar xvzf fuse 2.8.1.tar.gz root server1 cd fuse 2.8.1 configure make make install 2 安裝ntfs 3g軟體 root se...

慕課筆記 U4 多型 第5節 UML簡介

第5節 uml簡介 1 uml概念 unified modeling language uml 又稱統一建模語言或標準建模語言,是乙個支援模型化和軟體系統開發的圖形化語言,為軟體開發的所有階段提供模型化和視覺化支援。2 uml圖示 uml2.2中一共定義了14種圖示 diagrams 3 常用uml...