性能调优主要是对CPU,磁盘IO,网络IO,内存等方面进行调优。
一,CPU
1,上下文切换
上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程。
上下文是指某一时间点 CPU 寄存器和程序计数器的内容。寄存器是 CPU 内部的数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统。
稍微详细描述一下,上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:
- 挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,
- 在内存中检索下一个进程的上下文并 将其在 CPU 的寄存器中恢复,
- 跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。
上下文切换的消耗
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。
Linux 号称的相比于其他的操作系统(包括其他类 Unix 系统)的很多优点中,有一项就是,其上下文切换和模式切换的时间消耗非常少。
2,利用率
利用率为CPU在用户进程,内核,中断处理,IO等待以及空闲5个部分使用百分比。Linux And System Network Performance Monitoring建议用户进程和内核进程的CPU消耗分别是65%-70%,30%-35%。
在liunx中可以使用top或者pidstat查看CPU的消耗情况。
在java应用中,CPU消耗主要在us,sy上。
US
US:用户进程处理所占的百分比
当us过高时,表明应用消耗了大量的CPU。在这种情况下,需要找到具体消耗CPU的线程所执行的代码。
SY
SY:内核线程所占的百分比
当sy过高时,表示linux花费了过多的时间在进程切换上面。java应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数处于不断阻塞的状态和执行状态的变化过程中,产生了大量的上下文切换。
通过jstack -l pid 查看线程争用。可以看到TIMED_WAITING(on object monitor)状态和Runnable转换中。
二,磁盘IO
在linux中,要查看线程的磁盘IO消耗,主要方法是通过pidstat。
使用pidstat找到文件IO操作多的线程,之后结合jstack找到对应的java代码。
三,网络IO
在linux中,通过sar来分析网络IO的状况。如果需要跟踪tcp的通信信息,需要使用tcpdump来进行。
四,内存消耗
通过jmap,jstat,mat,visualVM来分析
PS:本文总结自《分布式JAVA应用 基础与实践》—-林昊