linux command

内存
[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情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值