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

ps -ef | grep tomcat

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

top查看服务器资源

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统计信息,每秒打印一次)

TCP

active/s:新的 TCP 主动连接(也就是 socket 中的 connect() 事件),单位是:连接数/s。
passive/s:新的 TCP 被动连接(也就是 socket 中的 listen() 事件)。
iseg/s:接收的段(传输层以段为传输单位),单位是:段/s
oseg/s:发送的段。

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

网络接口统计信息

rxpck/s / txpck/s:网卡接收/发送的数据包,单位是:数据包/s。
rxkB/s / txkB/s:网卡接收/发送的千字节,单位是:千字节/s。
rxcmp/s / txcmp/s:网卡每秒接受/发送的压缩数据包,单位是:数据包/s。
rxmcst/s:每秒接收的多播数据包,单位是:数据包/s。

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

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基本信息)

cpu

Architecture: #架构
CPU(s): #逻辑cpu颗数
Thread(s) per core: #每个核心线程
Core(s) per socket: #每个cpu插槽核数/每颗物理cpu核数
socket(s): #cpu插槽数
Vendor ID: #cpu厂商ID
CPU family: #cpu系列
Model: #型号
Stepping: #步进
CPU MHz: #cpu主频
Virtualization: #cpu支持的虚拟化技术
L1d cache: #一级缓存(表示cpu的L1数据缓存)
L1i cache: #一级缓存(L1指令缓存)
L2 cache: #二级缓存

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

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

%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信息)

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,网络发包,换页,系统统计)

dstat

内存分析

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

free -m (查看剩余内存)

锁竞争

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

cswch:是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
nvcswch:则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU时,就容易发生非自愿上下文切换。
如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常的。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。

磁盘分析

fdisk (查看磁盘基本信息)
df -h(查看磁盘使用情况)

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

iostat-c

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

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

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

iostat -d -k

tps:设备每秒的传输次数(transfers per second),也就是读写次数。
kB_read/s 和 kB_wrtn/s:每秒读写磁盘的数据量。
kB_read 和 kB_wrtn:读取磁盘的数据总量。

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

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:一秒钟有百分之多少的时间用于磁盘读写操作。

TIME_WAIT问题解决

查看端口范围

sysctl -a | grep net.ipv4.ip_local_port_range

修改端口范围

vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000 65000
sysctl -p 让修改生效
最小值必须大于等于1024,最大值必须小于等于65535

允许TCP连接重复使用TIME_WAIT状态的句柄/端口

查看:sysctl -a | grep net.ipv4.tcp_tw_reuse
修改:echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
注意,客户端服务端必须同时打开tcp_timestamps(默认打开)
sysctl -w net.ipv4.tcp_fin_timeout=3 (这个修改可能没什么效果)

转载自:
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484103&idx=1&sn=d437fd54bac8ac00522aa4538ca9c7a1&chksm=ea74367fdd03bf699d603f39836bb35c0e6190f6781e0eda104a3710705034293255e85bd6b4&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484295&idx=1&sn=cd82eba9d73f816210b2a99f29b85040&chksm=ea74373fdd03be2942ebeffeebebf52f229f0cb7b724e406ff79d050d67db70584c6efbcde85&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484192&idx=1&sn=ea9aa805a5c0ac1e0b55e5477c79d66d&chksm=ea743798dd03be8e4e07bd8e173fa7e447b13cbd0cdcc287ae917b6b99d616bce801450ac22b&scene=21#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247484208&idx=1&sn=b1429f0f07d69a44248cc78d3942c5c9&chksm=ea743788dd03be9e88e41df3966eb0ac8250b1741b83b19ab97e5a0980444241d17de6bbba66&scene=21#wechat_redirect
https://cloud.tencent.com/developer/article/1432483

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容