当我们系统有问题的时候,不要急于去调查我们代码
首先要看的是操作系统的报告,看看操作系统的CPU利用率,看看内存使用率,看看操作系统的IO,还有网络的IO,网络链接数,等等
Windows下的perfmon是一个很不错的工具,Linux下也有很多相关的命令和工具,比如:SystemTap,LatencyTOP,vmstat,sar,iostat,top,tcpdump等等
通过观察这些数据,就可以知道性能问题基本上出在哪里
(1)先看CPU利用率,如果CPU利用率不高,但是系统的吞吐量和系统延迟指标上不去,这说明我们的程序并没有忙于计算,而是忙于别的一些事,比如IO
CPU的利用率还要看内核态的和用户态的,内核态的上去了,整个系统的性能就下来了,对于多核CPU来说,CPU 0是相当关键的,如果CPU 0的负载高,那么会影响其它核的性能,因为CPU各核间是需要有调度的,这靠CPU 0完成
(2)看一下IO大不大,IO和CPU一般是反着来的,CPU利用率高则IO不大,IO大则CPU就小
关于IO,我们要看三个事
1)磁盘文件IO
2)驱动程序的IO(如:网卡)
3)内存换页率
(3)查看一下网络带宽使用情况,在Linux下,可以使用 iftop,iptraf,ntop,tcpdump 这些命令来查看,或是用 Wireshark 来查看
(4)如果CPU不高,IO不高,内存使用不高,网络带宽使用不高,但是系统的性能上不去,这说明你的程序有问题,比如,你的程序被阻塞了,可能是因为等哪个锁,可能是因为等某个资源,或者是在切换上下文
通过了解操作系统的性能,我们才知道性能的问题,比如:带宽不够,内存不够,TCP缓冲区不够,等等,很多时候,不需要调整程序的,需要我们更好的了解硬件和系统状况