透過Immortal Objects增加共享記憶體的使用,使得Instagram可以大幅度減少私有記憶體,降低寫入時複製(Copy-On-Write,COW)的次數

Meta在程式語言Python提出PEP-683以加入Immortal Objects,使得物件可以繞過參照計數檢查,成為在執行時持續存活的不朽物件,透過增加共享記憶體使用量,進而提高記憶體的使用效率,而這將有助於解除Python語言本身在平行運算上的局限。目前PEP-683已經被接受。

Meta使用Python網頁框架Django開發Instagram前端伺服器,並且使用多程序架構以及Python標準函式庫asyncio,以達到每個程序並行處理的目標,但因為Instagram無論是在業務邏輯還是處理的請求量,規模都十分龐大,這個方法對記憶體的大量需求,成為了系統的效能瓶頸。

隨著系統運作,每個伺服器程序的私有記憶體使用增加,而共享記憶體減少,這樣的現象造成記憶體效率不彰。開發人員分析發現,即便許多Python物件在整個執行時不可變,但是Python的參照計數和垃圾回收機制,仍然會試圖管理並修改這些物件,在每次讀取和垃圾回收周期仍會執行寫入時複製(Copy-On-Write,COW),使得原本共享的記憶體分頁變成私有,如此便減少了共享記憶體的效益,增加了不必要的CPU和記憶體開銷。

PEP-683的出現便是為了解決這個問題,Immortal Objects在物件的參照計數欄位中,標記特殊值以創建不朽物件,也就是核心物件狀態永遠不會改變的物件,Runtime會知道什麼時候可以或是不可以改變參照計數欄位和垃圾回收標頭。

不過,由於Immortal Objects的核心實作,在參照計數增加和減少的程序中添加了明確的檢查,這兩個程序是被Runtime頻繁執行的程式碼,因此無法避免地造成程式碼效能下降,經過特殊的暫存器分配策略,可以最大程度減少效能降低,但是仍有約2%的效能影響。

在Instagram中,本來是透過減少寫入時複製操作,提高處理請求記憶體和CPU效率,而由於Immortal Objects的加入,Instagram便可以透過增加共享記憶體使用量,來大幅減少私有記憶體的使用。由於Immortal Objects可以跨執行緒共享物件,不在需要GIL(Global Interpreter Lock)達到執行緒安全性,Meta提到,這項功能影響了Python語言的發展,由於Immortal Objects保證堆物件真正的不可變性,因此也解除Python在平行運算的限制。

熱門新聞

Advertisement