2021-2022-1 20212812《Linux内核原理与分析》第十二周作业

Linux系统监控实战

一、linux系统监控常用命令

  1. top
    top 命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了 CPU 的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程 PID、所使用命令以及其他。它还可以显示正在运行进程的内存和 CPU 占用多的情况。top

  2. vmstat
    用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动等的统计信息。
    一般 vmstat 工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。vmstat 2 2
    在这里插入图片描述

  3. lsof
    常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。lsof

  4. tcpdump
    是最广泛使用的网络包分析器或者包监控程序之一,它用于捕捉或者过滤网络上指定接口上接收或者传输的 TCP/IP 包。它还有一个选项用于把捕捉到的包保存到文件里,以便以后进行分析。
    在这里插入图片描述

sudo apt-get update
sudo apt-get install tcpdump
tcpdump -h
sudo tcpdump -i eth0 -c 3
  1. netstat
    是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。netstat -h
    在这里插入图片描述
  2. htop
    是一个非常高级的交互式的实时 Linux 进程监控工具。它和 top 命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。
sudo apt-get install htop
htop
  1. iotop
    非常类似于 top 命令和 htop 程序,不过它具有监控并显示实时磁盘 I/O 和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。

  2. iostat
    是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括本地磁盘以及诸如用 NFS 等的远端磁盘。

sudo apt-get install sysstat
iostat

在这里插入图片描述

  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
    是一个强大的服务管理程序,用于查看程序和服务的运行级别。
    在这里插入图片描述
    安装并运行 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

在这里插入图片描述

  1. System Monitor
    gnome-system-monitor 是 GNOME 系统监视器,能够监听 CPU,内存,进程,硬盘的信息。分为进程监控,资源监控,文件监控:
    进程监控:包括进程名,用户,CPU 占用率,进程 PID,内存占用。
    资源监控是对历史资源使用的统计,将其绘制成图展现,从图中可以看出 CPU 使用率的变化,存储占用率变化,带宽占用率变化。
$ sudo apt-get install gnome-system-monitor

$ gnome-system-monitor

二、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”,可查看所有用户的服务状态详细信息。
在这里插入图片描述

三、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()。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值