内存
[root@yfm01 ~]# free
total used free shared buff/cache available
Mem: 1863000 357804 1313132 9712 192064 1352020
Swap: 2097148 0 2097148
free -m / free -g
total代表总的内存大小, used 代表程序已经使用的内存大小,free代表的是空闲的内存大小, shared 代表的是共享内存,buffers 代表的是 buffers cache, cached 代表的是 Page cache
swap space 是磁盘上的一块区域,当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高
每隔三秒输出一次内存情况
[root@yfm01 ~]# free -h -s 3
total used free shared buff/cache available
Mem: 1.8G 349M 1.3G 9.5M 187M 1.3G
Swap: 2.0G 0B 2.0G
每隔5秒统计一次,一共统计三次
[root@yfm01 ~]# vmstat 5 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1313316 2140 189924 0 0 12 2 23 62 0 0 100 0 0
0 0 0 1313292 2140 189956 0 0 0 0 22 52 0 0 100 0 0
0 0 0 1313292 2140 189956 0 0 0 0 23 53 0 0 100 0 0
r:表示运行和等待CPU时间片的进程数(就是说多少个进程真的分配到CPU),这个值如果长期大于系统CPU个数,说明CPU不足,需要增加CPU。
b:表示在等待资源的进程数,比如正在等待I/O或者内存交换等
swpd:表示切换到内存交换区的内存大小,即虚拟内存已使用的大小(单位KB),如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free:表示当前空闲的物理内存。
buff:表示缓冲大小,一般对块设备的读写才需要缓冲
Cache:表示缓存大小,一般作为文件系统进行缓冲,频繁访问的文件都会被缓存,如果cache值非常大说明缓存文件比较多,如果此时io中的bi比较小,说明文件系统效率比较好
si:表示数据由磁盘读入内存;通俗的讲就是每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so:表示由内存写入磁盘,也就是由内存交换区进入内存的数据大小
一般情况下si、so的值都为0,如果si、so的值长期不为0,则说明系统内存不足,需要增加系统内存
bi:表示由块设备读入数据的总量,即读磁盘,单位kb/s
bo:表示写到块设备数据的总量,即写磁盘,单位kb/s
如果bi+bo的值过大,且wa值较大,则表示系统磁盘IO瓶颈。
in:表示某一时间间隔内观测到的每秒设备终端数。
cs:表示每秒产生的上下文切换次数,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的
这两个值越大,则由内核消耗的CPU就越多。
us:表示用户进程消耗的CPU时间百分比,us值越高,说明用户进程消耗CPU时间越多,如果长期大于50%,则需要考虑优化程序或者算法。
sy:表示系统内核进程消耗的CPU时间百分比,一般来说us+sy应该小于80%,如果大于80%,说明可能存在CPU瓶颈。
id:表示CPU处在空间状态的时间百分比。
wa:表示IP等待所占用的CPU时间百分比,wa值越高,说明I/O等待越严重,根据经验wa的参考值为20%,如果超过20%,说明I/O等待严重,引起I/O等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者监控器的贷款瓶颈(主要是块操作)造成的
yum install -y sysstat
和free类似sar -r 3每隔三秒输出一次内存信息
[root@yfm01 ~]# sar -r 3
Linux 3.10.0-1160.el7.x86_64 (yfm01) 05/18/2021 _x86_64_ (1 CPU)
02:29:26 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
02:29:29 PM 1101348 761652 40.88 2140 367732 797892 20.15 434268 163792 0
02:29:32 PM 1101348 761652 40.88 2140 367732 797892 20.15 434276 163792 0
CPU
查看CPU信息(型号)
[root@yfm01 ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
1 Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz
查看物理CPU个数
[root@yfm01 ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
查看每个物理CPU中core的个数(即核数)
[root@yfm01 ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 1
查看逻辑CPU的个数
[root@yfm01 ~]# cat /proc/cpuinfo| grep "processor"| wc -l
1
top可以查看CPU总体消耗,包括分项消耗,如User,System,Idle,nice等。
Shift + H显示java线程;
Shift + M按照内存使用排序;
Shift + P按照CPU使用时间(使用率)排序;
Shift + T按照CPU累积使用时间排序;
多核CPU,进入top视图1,可以看到各各CPU的负载情况
[root@yfm01 ~]# top
top - 14:35:21 up 4:40, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863000 total, 1100912 free, 362284 used, 399804 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1344920 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125496 3988 2596 S 0.0 0.2 0:01.16 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kworker/u256:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.16 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
第一行:系统时间, 运行时间, 当前登录用户数, 负载均衡情况,分别表示1分钟,5分钟,15分钟负载情况
第二行:总进程数,运行数,休眠 ,停止,僵尸进程
第三行:用户空间CPU占比,内核空间CPU占比,改变过优先级的进程CPU占比,空闲CPU占比,IO等待占用CPU占比,硬中断占用CPU占比,软中断占用CPU占比,当前VM中的cpu 时钟被虚拟化偷走的比例
第四和第五行表示内存和swap区域的使用情况
第七行:
PID: 进程id
USER:进程所有者
PR:进程优先级
NI:nice值。负值表示高优先级,正值表示低优先级
VIRT:虚拟内存,进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:常驻内存,进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:共享内存,共享内存大小,单位kb
S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND:进程名称(命令名/命令行)
sar -u 3可以查看CUP总体消耗占比
[root@yfm01 ~]# sar -u 3
Linux 3.10.0-1160.el7.x86_64 (yfm01) 05/18/2021 _x86_64_ (1 CPU)
02:52:19 PM CPU %user %nice %system %iowait %steal %idle
02:52:22 PM all 0.00 0.00 0.00 0.00 0.00 100.00
%user:用户空间的CPU使用。
%nice:改变过优先级的进程的CPU使用率。
%system:内核空间的CPU使用率。
%iowait:CPU等待IO的百分比 。
%steal:虚拟机的虚拟机CPU使用的CPU。
%idle:空闲的CPU。
在以上的显示当中,主要看%iowait和%idle:
若 %iowait的值过高,表示硬盘存在I/O瓶颈;
若 %idle的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;
若 %idle的值持续低于 10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU;
定位线上最耗CPU的线程
#arthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果
curl -O https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
top查找出哪个进程消耗的cpu高。执行top命令,默认是进程视图,其中PID是进程号,SHITF+H打开线程视图
查看指定进程每个线程的CPU占用率,并按线程CPU占用率降序显示
[root@yfm01 ~]# ps -Lp 2208 cu | sort -k 4 -rn
USER PID LWP %CPU NLWP %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2208 2212 0.0 11 2.7 2457060 51912 pts/0 Sl+ 15:12 0:00 java
获取pid 2212的16进制
printf '%x\n' 2209
8a1
16进制转10进制
printf '%d\n' 0x8a1
2209
查看线程堆栈信息
[root@yfm01 ~]# jstack 2208 | grep -A 10 8a1
"main" #1 prio=5 os_prio=0 tid=0x00007efdb0009800 nid=0x8a1 waiting on condition [0x00007efdb6354000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at demo.MathGame.main(MathGame.java:17)
"VM Thread" os_prio=0 tid=0x00007efdb0095000 nid=0x8a2 runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007efdb00de000 nid=0x8a9 waiting on condition
通过命令我们可以看到这个线程的对应的耗时代码是在demo.MathGame.main(MathGame.java:17)
网络
watch more /proc/net/dev用于定位丢包,错包情况,以便看网络瓶颈,重点关注drop(包被丢弃)和网络包传送的总量,不要超过网络上限
[root@yfm01 ~]# watch -n 2 more /proc/net/dev
Every 2.0s: more /proc/net/dev Tue May 18 16:54:51 2021
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ens33: 20482773 44268 0 0 0 0 0 0 5680349 17602 0 0 0 0 0 0
最左边的表示接口的名字,Receive表示收包,Transmit表示发送包;
bytes:表示收发的字节数;
packets:表示收发正确的包量;
errs:表示收发错误的包量;
drop:表示收发丢弃的包量;
查看路由经过的地址
yum install -y traceroute
[root@yfm01 ~]# traceroute 10.216.5.80
traceroute to 10.216.5.80 (10.216.5.80), 30 hops max, 60 byte packets
1 gateway (192.168.199.2) 0.055 ms 0.026 ms 0.024 ms^C
查看网络错误
[root@yfm01 ~]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33 1500 44888 0 0 0 18089 0 0 0 BMRU
lo 65536 0 0 0 0 0 0 0 0 LRU
Iface: 网络接口名称;
MTU: 最大传输单元,它限制了数据帧的最大长度,不同的网络类型都有一个上限值,如:以太网的MTU是1500;
RX-OK:接收时,正确的数据包数。
RX-ERR:接收时,产生错误的数据包数。
RX-DRP:接收时,丢弃的数据包数。
RX-OVR:接收时,由于过速(在数据传输中,由于接收设备不能接收按照发送速率传送来的数据而使数据丢失)而丢失的数据包数。
TX-OK:发送时,正确的数据包数。
TX-ERR:发送时,产生错误的数据包数。
TX-DRP:发送时,丢弃的数据包数。
TX-OVR:发送时,由于过速而丢失的数据包数。
Flg:标志,B 已经设置了一个广播地址。L 该接口是一个回送设备。M 接收所有数据包(混乱模式)。N 避免跟踪。O 在该接口上,禁用ARP。P 这是一个点到点链接。R 接口正在运行。U 接口处于“活动”状态。
cat /proc/net/snmp用来查看和分析240秒内网络包量,流量,错包,丢包。
[root@yfm01 ~]# cat /proc/net/snmp
Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
Ip: 2 64 21826 0 0 0 0 0 21826 16937 0 0 0 0 0 0 0 0 0
Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
Icmp: 6 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
IcmpMsg: InType11
IcmpMsg: 6
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
Tcp: 1 200 120000 -1 12 4 0 1 2 21317 17572 6 0 1 0
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors
Udp: 296 0 0 405 0 0 0
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors
UdpLite: 0 0 0 0 0 0 0
通过RetransSegs和OutSegs来计算重传率tcpetr=RetransSegs/OutSegs。重传率=6/17572≈0
平均每秒新增TCP连接数:通过/proc/net/snmp文件得到最近240秒内PassiveOpens的增量,除以240得到每秒的平均增量;
机器的TCP连接数:通过/proc/net/snmp文件的CurrEstab得到TCP连接数;
平均每秒的UDP接收数据报:通过/proc/net/snmp文件得到最近240秒内InDatagrams的增量,除以240得到平均每秒的UDP接收数据报;
平均每秒的UDP发送数据报:通过/proc/net/snmp文件得到最近240秒内OutDatagrams的增量,除以240得到平均每秒的UDP发送数据报;
磁盘
查看磁盘剩余空间使用df -hl命令
[root@yfm01 ~]# df -hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 5.6G 32G 16% /
/dev/sda1 1014M 150M 864M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
du -sh命令是查看磁盘已使用空间的情况
[root@yfm01 ~]# du -sh
76M
-h:输出文件系统分区使用的情况,例如:10KB,10MB,10GB等。
-s:显示文件或整个目录的大小,默认单位是KB。
通iostat查看磁盘总体的读写情况:
[root@yfm01 ~]# iostat
Linux 3.10.0-1160.el7.x86_64 (yfm01) 05/18/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.09 0.00 0.00 99.87
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.41 11.85 5.72 312481 150918
scd0 0.00 0.04 0.00 1028 0
dm-0 0.33 10.59 5.65 279238 148829
dm-1 0.00 0.08 0.00 2204 0
tps:该设备每秒的传输次数。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;
通过iostat -x 1 3可以看到磁盘详细读写情况,没隔一秒输出一次一共输出3次
[root@yfm01 ~]# iostat -x 1 3
Linux 3.10.0-1160.el7.x86_64 (yfm01) 05/18/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.09 0.00 0.00 99.87
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 0.00 0.01 0.28 0.13 11.79 5.70 86.61 0.00 0.57 0.62 0.46 0.32 0.01
scd0 0.00 0.00 0.00 0.00 0.04 0.00 114.22 0.00 1.44 1.44 0.00 1.11 0.00
dm-0 0.00 0.00 0.19 0.14 10.53 5.62 97.24 0.00 0.67 0.81 0.48 0.35 0.01
dm-1 0.00 0.00 0.00 0.00 0.08 0.00 50.09 0.00 0.11 0.11 0.00 0.08 0.00
avg-cpu表示总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比,如果%iowait的值过高,表示硬盘存在I/O瓶颈。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比,如果%idle值高,表示CPU较空闲;如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量;如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。。
Device表示设备信息:
rrqm/s:每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s:每秒对该设备的写请求被合并次数
r/s:每秒完成的读次数
w/s:每秒完成的写次数
rkB/s:每秒读数据量(kB为单位)
wkB/s:每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz:平均等待处理的IO请求队列长度
await:平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm:平均每次IO请求的处理时间(毫秒为单位)
%util:一秒中有百分之多少的时间用于 I/O如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷。idle小于70% IO压力就较大了,一般读取速度有较多的wait。
新增m选项可以在输出是使用M为单位。
查看最耗IO的进程
yum -y install iotop
一般先通过iostat查看是否存在io瓶颈,再使用iotop命令来定位那个进程最耗费IO,通过iotop -p pid可以查看单个进程的IO情况