如何解决服务响应慢的问题(一)

229 阅读4分钟

服务响应慢排查思路主要分为四个维度

  • 优化CPU以及内存占用率较高线程代码
  • 优化数据库参数。
  • 优化数据库表结构。
  • 优化表索引

1.查看CPU占用率

线上服务器如果CPU长期处于负载过高的状态, 会使服务响应变慢,那么如何去定位于解决这块问题?
CPU占用率在Linux系统可以通过top命令查看CPU的使用情况:

图片

top命令可以分为两个部分:

第一部分:上图中绿色框中的信息,为统计信息部分。

第一行为任务队列统计信息,结果相当于uptime命令:

[root@instance-0nfhpzjs ~]# uptime11:00:50 up 6 days, 21:32, 2 users, load average: 0.11, 0.04, 0.05

从左到右依次表示系统的当前时间、运行时间、当前登录用户数、以及load average系统平均的负载,三个值分别表示:

第一位 0.11:表示最近1分钟平均负载
第二位 0.04:表示最近5分钟平均负载
第三位 0.05:表示最近15分钟平均负载如

如果CPU核数是x ,那么该值越接近于x或者大于x,说明此时CPU负载越高。

第二行是进程统计信息,分别是 总进程数152,运行的进程数1 ,睡眠进程数151, 停止的进程数0,僵尸进程数0。

Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie

第三行是CPU统计信息,us是用户空间CPU占用率 ,sy表示系统内核空间CPU占用率,ni表示用户进程空间改变过优先级的进程CPU的占用率,wa表示等待输入和输出的CPU时间百分比、id表示空闲CPU占用率,hi表示硬件中断请求,si表示软件中断请求。

%Cpu(s): 0.8 us, 0.8 sy, 0.0 ni, 98.2 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st

第四行是内存占用情况,total表示内存占用总量,free表示空闲物理内存, used表示已使用物理内存, buff/cache表示内核缓冲使用量 。

KiB Mem : 4038916 total, 1257512 free, 651264 used, 2130140 buff/cache

第五行是Swap的使用情况 ,依次表示交换区总量,空闲交换区大小、缓冲交换区大小。

第二部分:上图中蓝色框中的信息,是进程统计信息,主要显示系统内各个进程的资源使用情况:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND21824 root 20 0 3569044 416888 13604 S 52.2 10.3 17:49.64 java

PID:进程ID

USER :进程所有者的用户

PR:进程优先级

NI:nice值,正值表示低优先级

%CPU:CPU占用百分比

TIME+ :进程使用的CPU时间总计,单位1/100秒

%MEM:占用物理内存百分比

VIRT:虚拟内存总量, 进程使用的虚拟内存总量,单位为KB VIRT=SWAP+RES

RES: 使用的未被换出的物理内存大小,单位KB,RES=CODE+DATA

SHR:共享内存大小,单位为KB

COMMAND: 命令名/命令行

2. 定位占用CPU较高的进程以及对应线程

主要步骤:

(1) 查看CPU占用过高的进程:
top命令查看占用CPU最高的PID为21824,CPU占用率达到73%,且一直居高不下。

图片

(2) 查看CPU占用过高线程:

top -Hp pid(21824)

查看出该21824进程中占用CPU较高的线程id为21903。

图片

(3) 线程ID转换为十六进制:
21903转换十六进制为558f

图片

(4) 查看CPU过高的进程的内部线程:

jstak 21824(PID) |grep 558f -A20

-A 意思是查看出现对应线程id 558f 前20行。

图片

可以看出当前线程的状态为BLOCKED状态,以及当前线程执行到了TestController中第15行,手动定位到该类的15行,发现是一个死循环,难怪CPU使用率一直居高不下,赶快修改一下它吧。

图片

CPU占用过高就先分析到这,下一期从内存调优的角度去分析下服务变慢的原因,再见。