cpu使用采集
Linux的CPU使用率信息可以通过 /proc/stat 文件计算得到。/proc/stat 包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计的,单位为jiffies
root@XXXX:/data/home/XXX# cat /proc/stat | grep 'cpu'
cpu 95437746 32 24265376 7465005603 7796243 1519 4335510 0 0 0
cpu0 7466498 2 1407025 306335463 590252 109 351612 0 0 0
cpu1 7273049 0 1705355 306622392 562050 112 342781 0 0 0
cpu2 6733335 5 1660868 306929985 576424 93 325344 0 0 0
cpu3 6472024 2 1919518 307244781 557953 98 300159 0 0 0
cpu4 6668797 0 1546640 307119293 606800 63 260103 0 0 0 c
pu5 6323355 1 1354468 307683672 578870 64 236279 0 0 0
cpu6 8694518 0 1410405 305271598 420758 55 314002 0 0 0
cpu7 6148377 1 1264383 308445566 399519 50 200748 0 0 0
cpu8 5748207 5 1523884 308538765 427474 46 191919 0 0 0
cpu9 4660666 2 1601920 309513640 431980 46 173813 0 0 0 c
pu10 5462723 1 1364404 309038920 413696 50 194059 0 0 0
cpu11 5159830 3 1176848 309439377 412922 48 175634 0 0 0
cpu12 2750928 0 740011 312476124 338191 143 260653 0 0 0
cpu13 2547955 1 936027 312466557 322650 138 248924 0 0 0
cpu14 2583720 0 802039 312626559 296125 152 247577 0 0 0
cpu15 2546840 0 694728 312749117 307404 150 233516 0 0 0
cpu16 1363146 0 402344 314807967 154086 19 59672 0 0 0
cpu17 1311191 0 400912 314833885 166464 18 52947 0 0 0
cpu18 1328266 0 346806 315082676 45472 12 51517 0 0 0
cpu19 685345 2 570098 315544015 32795 7 23060 0 0 0
cpu20 692669 0 407326 315695737 38095 9 23443 0 0 0
cpu21 854437 0 327793 315615426 44156 10 22783 0 0 0
cpu22 908316 0 379316 315561457 30755 5 21127 0 0 0
cpu23 1053546 0 322247 315362621 41344 14 23830 0 0 0
cpu一行指的是总的CPU信息,cpu0......cpu23几行指的是CPU各个核的CPU信息。从这里也可以看出这台服务器共有24个核。每列从左到右的意思为:
- 1、1 jiffies = 0.01s = 10ms
- 2、常用计算等式:CPU时间 = user + system + nice + idle + iowait + irq + softirq
3、man手册中iowait有单独说明,iowait时间是不可靠值,具体原因如下:
1)CPU不会等待I/O执行完成,而iowait是等待I/O完成的时间。
当CPU进入idle状态,很可能会调度另一个task执行,所以iowait计算时间偏小;
2)多核CPU中,iowait的计算并非某一个核,因此计算每一个cpu的iowait非常困难
3)这个值在某些情况下会减少
根据这些信息,就可以计算出CPU使用率,这里举例子说明整机cpu的使用率:
MEM使用采集
一般我们可以通过free -h来查看当前服务器上内存占用情况:
[root@XXX ~]$ free -h
total used free shared buff/cache available
Mem: 3.7G 880M 133M 2.0G 2.7G 586M
Swap: 0B 0B 0B
Mem:表示物理内存
Swap:表示硬盘交换分区
其中Mem中的total、used、free、shared、buffers、cached表示如下:
total:表示物理内存总量。
used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free:未被分配的内存。
shared:共享内存。
buffers:系统分配但未被使用的buffers数量。
cached:系统分配但未被使用的cache数量。
buffers/cached中的total、used、free表示如下:
used:实际使用的buffers与cache总量,也是实际使用的内存总量。
free:未被使用的buffers与cache和未被分配的内存之和,这就是系统当前实际可用内存。
available:空闲内存减去系统部不好回收的内存。
Linux内核会把空闲的内存用作buffer/cached,用于提高文件读取性能。当应用程序需要用到内存时,buffer/cached内存是可以马上回收的。所以,对应用程序来说,buffer/cached是可用的,可用内存应该是free+buffers+cached。
如何计算内存占用:
MEM使用量:Mem.total - Mem.free
MEM总大小:Mem.total
应用程序使用内存: Mem.total - Mem.free - (buffers + cached - shared)
进程占用内存可参考:Linux内存管理 -- /proc/{pid}/smaps讲解_proc smaps_confirmwz的博客-CSDN博客
网络IO采集
proc/net/dev是提供给用户读取或更改网络适配器及统计信息的途径,可以通过读取该文件查看系统的流量和包量情况。
[root@xxx ~]$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
veth0b68bbc: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
vethb5ee3e2: 37530815 261062 0 0 0 0 0 0 19439231 262588 0 0 0 0 0 0
eth0: 227285994782 613289178 0 0 0 0 0 0 346855514848 522298330 0 0 0 0 0 0
lo: 52896485274 64401660 0 0 0 0 0 0 52896485274 64401660 0 0 0 0 0 0
br-137050203a59: 567258612 4052142 0 0 0 0 0 0 609467371 3590862 0 0 0 0 0 0
br-91d5dd5f43ec: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
docker0: 838386402 2023766 0 0 0 0 0 0 505865102 1930936 0 0 0 0 0 0
Receive:接收的量
Transmit:发送的量
上面各个指标说明:
这里以获取eh1的1分钟流量情况为例:
1. 读取/proc/net/dev文件,获取eth1的Receive.bytes、Receive.packets、Transmit.bytes、Transmit.packets,分别记为receive_bytes0、receive_packets0、transmit_bytes0、transmit_packets0
2. 等待60秒
3. 再次读取/proc/net/dev文件,获取eth1的Receive.bytes、Receive.packets、Transmit.bytes、Transmit.packets,分别记为receive_bytes1、receive_packets1、transmit_bytes1、transmit_packets1
4. 根据n秒前后的/proc/net/dev文件的数据,可计算出下面的指标:
60秒内平均每秒入流量:(receive_bytes1 - receive_bytes0) * 8 /60/ 1024 (kbps)
(乘以8是为了把bytes转成bit,除以1024是为了把单位转成k,除以60则是取60秒内的平均值)
1GB=1024MB,1MB=1024KB,1KB=1024B,1B=8bit
60 秒内平均每秒出流量:(transmit_bytes1 - transmit_bytes0) * 8 / 60 / 1024 (kbps)
60秒内平均每秒入包数:(receive_packets1 - receive_packets0) / 60 (个)
60秒内平均每秒出包数:(transmit_packets1 - transmit_packets0) / 60 (个)
备注:网卡最大都是10000Mb/s(ethtool eth1查看);网卡需要算上行+下行总和,也就是这里的入流量+出流量的总和
磁盘IO采集
iostat 主要用于输出磁盘IO 和 CPU的统计信息
用法:iostat [选项] [<时间间隔>] [<次数>]
命令参数:
-c: 显示CPU使用情况
-d: 显示磁盘使用情况
-N: 显示磁盘阵列(LVM) 信息
-n: 显示NFS 使用情况
-k: 以 KB 为单位显示
-m: 以 M 为单位显示
-t: 报告每秒向终端读取和写入的字符数和CPU的信息
-V: 显示版本信息
-x: 显示详细信息
-p:[磁盘] 显示磁盘和分区的情况
这里我们就直接 用iostat -x [次数]来获取详细信息
统计方法:每4s统计一次,60s后取uitil的最大值为60s内整机io使用率
GPU-显存
nvidia-smi是用来查看GPU使用情况的
Memory-Usage:使用显存/总显存
GPU-Util:当前gpu利用率
如何计算60s内的显存占用和gpu利用率:
获取当前机器上的子卡数目,根据子卡数目分别获取显存占用和gpu利用率占用信息
每1s中获取1次信息,60s后used_mem=max(mem)/total_mem,util=avg(util)
disk-磁盘增长速度
服务一般部署到/data/service目录下,容器也是如此,这里我们致统一改目录下的空间大小