线上服务器cpu占用高

/ 运维 / 没有评论 / 373浏览

  线上服务器负载很高,于是常规操作;

 

1.top 获取占用cpu最高进程PID

通过top -c(然后按Shift+M按内存排序),或者htop等工具定位到具体的高内存进程。

2.top -H -p 17532 获取该进程占用最高的线程TID,(然后按Shift+M按内存排序)定位占内存的线程:

17536 root      20   0 8806416   3.9g  13400 R 90.5 24.9  36:21.95 java                                                         
17539 root      20   0 8806416   3.9g  13400 R 89.8 24.9  36:18.47 java                                                         
17542 root      20   0 8806416   3.9g  13400 R 88.2 24.9  36:44.02 java                                                         
17543 root      20   0 8806416   3.9g  13400 R 88.2 24.9  36:22.97 java 

并且查看是线程过多还是某些线程占用太大,适用于查看内存占用高;

ps p 17532 -L -o pcpu,pmem,pid,tid,time,tname,cmd |wc -l

3.打印堆栈日志:

转换16进制

printf "%x\n" 17539

jstack 17532|grep 4483 -A 10 > 4483.log

5.查看gc情况:

jstat -gcutil 17532 5000

 S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   887 5267.664 5369.395
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   888 5273.380 5375.111
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   889 5278.875 5380.607
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   890 5284.416 5386.147
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   891 5289.932 5391.663
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   892 5295.446 5397.177
  0.00   0.00 100.00 100.00  92.43  87.76  10280  101.731   893 5301.013 5402.744

6.发现频繁fullgc,查询具体情况;

发现大量关于DruidDataSource数据库连接池的线程,其中JdbcDataSourceStat中持有大量HashMap对象,分析得出是开启了druid监控导致的存储的大量sql语句释放不掉导致的频繁fullgc,于是关闭监控功能;

将log4j切换到logback后观察,并且将druid更换为了HikariCP,并调整参数;之前项目的开发者设置的最大连接池连接数高达8000....

上线后观察,不是高峰期的时候,cpu占用直接从二十多到个位数;只负载部署一台观察;

其他(查找内存占用大原因):

1.dump内存快照:

如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。
```
# dump当前快照
jmap -dump:live,format=b,file=dump.hprof <pid>
# 触发full gc,然后再dump一次
jmap -dump:live,format=b,file=dump_gc.hprof <pid>
```

dump:live的作用是会触发Full GC,然后再dump数据,用作gc前后的数据做对比。

2.使用MAT工具分析或者线上使用jstat分析:

faceless@ttg12:~/tmp$ jhat dump.hprof
Reading from dump.hprof...
Dump file created Mon Jun 22 14:33:00 CST 2020
Snapshot read, resolving...
Resolving 36246 objects...
Chasing references, expect 7 dots.......
Eliminating duplicate references.......
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

分析完成后,访问端口号7000可查看;

3.还可以使用阿里Arthas分析