pgoneproxy自己是使用glib來進行操做的,故有部分的內存管理功能。glib中提供了g_slice_alloc,g_slice_alloc0,g_slice_new, g_slice_new0, g_slice_free1,g_slice_free來進行內存的管理。經過這些函數來申請內存時,是根據大小到內存池或者調用系統內存分配函數來申請內存的。函數
可是pgoneproxy中使用了大量的g_new0,g_new,g_free函數,這些函數經過glib代碼能夠知道是經過直接調用系統函數來分配內存的。故會大量的調用系統的malloc以及free函數。在運行時能夠經過perf top來觀察獲得下面的狀況:優化
從上面中能夠看到_int_malloc,_int_free函數佔有很大的比例。這些函數應該就是直接調用glibc中malloc函數以及free函數致使的。目前想把這個狀況給優化掉,故採用了Google的tcmalloc。在連接時連接了/usr/local/lib/libtcmalloc_minimal.a靜態庫。這樣能夠經過tcmalloc來管理內存的申請,從而減小glibc中malloc,free函數的調用,從而減小系統函數的調用。內存
增長tcmalloc後,perf top的結果以下所示:內存管理
從上面的樣本能夠看到沒有了_int_malloc,_int_free函數了。而且經過pgbench來進行壓測,能夠看處處理能力也有提升。im