2023-2024-1 20232803《Linux内核原理与分析》第十二周作业

Linux系统监控实战

前置知识

(1)linux系统监控常用命令
  1. top
    top 命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了 CPU 的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程 PID、所使用命令以及其他。它还可以显示正在运行进程的内存和 CPU 占用多的情况。top
  2. vmstat
    用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动等的统计信息。
    一般 vmstat 工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。例如:vmstat 2 2

​ 测试参数讲解:

参数描述
r表示运行队列,如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高
b表示阻塞的进程数
swpd虚拟内存已使用的大小,如果大于0,表示机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器
free空闲的物理内存的大小
buff系统占用的缓存大小
cache直接用来记忆我们打开的文件,给文件做缓冲
si每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了
cs每秒上下文切换数
us用户CPU时间
so每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上
sy系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁
id空闲CPU时间,一般来说,id us sy=100
waIO等待时间百分比wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)
st来自于一个虚拟机偷取的CPU时间的百分比
  1. lsof
    常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。lsof
  2. tcpdump
    是最广泛使用的网络包分析器或者包监控程序之一,它用于捕捉或者过滤网络上指定接口上接收或者传输的 TCP/IP 包。它还有一个选项用于把捕捉到的包保存到文件里,以便以后进行分析。
参数描述
-h查看命令帮助
-i网络接口
-c需要输出包数量
sudo apt-get update
sudo apt-get install tcpdump
tcpdump -h
sudo tcpdump -i eth0 -c 3
  1. netstat
    是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。netstat -h
参数描述
-h查看帮助
-r查看IP路由表
-i查看网络接口
  1. htop
    是一个非常高级的交互式的实时 Linux 进程监控工具。它和 top 命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。
sudo apt-get install htop
htop
  1. iotop
    非常类似于 top 命令和 htop 程序,不过它具有监控并显示实时磁盘 I/O 和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。
  2. iostat
    是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括本地磁盘以及诸如用 NFS 等的远端磁盘。
sudo apt-get install sysstat
iostat

avg-cpu段:

参数含义
%user在用户级别运行所使用的CPU的百分比
%nice优先进程消耗的CPU时间,占所有CPU的百分比
%system在系统级别(kernel)运行所使用CPU的百分比
%iowaitCPU等待硬件/O时,所占用CPU百分比
%steal管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idleCPU空闲时间的百分比

Device段:

参数含义
tps每秒钟发送到的I/O请求数
KB_read/s每秒读取的block数
KB_wrtn/s每秒写入的block数
KB_read启动到现在读入的block总数
KB_wrtn启动到现在写入的block总数
  1. IPTraf
    是一个在 Linux 控制台运行的、开放源代码的实时网络(局域网)监控应用。它采集了大量信息,比如通过网络的 IP 流量监控,包括 TCP 标记、ICMP 详细信息、TCP/UDP 流量分离、TCP 连接包和字节数。同时还采集有关接口状态的常见信息和详细信息:TCP、UDP、IP、ICMP、非 IP,IP 校验和错误,接口活动等。
sudo apt-get install iptraf
sudo iptraf
sudo iptraf -h  // 查看命令帮助信息,根据需要选择合适的参数,进行监控。
  1. sysv-rc-conf
    是一个强大的服务管理程序,用于查看程序和服务的运行级别。

​ Ubuntu的系统运行级别:

参数描述
0系统停机状态
1单用户或系统维护状态
2~5多用户状态
6重新启动
  1. 安装并运行 sysv-rc-conf:
$ sudo apt-get install sysv-rc-conf
$ sudo sysv-rc-conf

操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择在启动级中开启或关闭程序,用 Ctrl+N 翻下一页,用 Ctrl+P 翻上一页,用 Q 退出。
对程序进行启动级的操作也可以用update-rc.d命令实现。
例如:删除 apache2 随机器启动的服务。查看其它命令选项:

$ sudo update-rc.d -f apache2 remove
$ sudo update-rc.d
  1. NetHogs
    是一个开放源源代码的很小程序(与 Linux 下的 top 命令很相似),它密切监视着系统上每个进程的网络活动。同时还追踪着每个程序或者应用所使用的实时网络带宽。
    操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择在启动级中开启或关闭程序,用 Ctrl+N 翻下一页,用 Ctrl+P 翻上一页,用 Q 退出。
    对程序进行启动级的操作也可以用update-rc.d命令实现。
    例如:删除 apache2 随机器启动的服务。查看其它命令选项:
$ sudo update-rc.d -f apache2 remove
$ sudo update-rc.d
  1. iftop
    是另一个在控制台运行的开放源代码系统监控应用,它显示了系统上通过网络接口的应用网络带宽使用(源主机或者目的主机)的列表,这个列表定期更新。iftop 用于监视网络的使用情况,而 top 用于监视 CPU 的使用情况。iftop 也是 top 工具系列中的一员,它用于监视所选接口,并显示两个主机间当前网络带宽的使用情况。
$ sudo apt-get install iftop
$ sudo iftop

​ 界面相关说明:

参数描述
<==>表示流量的方向
TX发送流量
RX接收流量
TOTAL总流量
cum运行iftop到目前时间的总流量
peak流量峰值
rates分别表示过去2s、10s、40s的平均流量

​ 界面操作:

参数描述
按H键是否显示帮助
按N键显示本机的IP或主机名
按S键是否显示本机的host信息
按D键是否显示远端目标主机的host信息
按T键切换显示格式为2行/1行/只显示发送流量/只显示接收流量
  1. System Monitor
    gnome-system-monitor 是 GNOME 系统监视器,能够监听 CPU,内存,进程,硬盘的信息。分为进程监控,资源监控,文件监控:
    进程监控:包括进程名,用户,CPU 占用率,进程 PID,内存占用。
    资源监控是对历史资源使用的统计,将其绘制成图展现,从图中可以看出 CPU 使用率的变化,存储占用率变化,带宽占用率变化。
$ sudo apt-get install gnome-system-monitor
$ gnome-system-monitor
(2) Linux系统监控工具——Nagios
  1. 安装 Nagios
    首先 update 一下,然后安装 Nagios,同时安装 Apache、Postfix,所以下面会涉及简单的邮件服务器的配置。
$ sudo apt-get update
$ sudo apt-get install nagios3 apache2 libapache2-mod-php postfix

安装完毕后,查看配置文件分布

$ sudo apt-get install tree
$ cd /etc/nagios3
$ tree

在这里插入图片描述

启动 apache2 与 nagios:

$ sudo service apache2 start
$ sudo service nagios3 start

在火狐浏览器中输入网址:http://127.0.0.1/nagios3/ 进入 nagios,用户名为 nagiosadmin, 密码为安装时设定的密码,效果如下图所示:

在这里插入图片描述

在 nagios 的 web 页面中,可以看到一些目录,点击左边目录中的“service”,可查看所有用户的服务状态详细信息。

在这里插入图片描述

(3) Linux 监控的 Python 脚本

1. 实验原理:基于/proc 文件系统

Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制,这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。

proc 文件系统提供的信息如下:

  • 进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,可以找到 cmdline、mem、root、stat、statm 以及 status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。
  • CPU 信息:/proc/CPUinfo 文件可以获得中央处理器的当前准确信息。
  • 负载信息:/proc/loadavg 文件包含系统负载信息。
  • 系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。

2. 实验过程

(1)CPU 监测
$ touch cpu.py
$ gedit cpu.py
$ python cpu.pyy

代码如下:

#!/usr/bin/env python
from __future__ import print_function
from collections import OrderedDict
import pprint

def CPUinfo():
    ''' Return the information in /proc/CPUinfo
    as a dictionary in the following format:
    CPU_info['proc0']={...}
    CPU_info['proc1']={...}
    '''
    CPUinfo = OrderedDict()
    procinfo = OrderedDict()

    nprocs = 0
    with open('/proc/cpuinfo') as f:
        for line in f:
            if not line.strip():
                # end of one processor
                CPUinfo['proc%s' % nprocs] = procinfo
                nprocs = nprocs + 1
                # Reset
                procinfo = OrderedDict()
            else:
                if len(line.split(':')) == 2:
                    procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
                else:
                    procinfo[line.split(':')[0].strip()] = ''

    return CPUinfo

if __name__ == '__main__':
    CPUinfo = CPUinfo()
    for processor in CPUinfo.keys():
        print(CPUinfo[processor]['model name'])

在这里插入图片描述

程序简要解析:

读取/proc/CPUinfo中的信息,返回 list,每核心一个 dict。

其中 list是一个使用方括号括起来的有序元素集合。list可以作为以 0 下标开始的数组。

dict是 Python 的内置数据类型之一,它定义了键和值之间一对一的关系。

OrderedDict 是一个字典子类,可以记住其内容增加的顺序。常规 dict 并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在 OrderedDict 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。

(2)Python 实现系统负载监测
$ touch sys_load.py
$ gedit sys_load.py
$ python sys_load.py

代码如下:

#!/usr/bin/env python
import os

def load_stat():
    loadavg = {}
    f = open("/proc/loadavg")
    con = f.read().split()
    f.close()
    loadavg['lavg_1'] = con[0]
    loadavg['lavg_5'] = con[1]
    loadavg['lavg_15'] = con[2]
    loadavg['nr'] = con[3]
    loadavg['last_pid'] = con[4]
    return loadavg

print "loadavg", load_stat()['lavg_15']

在这里插入图片描述

程序简要解析:

从/proc/loadavg中获取当前负载的信息

import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块 os 模块提供了一个统一的操作系统接口函数,os 模块能在不同操作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台操作。

(3)Python 实现内存信息的获取
$ touch mem.py
$ gedit mem.py
$ Python mem.py

代码如下:

#!/usr/bin/env python

from __future__ import print_function
from collections import OrderedDict


def meminfo():
    ''' Return the information in /proc/meminfo
    as a dictionary '''
    meminfo = OrderedDict()

    with open('/proc/meminfo') as f:
        for line in f:
            meminfo[line.split(':')[0]] = line.split(':')[1].strip()
    return meminfo


if __name__ == '__main__':
    # print(meminfo())

    meminfo = meminfo()
    print('Total memory: {0}'.format(meminfo['MemTotal']))
    print('Free memory: {0}'.format(meminfo['MemFree']))

在这里插入图片描述

代码简要解析:

读取proc/meminfo中的信息, Python 字符串的split方法是用的频率还是比较多的。比如我们需要存储一个很长的数据,并且按照有结构的方法存储,方便以后取数据进行处理。当然可以用json的形式,但是也可以把数据存储到一个字段里面,然后有某种标示符来分割。Python 中的strip用于去除字符串的首位字符,最后打印出内存总数和空闲数。

(4)Python 实现网络接口的监测
$ touch net.py
$ gedit net.py
$ python net.py

代码如下:

#!/usr/bin/env python
import time
import sys

if len(sys.argv) > 1:
    INTERFACE = sys.argv[1]
else:
    INTERFACE = 'eth0'
STATS = []
print 'Interface:', INTERFACE


def rx():
    ifstat = open('/proc/net/dev').readlines()
    for interface in ifstat:
        if INTERFACE in interface:
            stat = float(interface.split()[1])
            STATS[0:] = [stat]


def tx():
    ifstat = open('/proc/net/dev').readlines()
    for interface in ifstat:
        if INTERFACE in interface:
            stat = float(interface.split()[9])
            STATS[1:] = [stat]


print   'In         Out'
rx()
tx()

while True:
    time.sleep(1)
    rxstat_o = list(STATS)
    rx()
    tx()
    RX = float(STATS[0])
    RX_O = rxstat_o[0]
    TX = float(STATS[1])
    TX_O = rxstat_o[1]
    RX_RATE = round((RX - RX_O) / 1024 / 1024, 3)
    TX_RATE = round((TX - TX_O) / 1024 / 1024, 3)
    print RX_RATE, 'MB      ', TX_RATE, 'MB'

在这里插入图片描述

代码简要解析:

读取/proc/net/dev 中的信息,Python 中文件操作可以通过 open 函数,这的确很像 C 语言中的 fopen。通过 open 函数获取一个 file object,然后调用 read(),write()等方法对文件进行读写操作。

另外, Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。

.read()每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而.read()生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。

.readline() 和 .readlines()之间的差异是后者一次读取整个文件,像 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for … in … 结构进行处理。

另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

最后清单是打印出网络接口的输入和输出情况。

3. 总结

本实验旨在通过执行多个命令和使用Python编程语言实现对系统性能和资源的监测和分析。在本次实验中,我完成了以下任务,并获得了相应结果:

  1. 执行top、vmstat、lsof、tcpdump、netstat、htop、iostat、iptraf命令分别查看效果:
    • top命令提供了实时的系统性能监测,包括CPU、内存和进程信息。
    • vmstat命令显示了系统的虚拟内存使用情况和系统活动信息。
    • lsof命令可以列出当前打开的文件和进程信息。
    • tcpdump命令用于抓取和分析网络数据包。
    • netstat命令提供了网络连接和接口的相关信息。
    • htop命令是一个交互式的进程查看器,提供了更加直观和详细的进程信息。
    • iostat命令用于监测系统的输入输出情况。
    • iptraf命令提供了对网络接口的实时监测和统计。
  2. 执行sysv-rc-conf、nethogs、iftop、gnome-system-monitor命令分别查看效果:
    • sysv-rc-conf命令用于管理系统服务的运行级别配置。
    • nethogs命令可以监测网络接口上的实时流量,并显示相关进程信息。
    • iftop命令提供了对网络接口流量的实时监测和统计。
    • gnome-system-monitor是一个图形化的系统监视器,提供了对CPU、内存、网络和磁盘等资源的实时监测和分析。
  3. 使用nagios查看所有用户的服务状态详细信息:
    Nagios是一种开源的网络监控工具,可用于监测和管理各种网络设备和服务。通过使用Nagios,可以查看所有用户的服务状态详细信息,包括服务的运行状态、性能指标和报警信息等。
  4. 使用Python实现CPU检测:
    使用Python编程语言可以通过调用系统相关的接口或使用第三方库,实现对CPU的检测。具体的实现方式可以包括获取CPU的使用率、温度或负载等信息,并进行相应的处理和展示。
  5. 使用Python实现系统负载监测:
    Python提供了一些模块和库,可以实现对系统负载的监测。可以通过读取系统文件或使用系统调用等方式获取系统负载信息,并进行处理和分析,以便对系统的性能和资源使用情况进行评估和监测。
  6. 使用Python实现内存信息的获取:
    通过使用Python编程语言,可以调用系统接口或使用第三方库来获取系统的内存信息。可以获取总内存大小、可用内存、使用率等指标,并进行相应的处理和展示。
  7. 使用Python实现网络接口的监测:
    Python提供了一些库和模块,可以用于监测和分析网络接口的状态和流量。可以通过调用系统接口或使用第三方库来获取网络接口的信息,如接口状态、速率、流量等,并进行相应的处理和展示。

通过以上实验任务的执行,我们可以获取系统的性能和资源信息,并进行监测和分析。这些工具和编程技术可以帮助我们了解系统的运行状况,识别潜在的性能问题,并采取相应的措施进行优化和调整。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值