最近项目里面一个模块随着线程的增加性能急速下降,debug了很长时间之后发现瓶颈在rand函数,把rand去掉之后性能提高很多,从400us到200us。
网上找到很多也没人说这个rand函数有什么性能问题,通过查看glibc的source code random.c 发现在这个函数里面用到了锁,如下:
long int
__random (void)
{
int32_t retval;
__libc_lock_lock (lock);
(void) __random_r (&unsafe_state, &retval);
__libc_lock_unlock (lock);
return retval;
}
应该就是这个锁导致了多线程性能下降,但是code逻辑需要用到rand,后来在dpdk里面找到了rte_rand函数,试了一下效果很好,没有多线程性能问题。继续查看dpdk的source code, rte_rand函数没有用锁。