linux java性能,性能瓶颈排查linux命令整理(java后台)

ps -ef | grep tomcat

查看tomcat进程号,以及启动tomcat时所用的java版本

top查看服务器资源

db36149ddf8b

top

load average:三个数字分别表示最近 1 分钟,5 分钟和 15 分钟的负责,数值越大负载越重,一般要求不超过核数。

VIRT:virtual memory usage,进程占用的虚拟内存大小。

RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。

SHR:shared memory,共享内存大小,不常用。

us 用户空间占用 CPU 时间比例

sy 系统占用 CPU 时间比例

ni 用户空间改变过优先级的进程占用 CPU 时间比例

id CPU 空闲时间比

wa IO等待时间比(IO等待高时,可能是磁盘性能有问题了)

hi 硬件中断

si 软件中断

st steal time

ps:在top没命令模式下,按1查看每个cpu每个核心运行情况,P:按CPU使用率从高到底排序输出,M:按内存占用从高到底排序输出(或者按“F”,再选择需要排序的字段,按下s确认即可)

top -Hp pid

查看指定进程下的线程信息

printf '%x\n' pid

将pid转换为16进制

jps

列出本机所有java进程的PID

jstack -l pid > stack

保存java的堆栈信息到文件。检查非空闲状态的线程,如果大量线程都停留在同一个位置,那么很可能这个位置就是程序的瓶颈

jstat -gcutil -h3 pid 1000

每1000ms打印一次gc信息,每3行输出一次表头

jmap -heap pid

显示堆内存信息

jmap -histo pid

显示对象内存信息

jmap -dump:live,format=b,file=heapdump.phrof pid

将dump信息保存成文件,可以通过visualVM或者MAT工具分析该文件,找出占用大量内存的对象。如果jvm内存被迅速占满并引起大量full gc,检查是否有某个地方一次性加载了大量的对象到内存中,比如一次性读取数据库表中所有的数据,又或者从网络上接收数据包很大(几百kb的数据包,并发时也可能达到上百兆)

查看网络状态

sar -n TCP 1(查看tcp统计信息,每秒打印一次)

db36149ddf8b

TCP

active/s:新的 TCP 主动连接(也就是 socket 中的 connect() 事件),单位是:连接数/s。

passive/s:新的 TCP 被动连接(也就是 socket 中的 listen() 事件)。

iseg/s:接收的段(传输层以段为传输单位),单位是:段/s

oseg/s:发送的段。

sar -n DEV 1(查看网络接口统计信息,每秒打印一次)

db36149ddf8b

网络接口统计信息

rxpck/s / txpck/s:网卡接收/发送的数据包,单位是:数据包/s。

rxkB/s / txkB/s:网卡接收/发送的千字节,单位是:千字节/s。

rxcmp/s / txcmp/s:网卡每秒接受/发送的压缩数据包,单位是:数据包/s。

rxmcst/s:每秒接收的多播数据包,单位是:数据包/s。

netstat -tulnp(列出所有 tcp与udp 端口)

db36149ddf8b

Proto:协议名(tcp协议还是udp协议)

recv-Q:网络接收队列

表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()

send-Q:网路发送队列

对方没有收到的数据或者说没有Ack的,还是本地缓冲区.

这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。

Local Address:监听的本地地址,0.0.0.0表示监听所有本地地址。

Foreign Address:监听的外部地址

抓包

tcpdump -i eth0 'dst host 192.168.2.111' -w luo.pcap

抓取所有经过网卡eth0到目标地址的包

tcpdump -i eth0 'src host 192.168.2.111' -w luo.pcap

抓取所有来自目标主机的包

tcpdump -i eth0 'host 192.168.2.111' -w luo.pcap

抓取所有和目标主机通信的包信息

查看连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

CLOSED:表示初始状态

LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接了

SYN_RCVD: 这个状态表示接受到了SYN报文

SYN_SENT:表示客户端已发送SYN报文

ESTABLISHED:表示连接已经建立了

FIN_WAIT_1:表示等待对方的FIN报文(当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态)

FIN_WAIT_2:表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了

CLOSING: 表示双方都正在关闭SOCKET连接

CLOSE_WAIT: 表示在等待关闭

LAST_ACK:它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了

time_wait状态产生的原因,危害,如何避免

查看CPU信息

lscpu(查看cpu基本信息)

db36149ddf8b

cpu

cat /proc/cpuinfo(查看cpu基本信息,具体到每一个核)

mpstat 2 5(查看cpu当前运行的状况,每两秒更新一次,一共更新5次)

db36149ddf8b

%user 在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程 (usr/total)100

%nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)100

%sys 在internal时间段里,内核时间(%) (system/total)100

%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)100

%irq 在internal时间段里,硬中断时间(%) (irq/total)100

%soft 在internal时间段里,软中断时间(%) (softirq/total)100

%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100

vmstat 1 (查看cpu,内存,io信息)

db36149ddf8b

vmstat

r 值:表示在 CPU 运行队列中等待的进程数,如果这个值很大,表示很多进程在排队等待执行,CPU 压力大。

in 和 cs 值:表示中断次数和上下文切换次数,这两个值越大,表示系统在进行大量的进程(或线程)切换。切换的开销是非常大的,这时候应该减少系统进程(或线程)数。

us、sy、id、wa 值:和top的指标一致。

b ,bi 和 bo 值:b值表示因为 IO 阻塞排队的任务数。bi 和 bo 值表示每秒读写磁盘的块数,bi(block in)是写磁盘,bo(block out)是读磁盘。一般这几个值偏大,都意味着系统 IO 的消耗较大,对于读请求较大的服务器,b、bo、wa 的值偏大,而写请求较大的服务器,b、bi、wa 的值偏大。

wa 值:表示因为 IO 等待(wait)而消耗的 CPU 比例。

dstat (查看cpu,磁盘io,网络发包,换页,系统统计)

db36149ddf8b

dstat

内存分析

cat /proc/meminfo(查看内存基本信息)

free -m (查看剩余内存)

锁竞争

pidstat -w -p pid(查看上下文切换次数)

cswch:是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。

nvcswch:则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU时,就容易发生非自愿上下文切换。

如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常的。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。

磁盘分析

fdisk (查看磁盘基本信息)

df -h(查看磁盘使用情况)

iostat -c(查看部分cpu使用情况)

db36149ddf8b

iostat-c

%iowait:表示 CPU 等待 IO 完成时间的百分比

%idle:CPU 空闲时间百分比

如果 %iowait 较高,则表明磁盘存在 IO 瓶颈,如果 %idle 较高,则 CPU 比较空闲,如果两个值都比较高,则有可能 CPU 在等待分配内存,瓶颈在内存,此时应该加大内存,如果 %idle 较低,则此时瓶颈在 CPU,应该增加 CPU 资源。

iostat -d -k -x(查看磁盘使用情况,主要显示IOPS和吞吐量信息)

db36149ddf8b

iostat -d -k

tps:设备每秒的传输次数(transfers per second),也就是读写次数。

kB_read/s 和 kB_wrtn/s:每秒读写磁盘的数据量。

kB_read 和 kB_wrtn:读取磁盘的数据总量。

iostat -x(查看磁盘详细信息)

db36149ddf8b

iostat -x

rrqm/s 和 wrqm/s:分别每秒进行合并的读操作数和写操作数,这是什么意思呢,合并就是说把多次 IO 请求合并成少量的几次,这样可以减小 IO 开销,buffer 存在的意义就是为了解决这个问题的。

r/s 和 w/s:每秒磁盘读写的次数。这两个值相加就是 tps。

rkB/s 和 wkB/s:每秒磁盘读写的数据量

avgrq-sz:平均每次读写磁盘扇区的大小。

avgqu-sze:平均 IO 队列长度。队列长度越短越好。

await:平均每次磁盘读写的等待时间(ms)。

svctm:平均每次磁盘读写的服务时间(ms)。

%util:一秒钟有百分之多少的时间用于磁盘读写操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值