1 结论
通过本次性能优化,总结了几条经验。
■频繁的加解锁会提高系统空间的CPU占用率
锁在内核的实现是通过队列来实现的,加锁操作把线程放入等待队列,解锁操作是才能够等待队列获取一个线程来获取锁。所以频繁的加解锁CPU的开销是非常大的。
■锁和线程的数量是两个矛盾体。
对于固定数量的锁,线程的数量并非越多越好。我们需要在两者之间找平衡点。如何来找?通过测试找出最优值。
■多CPU环境下的CPU瓶颈问题的定位
在多CPU环境中,如果某个CPU占用率接近100%,可以得出这样的结论,某个线程的粒度太大造成了CPU使用率不均衡,可以通过减小线程粒度来解决这个问题。
如果每个CPU的占用率远小于100%,不能得出CPU不是瓶颈的结论,本文就是一个典型的案例。当处理某个任务的线程数量不够,且线程有等待的操作(比如:加锁动作,sleep动作),等待的操作可以使得线程在各个CPU之间均衡的调度,从而使得我们看到各个CPU的占用率分布均衡并且比较低。这种性能问题只能通过结合应用代码来进行定位,在本文中通过观察队列的大小来的得出CPU是瓶颈的结论。这种问题的解决方案是增加线程数量。
2 问题的提出
PROCESSOR进程运行在12G内存,12个CPU的服务器上,性能运行参数如下:
|
CPU total% |
CPU sy% |