arthas 排查内存溢出_Java程序线上故障排查

这篇文章是在公司做了不少的线上Java服务故障排查和优化之后的一个总结,可以作为一个工具清单,在分析问题的时候需要有整体思路:全局观,先从系统层面入手,大致定位方向(内存,cpu,磁盘,网络),然后再去分析具体的进程。

一、Linux

内存和cpu

内存和cpu问题是出问题最多的一个点,因为有些命令如top同时可以观察到内存和cpu所以放在一起。

top命令

常用参数: -H 打印具体的线程, -p 打印某个进程 进入后 按数字1 可以切换cpu的图形看有几个核

下面是我的测试环境shell:

top - 14:28:49 up 7 min, 3 users, load average: 0.08, 0.26, 0.19

Tasks: 221 total, 2 running, 219 sleeping, 0 stopped, 0 zombie

%Cpu(s): 5.1 us, 3.4 sy, 0.0 ni, 91.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 985856 total, 81736 free, 646360 used, 257760 buff/cache

KiB Swap: 2094076 total, 1915196 free, 178880 used. 141592 avail Mem

我一般重点关注的指标有:

%Cpu(s): 5.1 us, 3.4 sy, 0.0 wa

这里可以非常直观的看到当前cpu的负载情况,us用户cpu占用时间,sy是系统调用cpu占用时间,wa是cpu等待io的时间,前面两个比较直观,但是第三个其实也很重要,如果wa很高,那么你就该重点关注下磁盘的负载了,尤其是像mysql这种服务器。

load average: 0.08, 0.26, 0.19

cpu任务队列的负载,这个队列包括正在运行的任务和等待运行的任务,三个数字分别是1分钟、5分钟和15分钟的平均值。这个和cpu占用率一般是正相关的,反应的是用户代码,如果超过了内核数,表示系统已经过载。也就是说如果你是8核,那么这个数字小于等于8的负载都是没问题的,我看网上的建议一般这个值不要超过ncpu*2-2为好。

KiB Mem : 985856 total, 81736 free, 646360 used, 257760 buff/cache

内存占用情况,total总内存,free空余内存, used已经分配内存,buff/cache块设备和缓冲区占用的内存,因为Linux的内存分配,如果有剩余内存,他就会将内存用于cache,这样可以较少磁盘的读写提高效率,如果有应用申请内存,buff/cache这部分内存也是可用的,所以正真的剩余内存应该是free+buff/cache

swap

线上服务器一般都是禁用状态,所以不用看这项。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

这一栏主要是看进程的详情,重点是%CPU %MEM,上面看的是整个服务器的负载,这里是每个进程的负载。还有看看S这个指标,这个代码了进程的状态,有时候有些进程会出现T(暂停)这个状态。

网络

ss

netstat的高性能版,参数都基本一致

常用参数: -n 打印数字端口号 -t tcp连接 -l 监听端口 -a 所有端口 -p 进程号 -s 打印统计信息

ss -s示例:

Total: 1732 (kernel 1987)

TCP: 42373 (estab 1430, closed 40910, orphaned 2, synrecv 0, timewait 40906/0), ports 1924

Transport Total IP IPv6

* 1987 - -

RAW 18 9 9

UDP 18 11 7

TCP 1463 503 960

可以看到整体的连接情况,如timewait过高,连接数过高等情况

然后使用ss -ntap|grep 进程号 or 端口号查看进程的连接

ping

查看时延和丢包情况

mtr

查看丢包请求

磁盘

磁盘问题在mysql服务器中非常常见,很多时候mysql服务器的CPU不高但是却出现慢查询日志飙升,就是因为磁盘出现了瓶颈。还有mysql的备份策略,如果没有监控磁盘空间,可能出现磁盘满了服务不可用的现象。

**iostat命令 **

常用参数: -k 用kb为单位 -d 监控磁盘 -x显示详情 num count 每个几秒刷新 显示次数

这个是我查看磁盘负载的主要工具,也可以显示cpu的负载,不过我一般用iostat -kdx 2 10,下面是我测试环境执行情况:

root@ubuntu:~# iostat -kdx 2 10

Linux 4.13.0-38-generic (ubuntu) 11/18/2018 _x86_64_(1 CPU)

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util

sda 24.75 196.05 121.66 9.75 2481.33 961.29 52.40 0.44 3.33 1.12 30.95 0.51 6.71

scd0 0.00 0.00 0.02 0.00 0.08 0.00 7.00 0.00 0.25 0.25 0.00 0.25 0.00

我一般重点关注的指标有:

rkB/s和wkB/s: 分别对应读写速度

avgqu-sz: 读写队列的平均请求长度,可以类比top命令的load average

await r_await w_await: io请求的平均时间(毫秒),分别是读写,读和写三个平均值。这个时间都包括在队列中等待的时间和实际处理读写请求的时间,还有svctm这个参数,他说的是实际处理读写请求的时间,照理来讲w_await肯定是大于svctm的,但是我在线上看到有w_await小于svctm的情况,不知道是什么原因。我看iostat的man手动中说svctm已经废弃,所以一般我看的是这三个。

%util: 这个参数直观的看磁盘的负载情况,我首先看的就是这个参数。和top的wa命令有关联。

df

查看文件系统的容量

常用参数: -h 友好的单位 如Kb,Mb等

du

统计具体的文件大小

常用参数: -h 友好的单位 如Kb,Mb等 -s 总计,而不是进入每个子目录分别统计

场景:例如系统磁盘空间不足时,先通过df命令定位到具体的挂载目录,在进去挂载目录后,使用

du -sh *查看各个文件或者子目录的大小定位具体文件

这里还有ls命令,可以通过加-h和-S(按大小排序)

iostat命令

常用参数: -k 用kb为单位 -d 监控磁盘 -x显示详情 num count 每个几秒刷新 显示次数

这个是我查看磁盘负载的主要工具,也可以显示cpu的负载,不过我一般用iostat -kdx 2 10,下面是我测试环境执行情况:

root@ubuntu:~# iostat -kdx 2 10

Linux 4.13.0-38-generic (ubuntu) 11/18/2018 _x86_64_(1 CPU)

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util

sda 24.75 196.05 121.66 9.75 2481.33 961.29 52.40 0.44 3.33 1.12 30.95 0.51 6.71

scd0 0.00 0.00 0.02 0.00 0.08 0.00 7.00 0.00 0.25 0.25 0.00 0.25 0.00

我一般重点关注的指标有:

rkB/s和wkB/s: 分别对应读写速度

avgqu-sz: 读写队列的平均请求长度,可以类比top命令的load average

await r_await w_await: io请求的平均时间(毫秒),分别是读写,读和写三个平均值。这个时间都包括在队列中等待的时间和实际处理读写请求的时间,还有svctm这个参数,他说的是实际处理读写请求的时间,照理来讲w_await肯定是大于svctm的,但是我在线上看到有w_await小于svctm的情况,不知道是什么原因。我看iostat的man手动中说svctm已经废弃,所以一般我看的是这三个。

%util: 这个参数直观的看磁盘的负载情况,我首先看的就是这个参数。和top的wa命令有关联。

lsof

列出当前系统打开文件,因为在linux下一切皆是文件,连接,硬件等均被描述为文件,所以这个命令也十分有用。

常用参数:

-p 查看某个进程的文件

直接加文件名 查看哪些进程打开了文件

+d 目录 查看哪些进程打开了目录以及下面的文件(不递归,+D是递归)

Sar

最后补充一个sar(System Activity Reporter)命令,如果系统没有一个良好的监控,那么这个命令对于排查问题是很好的补充,很多时候去排查问题的时候发现问题已经没了,可以通过这个命令查看系统的活动情况,比如各个时间段cpu情况,内存情况。

常用参数:

-r 内存信息

-q loader信息,运行队列情况

-u cpu信息

-W Swap换页情况

/proc文件系统

/proc是个虚拟文件系统,是内核的一些数据,很多linux命令的都是通过解析/proc文件系统实现的,每个进程都会有一个以pid为目录名的子目录存在,通过解析/proc下的进程目录可以得到很多进程的设置信息和资源占用信息等。

这里简单说个排查过的问题,当时我们线上有个服务,正常ssh登录的情况下,我们设置了ulimit中的open files为(进程可打开的最大描述符数量)100000,但是有一次在服务的日志中发现有报错说文件描述符不够用。所以

二、JVM

java -XX:+PrintFlagsInitial 可以查看所以的jvm默认参数,其中带有manageable表示运行时可以动态修改。

20:45 [root@centos]$ java -XX:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值