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来进行压测,可以看到处理能力也有提高。
来源:oschina
链接:https://my.oschina.net/u/918218/blog/701287