对于一个 Linux 服务器来说,cpu 的主频以及占用率,内存的大小以及占用率,磁盘 I/O 速率和网卡 I/O 速率极大地影响着服务器的性能。在 Linux 系统下,开发者提供了/proc 文件系统来提供系统相关的进程信息
1.查看 cpu 主频和占用率
Linux 下 CPU 的主频有两种获取方式,一种是通过读取 /proc/cpuinfo 文件,另外一种是利用 CPU 主频的计算原理编写程序获取。此处只介绍前一种方式。即使用命令 cat /proc/cpuinfo 。从下方图片可以看到,本人的电脑是双核 CPU,主频都为 2.60GHz。
Lance# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Pentium(R) Dual-Core CPU E5300 @ 2.60GHz stepping : 10 microcode : 0xa0b cpu MHz : 1200.000 cache size : 2048 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl cpuid aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm pti tpr_shadow vnmi flexpriority dtherm bugs : cpu_meltdown spectre_v1 spectre_v2 bogomips : 5186.86 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Pentium(R) Dual-Core CPU E5300 @ 2.60GHz stepping : 10 microcode : 0xa0b cpu MHz : 1200.000 cache size : 2048 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl cpuid aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm pti tpr_shadow vnmi flexpriority dtherm bugs : cpu_meltdown spectre_v1 spectre_v2 bogomips : 5186.86 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
Linux 下 CPU 的使用状态可分为用户态、系统态以及空闲态。CPU 占用率可以用如下公式计算
CPU占用率 = CPU执行非系统空闲进程时间/CPU执行总时间
/proc/stat 文件对 CPU 的使用情况进行了实时的记录,如下图所示:
Lance# cat /proc/stat cpu 525228 16439 390034 139932703 224352 0 2010 0 0 0 cpu0 265224 6822 197250 70017169 60063 0 74 0 0 0 cpu1 260004 9617 192784 69915534 164289 0 1936 0 0 0 intr 126884204 43 2 0 0 0 0 0 1 0 3 0 0 4 0 0 0 124 0 2 1404563 0 0 0 0 955106 514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ctxt 193899569 btime 1536131324 processes 268172 procs_running 1 procs_blocked 0 softirq 101783843 10 36600014 116255 1002291 1058479 0 263 35993177 0 27013354
其中首行的 10 个参数含义如下:
user nice system idle iowait irq softirq steal guest guest_nice
user:用户态的CPU时间
nice:低优先级程序所占用的用户态的cpu时间。
system:系统态的CPU时间
idle:CPU空闲的时间
iowait:等待IO响应的时间
irq:处理硬件中断的时间
softirq:处理软中断的时间
steal: 处理其他所花的时间
guest:运行时间为客户操作系统下的虚拟CPU控制
guest_nice:访客的低优先级程序所占用的用户态的cpu时间
余下的参数中:
intr:第一个参数表示的是自系统启动以来,发生的所有中断的次数;其他的数对应一个特定中断发生的次数
ctxt: cpu自系统启动以来发生的上下文交换次数
btime: 系统启动到现在的时间 UTC 秒
processes: 表示系统启动以来创建的进程个数
procs_running: 当前运行进程的个数
procs_blocked: 当前被阻塞的进程个数
softirq: 显示软中断情况
要计算 CPU 在某段时间内的占用率,可以分别记录下 t1 和 t2 时刻的 CPU 总的状态和空闲状态,因此:
CPU占用率 = 1 – ( idle2 – idle1 ) / (total2 – total1)
其中 total 表示 10 个参数之和。
2. 查看内存大小及占用率
/proc/meminfo 记录了内存信息。
Lance# cat /proc/meminfo MemTotal: 4003752 kB MemFree: 517464 kB MemAvailable: 3144816 kB Buffers: 257152 kB Cached: 2289308 kB SwapCached: 0 kB Active: 1455916 kB Inactive: 1487740 kB Active(anon): 277376 kB Inactive(anon): 174624 kB Active(file): 1178540 kB Inactive(file): 1313116 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 6253564 kB SwapFree: 6253564 kB Dirty: 8 kB Writeback: 0 kB AnonPages: 395168 kB Mapped: 207872 kB Shmem: 54808 kB Slab: 460364 kB SReclaimable: 425200 kB SUnreclaim: 35164 kB KernelStack: 5376 kB PageTables: 22064 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 8255440 kB Committed_AS: 2553704 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HardwareCorrupted: 0 kB AnonHugePages: 2048 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 113216 kB DirectMap2M: 4044800 kB
其中:
MemTotal:表示系统可支配内存
MemAvailable:表示应用程序可用的内存
因此,内存占用率可以用如下公式计算:
3.查看磁盘 I/O占用率
安装 sysstat 工具,它的子工具 iostat 可以显示 I/O 占用率。%util 参数表示 1s内用于 I/O 请求所用时间的比例,%util 值越高,I/O 占用率越高,可直接使用这个参数来代表 I/O 占用率
Lance# iostat -x Linux 4.13.0-32-generic (Lance) 2018年09月13日 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.37 0.01 0.28 0.16 0.00 99.17 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 21.41 0.00 0.00 2.44 0.00 20.89 0.00 loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 44.62 0.00 0.00 1.69 0.00 11.38 0.00 loop2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19.93 0.00 0.00 9.65 0.00 12.31 0.00 loop3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 41.81 0.00 0.00 14.23 0.00 18.88 0.00 loop4 0.01 0.00 0.01 0.00 0.00 0.00 0.00 0.00 6.61 0.00 0.00 1.12 0.00 0.50 0.00 loop5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.60 0.00 0.00 0.00 sda 0.24 0.52 3.45 14.18 0.17 0.56 41.05 51.90 3.56 31.99 0.02 14.40 27.51 4.51 0.34
4. 查看网络带宽使用率
/proc/net/dev 文件中记录了网络相关的使用情况,其中分别记录了发送和接收的数据包总数、收发的错误包数以及收发的丢失包数等。取单位时间内发送和接 收 的 数 据 包 总 包 数 (totalPackets ), 除 以 网 络 的 基 本 带 宽 ( bandWidth ),
pnet = 100%*totalPackets/bandWidth
Lance# cat /proc/net/dev Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo: 2729345 46942 0 0 0 0 0 0 2729345 46942 0 0 0 0 0 0 enp2s0: 558026941 723202 0 11733 0 0 0 105753 23827630 275738 0 0 0 0 0 0
bytes: 接口发送或接收的总字节数
packets: 接口发送或接收的总数据包数
errs: 有设备驱动程序检测到的发送或者接收错误的总数
drop: 设备驱动程序丢弃的数据包总数
fifo: FIFO 缓冲区错误的数量
frame: 分组帧错误的数量
colls: 接口上检测到的冲突数
compressed: 设备驱动程序发送或接收的压缩数据包数
carrier: 由设备驱动程序检测到的载波损耗的数量
multicast: 设备驱动程序发送或接收的多播帧数