实时查看tomcat并发连接数
netstat -na | grep ESTAB | grep 8080 | wc -l
实时查看apache并发连接数
netstat -na | grep ESTAB | grep 80 | wc -l
查看物理cpu的个数命令:
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
查看核数命令:每个物理cpu中core的个数(即核数)
cat /proc/cpuinfo | grep "cpu cores" | uniq
每个物理cpu中逻辑cpu的个数(以下两条命令都可以)
cat /proc/cpuinfo | grep "processor" | wc -l
cat /proc/cpuinfo | grep "siblings" | uniq(以上命令""或''都可以)
windows上看cpu多核命令是systeminfo,
安装sar命令是yum -y install sysstat
监控概述:
cpu
在虚机里输入top命令,紧接着输入1,看到变成cpu0了,如图,只虚出一个核对于多核cpu来说,cpu0是相当关键的,cpu0相当于cpu中的leader,因为cpu各核间的调度都通过cpu0完成,如果cpu0的负载高,调度cpu就比较困难,就会影响其他核的性能
top命令可以看到load average后面有三个值,分别代表过去的1分钟,5分钟和15分钟的负载
Tasks是进程的状态,zombie是僵尸进程,即不受控制的进程,不退出也叫不醒
cpu包括us和sy,用户cpu就是用户进程在运行时消耗的cpu,系统cpu是系统内核消耗的cpu,id代表空闲的,wa代表等待的,等待io占用的cpu很少,ni是nice,代表优先级高的,是综合体,一般是在系统态进行,hi是硬中断,si是软中断,st是虚拟设备所消耗的cpu
top命令看到的用户态cpu不能超过100%,每个进程的cpu不能超过核数*100%,系统态cpu也不能超过100%,系统态cpu比较高,会导致iowait比较高
shift+p按照CPU进行排序,从高到低,shift+m按照内存进行排序,从高到低
PID是进程id,要是输入H,就是线程id了
USER就是属于哪个用户
PR就是优先级的级别
NI就是优先级顺序
VIRT是物理内存+共享内存+虚拟内存之和,RES是物理内存,SHR是共享内存,共享内存一般会乘以几,S是状态
TIME+运行了多长时间
如果要监控某个进程就用top -p 进程的pid,监控线程就再加上H,监控哪个线程消耗的cpu高看cpu的百分比或TIME+,TIME+是占用cpu时间片的情况
中断包括内部和外部中断,等待磁盘的io,应用程序无法继续运行,这是内部中断,等待外部设备的交换,这是外部中断
load average
负载是指一段时间内cpu正在处理+等待io的进程数之和的统计信息,即cpu使用队列的长度的统计信息,越短越好,它包含的信息不是cpu的使用率情况,反应了cpu的使用情况及申请情况,主要还是看15分钟的cpu
如何理解cpu和load
---load低,cpu使用率高
有大量的运算的时候,cpu就会很高,就一个进程,负载就是1,不高
---load高,cpu使用率低
有大量io等待进程,第三方进程,拉高了负载,系统刚启动,没消耗什么cpu
起了一个进程,会读磁盘和写磁盘,写日志是系统态还是用户态?
内核进程消耗系统的磁盘,内核去操作磁盘,就是系统态,用户不能操作磁盘,避免大量的磁盘读写,系统态占用的cpu多,用户态cpu就少,导致系统调度差,系统卡
看cpu是否有问题首先看负载,如果load average高,用vmstat看r,b,看cpu使用率,如果cpu使用率不高,看cpu使用率(主要关注us和sy),如果us高,程序消耗cpu高,找到消耗cpu高的进程,top->shift+p,top -p pid H,然后找到进程下面消耗cpu比较高的线程id,看看消耗cpu高的线程在干什么,定位到方法;如果sy高,看是否是io导致的,看读和写操作,如果是读导致的,内存不够了,从应用程序这看是有大量的从磁盘读数据,从数据库这看是否有全表扫描,大量的数据从磁盘放到内存,如果是写导致的,往磁盘写日志,写数据库,文件之间的同步,如果是中断导致的,vmstat看上下文切换高不高,如果都不是用终极命令strace
memory
在虚机里敲vmstat 1是一直监控的意思,如果vmstat 2 3就是每隔2s监控一次,一共监控3次
r:等待cpu调度的进程,已经准备好了,但cpu还未执行,如果r是0,负载就是0
b:block,等待io的进程
swpd:虚拟内存使用情况
free:空闲的内存
buff:被用来作为设备缓存的内存数,往磁盘写的文件
cache:被用来作为高速缓存,缓存是读操作,从内存到磁盘,频繁操作这块区域,缓存起来
si(从磁盘到内存),so(从内存到磁盘),s是swap,一般情况下si,so都是0,这两列表示内存交换的频繁程度,如果值过大表示内存不够
bi列表示由块设备读入数据的总量,即读磁盘,bo列表示写到块设备数据的总量,即写磁盘,b是block,如果bi+bo值过大,且wa值较大,则表示系统磁盘IO瓶颈
system下有in和cs,in是中断,cs是上下文切换,一般看cs就行,2核不超过4000就行,如果sy,hi,si比较高看cs
java程序不用关注内存使用率,因为在初始化的时候开辟一块内存供应用程序使用,最小堆内存和最大堆内存都是8G,一开机内存使用率就达到66.6%了,非java程序关注内存使用率
内存溢出是内存爆了,内存占满不能往里面丢东西了,内存泄漏是内存一滴一滴的泄漏,内存越来越小
io
在虚机里输入iostat
avg-cpu:总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
Device:各磁盘设备的IO统计信息
tps:每秒IO次数
iostat -k(以KB为单位显示) 5(统计间隔为5秒) 2(共统计两次)
iostat -x显示更加详细的信息,监控io尽量用这个命令
r/s:每秒读取请求数(rio),w/s:每秒写入请求数(wio),每秒总的IO操作次数
avgqu -sz:平均I/O队列长度,越短越好,大于1磁盘有问题
await:平均每次设备I/O操作的处理时间,await=等待时间+svctm,单位:毫秒
svctm:平均每次设备I/O操作的服务时间(毫秒),svctm越接近于await说明等待时间少
%util:表示空闲比例
r_await:读的操作时间
w_await:写的操作时间
读操作是内存里没有这个数据,从磁盘里读出来,读操作多一般是内存不够了,频繁的从磁盘里读,select操作,从磁盘读到内存里
写操作包括写日志,数据库操作(insert,update,delete)也会往磁盘里写,以及同步(数据库主从同步,通过文件同步)
如果磁盘比较繁忙是写操作导致的就减少写操作,同理读也一样
如果有nmon直接在disk里看Busy那列就行,如果超过30%,再用iostat -x看队列,看await和svctm,如果队列长,await和svctm时间长,就是io问题,看读和写操作,如果是读导致的,内存不够了,从应用程序这看是有大量的从磁盘读数据,从数据库这看是否有全表扫描,大量的数据从磁盘放到内存,如果是写导致的,往磁盘写日志,写数据库,文件之间的同步,如果是中断导致的,vmstat看上下文切换高不高,如果都不是用终极命令strace
IO瓶颈的症状:
%util很高
await远大于svctm
avgqu -sz比较大
cpu->wa过大(参考值,超过20),通过vmstat 1命令查看
system->bi&bo过大(参考值,超过2000),通过vmstat 1命令查看
一般是由于程序优化的不合理或sql语句优化的不合理导致IO偏高或比较繁忙,IO偏高或比较繁忙不代表IO有瓶颈,有可能是由其他原因导致IO比较忙,比如说内存不够导致和IO频繁交互,IO的瓶颈是现在系统常见的问题,还没有得到良好的解决方案,而且发展也不如cpu和mem,增加cpu和增大内存都是为了变相的减少IO的交互
热点数据放在固态硬盘上,固态硬盘处理速度比机械硬盘高很多,冷点数据放在机械硬盘上
Iface:表示网络设备的接口名称
MTU:表示最大传输单元,单位是字节
RX-OK/TX-OK:表示已经准确无误地接收/发送了多少数据包
RX-ERR/TX-ERR:表示接收/发送数据包时产生了多少错误
RX-DRP/TX-DRP:表示接收/发送数据包时丢弃了多少数据包
RX-OVR/TX-OVR:表示由于误差而丢失了多少数据包
如果网络有问题RX-ERR/TX-ERR、RX-DRP/TX-DRP、RX-OVR/TX-OVR为正数,主要看这个,也可以ping www.baidu.com如果time值大于1s,网络也有问题
strace是一个功能强大的调试,分析诊断工具,主要用来监视系统调用,以centOS为例安装,使用strace前需要先在安装它,可使用命令:
yum -y install strace否则会出现:-bash: strace: command not found
安装完之后使用命令strace -f -c -p 进程pid(java进程),然后Ctrl+c,可以看到下面的页面:
futex内核占用了68.95%的时间片,耗时0.20001秒,主动被调用了345次,被调了579次,产生的错误是275次,如果系统态cpu高的话,一定是futex这个导致的
如果压测过程中抛出too many open files,可以用lsof看哪个进程打开了多少文件,ulimit -a是看文件句柄的命令,默认看到open files是1024,可以用ulimit -n num改open files,,改成65535
如何看负载机瓶颈,如果是上传和下载项目,看网络带宽是否占满,如果不是上传和下载项目,并发时看cpu卡不卡(Windows看cpu使用率用perfmon命令,在资源管理器里也可以看性能)
首先要了解架构图,画出请求业务的数据流,如果还是没有方向就在日志里打印响应时间,根据响应时间去分析问题在哪个环节
rt10s,接口2s,差8s,问题可能出在负载机、网络、web容器连接池排队,主要问题在负载机这,负载机请求一直排队
如果没有这个图就从下面的分析:
1、排查负载机,负载机好排查,看卡不卡,卡就加负载机
2、查看网络,看网络是否丢包,是否有错误率
3、服务器的硬件资源,cpu,内存,io
4、两个池子(中间件线程池和数据库连接池)是否占满,满了就有排队
5、sql执行效率,是否有慢查询,一般是select操作,自己执行一下sql看多长时间
6、gc
7、代码逻辑
1、了解系统架构图并画出
2、根据系统架构图画出被测接口请求的数据流图,并列出可能存在问题的每个点
3、
a:要么从简单的开始排查(负载机、网络、硬件)->(中间件线程池、数据库连接池)->sql执行效率->gc->code
b:要么通过系统日志打印出接口以及sql(或者web容器排队)时间,然后根据时间去判断可能存在问题的点,缩小问题的范围
如果cpu不高,io不高,内存使用不高,网络带宽使用不高,但是系统的性能上不去,啥问题?
1、代码问题
2、网络问题,压力产生没有流向后端,路由规则控制,路由有限制
图形界面工具 | linux命令行工具 | |
服务器硬件资源监控 | spot on linux、nmon, zabibix |
Top,vmstat,sar,netstat,strace,free,iostat,mpstat,dstat |
Java监控工具 |
jconsole,jvisualvm,jprofiler,mat |
jmap,jstat,jstack |
mysql监控工具 | spot on mysql | 慢查询,explain等 |
关注指标 | 监控命令 | |
内存 | 物理内存是否够用,是否有内存泄漏 | vmstat,jmap(针对java应用) |
I/O | 磁盘繁忙度,是否有I/O等待 | iostat,vmstat |
网络 | 网络是否有阻塞 | ifstat,dstat,ping |
CPU | cpu使用率,loadaverage | top,vmstat,strace,jstack |
来源:https://www.cnblogs.com/laosun0204/p/8723210.html