服务器性能问题一般有两种:
高内存占用、高CPU占用,比如应用程序高内存占用,可能是因为文件读写、频繁的IO、内存频繁GC,进一步占用了内存和CPU;比如应用程序高CPU占用,可能是因为大任务计算、死循环、卡死、不断超时或者重试。所以需要具体问题具体分析。
高内存占用现象是应用响应慢、内存溢出、应用进程直接死掉。体现到代码里面可能是死锁和饥饿,因为资源不释放;需要关注,空闲可用内存还有多少,buff[(Page Cache)是一种高速缓存,用于CPU和内存之间的缓冲 ,是文件系统的cache。]和cache还有多少;
高CPU占用现象是应用进程还活着,但是页面出不来,不响应。体现到代码里面可能是存在活锁。在CPU占用高的情况下,需要知道是用户(user)还是系统(sys)的占用率高,如果是user的CPU占用高,说明应用在做消耗CPU过高的操作;如果是sys的CPU占用高,说明系统在做大量的IO的操作;如果占用率高的线程频繁变动,则可能是CPU时间片不断调度,线程唤醒一下而后换另一个线程跑,需要看多线程任务是否存在大计算问题,以及线程池设置是否合适!
注释:
死锁:由于执行顺序的原因,互相持有对方正在等待的锁;多个线程在相同的资源上发生等待
饥饿:高优先级线程一直占用CPU,导致低优先级线程一直处于一个等待进入同步块的状态
活锁:并未产生线程阻塞,但是由于某种问题的存在,导致无法继续执行的情况