Linux系统性能监控--CPU、内存、磁盘I/O、网络I/O

1. 简介

在Linux中,计算机的所有数据的计算都通过读取分析 /proc 文件系统来实现,Linux内核会实时把硬件的状况更新到 /proc 这个内存文件系统中。我们来基于读取/proc目录里的各种文件来分析系统性能情况。

2. 读取信息

  1. CPU:CPU的数据存储在/proc/stat文件中,直接读取

cat /proc/stat

   得到的结果,从左至右依次是user, nice, system, idle, iowait, irq, softirq, steal, guest, guestnice

cpu  193 0 519 206557 57 0 1 0 0
cpu0 193 0 519 206557 57 0 1 0 0
intr 24347 157 425 0 0 0 0 0 0 1 0 0 0 474 0 0 118 0 2884 3533 0 ...
ctxt 34465
btime 1587177917
processes 1151
procs_running 1
procs_blocked 0
softirq 43254 0 16131 413 3533 2943 0 408 0 16 19810

   计算CPU占有率的代码如下 -- 主要是字符串的分隔,拼接,提取等

#!/usr/bin/python
# coding=utf8
import time


def get_cpu_info():
    """cpu的时间"""
    f = open('/proc/stat')
    info = f.readlines()[0]
    f.close()

    cpu_list = info.split(' ')
    work_time = int(cpu_list[2]) + int(cpu_list[3]) + int(cpu_list[4])
    total_time = int(cpu_list[2]) + int(cpu_list[3]) + int(cpu_list[4]) + int(cpu_list[5]) + int(cpu_list[6]) + int(cpu_list[7]) + int(cpu_list[8]) + int(cpu_list[9])

    return work_time, total_time


def get_cpu_percent():
    """cpu的占有率"""
    prev_work_time = get_cpu_info()[0]
    prev_total_time = get_cpu_info()[1]
    time.sleep(2)
    current_work_time = get_cpu_info()[0]
    current_total_time = get_cpu_info()[1]

    cpu_percent = (current_work_time - prev_work_time) * 100 / (current_total_time - prev_total_time)

    return cpu_percent

    2. 内存: 内存的信息在/proc/meminfo文件中

cat /proc/meminfo

   得到的信息如下

MemTotal:        1004412 kB
MemFree:          846368 kB
Buffers:            8164 kB
Cached:            41912 kB
SwapCached:            0 kB
Active:            36604 kB
Inactive:          37920 kB
Active(anon):      24456 kB
Inactive(anon):      148 kB
Active(file):      12148 kB
Inactive(file):    37772 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2031608 kB
SwapFree:        2031608 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         24476 kB
Mapped:             8572 kB
Shmem:               160 kB
Slab:              61388 kB
SReclaimable:      10024 kB
SUnreclaim:        51364 kB
KernelStack:         608 kB
PageTables:         1592 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2533812 kB
Committed_AS:      74748 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      153444 kB
VmallocChunk:   34359572340 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        6144 kB
DirectMap2M:     1042432 kB
DirectMap1G:           0 kB

    计算内存的占有

#!/usr/bin/python
# coding=utf8


def get_mem_percent():


    f = open('/proc/meminfo')
    mem_info = f.readlines()
    f.close()

    mem_total = int(mem_info[0].strip().split(':')[1].strip().split(' ')[0])
    mem_availble = int(mem_info[2].strip().split(':')[1].strip().split(' ')[0])

    mem_percent = (mem_total - mem_availble) * 100 / mem_total
    return mem_percent


def get_swap_percent():
    f = open('/proc/meminfo')
    mem_info = f.readlines()
    for i in mem_info:
        if i.startswith('SwapTotal'):
            swap_total = int(i.strip().split(':')[1].strip().split(' ')[0])
        elif i.startswith('SwapFree'):
            swap_free = int(i.strip().split(':')[1].strip().split(' ')[0])

    swap_percent = (swap_total - swap_free) * 100 / swap_total
    return swap_percent

需要注意的是,当前使用的内存是用总量减可用内存,即 total-available 得到的
因为 used 的值不包括一些被内核占用并且永不释放的缓存内存

3. 网络:网络数据保存在/proc/net/dev文件中

cat /proc/net/dev 

   得到如下的信息 

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
enp0s25:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
    lo: 65691844  116033    0    0    0     0          0         0 65691844  116033    0    0    0     0       0          0
wlp4s0: 1249471414  907278    0    0    0     0          0         0 88564991  428056    0    0    0     0       0          0

   我们要计算下载和上传的速度,需要用到第一个值和第九个值,分别是下载的总byte数、上传的总byte数 
   这里我计算了两秒内的平均速度。

#!/usr/bin/python
# coding=utf8

import time


def get_net_bytes():
    f = open('/proc/net/dev')
    net_info = f.readlines()
    f.close()

    download_bytes = 0
    upload_bytes = 0

    for i in net_info[2:]:
        if not i.strip().startswith('lo'):
            num_list = []

            for j in i.strip().split(' '):
                if j.isdigit():
                    num_list.append(j)
            download_bytes += int(num_list[0])
            upload_bytes += int(num_list[8])

    return download_bytes, upload_bytes


def get_net_io():
    prev_download_bytes = get_net_bytes()[0]
    prev_upload_bytes = get_net_bytes()[1]

    time.sleep(2)

    current_download_bytes = get_net_bytes()[0]
    current_upload_bytes = get_net_bytes()[1]

    download_speed = (current_download_bytes - prev_download_bytes) / 1024 / 2
    upload_speed = (current_upload_bytes - prev_upload_bytes) / 1024 / 2

    return download_speed, upload_speed

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值