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



Linux 系统监控实战

系统监控的重要性

我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的。但是这不是打开机器电源然后放任不管就可以得到的。所以我们要监视系统的运行状况,发现问题及时处理。

对于系统和网络管理员来说每天监控和调试 Linux 系统的性能问题是一项繁重的工作。监控和保持系统启动并运行是很不容易的一件事。接下来介绍部分 Linux 的系统监控命令。

实验过程

1.linux系统监控常用命令(一)

CPU 监控 top

Linux 下的 top 命令是一个性能监控程序,许多系统管理员常常用它来监控 Linux 性能,在许多 Linux 或者类 Unix 操作系统里都有这个命令。top 命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了 CPU 的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程 PID、所使用命令以及其他。它还可以显示正在运行进程的内存和 CPU 占用多的情况。

top

操作截图:
在这里插入图片描述
在图中依次可以看到进程 PID,进程用户,CPU 使用率,内存使用率、交换内存使用大小等等信息。top 命令提供了实时的对系统处理器的状态监视,它将显示系统中 CPU 最“敏感”的任务列表。

通过man top可以查看到详细的 top 命令使用方式。

man top

在这里插入图片描述

虚拟内存监控 vmstat

Linux 的 vmstat 命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动等的统计信息。

一般 vmstat 工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。

vmstat 2 1

vmstat 2 2

在这里插入图片描述
如果要求 vmstat 每 2 秒采集数据,一直采集,直到结束程序(Ctrl+C)。则省略采集次数:

vmstat 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 时间的百分比

列出打开的文件:lsof

它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候,使用这条命令,你可以很容易地看到正在使用哪个文件。

实验环境中没有安装这个命令,需要手动安装 sudo apt-get install lsof 然后在终端输入lsof

sudo apt-get install lsof
lsof

此命令运行的结果较长,截图部分:
在这里插入图片描述

网络包分析器:tcpdump

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

参数描述
-h查看命令帮助
-i网络接口
-c需要输出包数量
sudo apt-get update
sudo apt-get install tcpdump
tcpdump -h
sudo tcpdump -i eth0 -c 3

操作截图:
在这里插入图片描述

网络状态统计:netstat

netstat 是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。

参数描述
-h查看帮助
-r查看 IP 路由表
-i查看网络接口

操作截图:
在这里插入图片描述
在这里插入图片描述

进程监控:htop

htop 是一个非常高级的交互式的实时 Linux 进程监控工具。它和 top 命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。htop 是一个第三方工具,它不包含在 Linux 系统中,你需要使用管理工具去安装它。

sudo apt-get install htop
htop

操作截图:
在这里插入图片描述

监控 Linux 磁盘 I/O :iotop

iotop 命令同样也非常类似于 top 命令和 htop 程序,不过它具有监控并显示实时磁盘 I/O 和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。

这个命令只有在 kernelv2.6.20 及以后的版本中才有。python 版本需要 python2.7 及以上版本。由于系统原因,实验环境并不支持此命令。此处仅做介绍。

输入/输出统计:iostat

iostat 是一个计算机系统监视工具,用于收集和显示操作系统存储的输入和输出统计数据。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括本地磁盘以及诸如用 NFS 等的远端磁盘。

sudo apt-get install sysstat
iostat

操作截图:
在这里插入图片描述
avg-cpu 段:

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

Device 段:

参数含义
tps每秒钟发送到的 I/O 请求数
KB_read/s每秒读取的 block 数
KB_wrtn/s每秒写入的 block 数
KB_read启动到现在 读入的 block 总数
KB_wrtn启动到现在写入的 block 总数

查看帮助:

man iostat

在这里插入图片描述

实时局域网 IP 监控:IPTraf

IPTraf 是一个在 Linux 控制台运行的、开放源代码的实时网络(局域网)监控应用。它采集了大量信息,比如通过网络的 IP 流量监控,包括 TCP 标记、ICMP 详细信息、TCP/UDP 流量分离、TCP 连接包和字节数。同时还采集有关接口状态的常见信息和详细信息:TCP、UDP、IP、ICMP、非 IP,IP 校验和错误,接口活动等。

sudo apt-get install iptraf
sudo iptraf

操作截图(注意图片中下面的提示操作信息。):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看命令帮助信息,根据需要选择合适的参数,进行监控。此处便不再赘述命令参数,只做简单几个示例:

sudo iptraf -h

在这里插入图片描述
示例:

sudo iptraf -g

在这里插入图片描述

2、linux系统监控常用命令(二)

服务管理程序:sysv-rc-conf

Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作。sysv-rc-conf 是一个强大的服务管理程序,用于查看程序和服务的运行级别。

Ubuntu 的系统运行级别:

参数描述
0系统停机状态
1单用户或系统维护状态
2~5多用户状态
6重新启动

安装并运行 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

这个命令较为复杂,可以再查询其他帖子进行学习。

监视每个进程使用的网络带宽:NetHogs

NetHogs 是一个开放源源代码的很小程序(与 Linux 下的 top 命令很相似),它密切监视着系统上每个进程的网络活动。同时还追踪着每个程序或者应用所使用的实时网络带宽。

# 安装 nethogs
$ sudo apt-get install nethogs

# 因为 0.8.0 的一个 bug,需要先切换到 root 再执行,使用 sudo 会报错,安装 0.8.1 以上的版本就没问题了

# 实验环境中的 0.8.0 版本
$ sudo su
$ nethogs

若还是报错没有 root 权限,可以手动编译最新版的运行,步骤如下:

#安装编译需要的工具
$ sudo apt-get update
$ sudo apt-get install build-essential libncurses5-dev libpcap-dev checkinstall

#从 nethogs 项目页面拉取源码
$ wget https://github.com/raboof/nethogs/archive/v0.8.5.tar.gz

#解压并进入文件夹
$ tar -zxvf v0.8.5.tar.gz
$ cd nethogs-0.8.5

#开始编译,接下来一直回车确定就行了
$ sudo checkinstall -D make install

#安装生成的 deb 包
$ sudo dpkg -i nethogs_0.8.5-1_amd64.deb

#然后就可以运行了
$ sudo nethogs

操作截图:
在这里插入图片描述
用 Q 退出 nethogs 的界面。

运行 nethogs 命令:

$ nethogs --help

$ sudo nethogs > nethogs.txt

操作截图:
在这里插入图片描述
在这里插入图片描述
打开主文件夹,查看 nethogs.txt 里面的内容。(由于实验环境对字符的支持问题,可能会出现乱码):
在这里插入图片描述
在这里插入图片描述

监视网络带宽:iftop

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 行/只显示发送流量/只显示接收流量

更多操作请查看帮助(在上述界面中按h,即可进入下面的帮助界面):

在这里插入图片描述

System Monitor(图形化监视)

gnome-system-monitor 是 GNOME 系统监视器,能够监听 CPU,内存,进程,硬盘的信息。分为进程监控,资源监控,文件监控:

注意:这个工具需要切换到图形界面才可以使用

$ sudo apt-get install gnome-system-monitor

$ gnome-system-monitor

进程监控:包括进程名,用户,CPU 占用率,进程 PID,内存占用,优先级:

操作截图:
在这里插入图片描述
资源监控是对历史资源使用的统计,将其绘制成图展现,从图中可以看出 CPU 使用率的变化,存储占用率变化,带宽占用率变化。

操作截图:

在这里插入图片描述

由于实验环境的原因,文件监控包括 hosts,hostname 等。
在这里插入图片描述
双击 hosts,查看其内容:

操作截图:
在这里插入图片描述

3、Linux系统监控工具——Nagios

Nagios 是一个监视系统运行状态和网络信息的监视系统。Nagios 能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等。

Nagios 可运行在 Linux/Unix 平台之上,同时提供一个可选的基于浏览器的 WEB 界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等等。

Nagios 可以监控的功能有:

1、监控网络服务(SMTP、POP3、HTTP、NNTP、PING 等);

2、监控主机资源(处理器负荷、磁盘利用率等);

3、简单地插件设计使得用户可以方便地扩展自己服务的检测方法;

4、并行服务检查机制;

5、具备定义网络分层结构的能力,用"parent"主机定义来表达网络主机间的关系,这种关系可被用来发现和明晰主机宕机或不可达状态;

6、当服务或主机问题产生与解决时将告警发送给联系人(通过 email、短信、用户定义方式);

7、可以定义一些处理程序,使之能够在服务或者主机发生故障时起到预防作用;

8、自动的日志滚动功能;

9、可以支持并实现对主机的冗余监控;

10、可选的 WEB 界面用于查看当前的网络状态、通知和故障历史、日志文件等。

安装 Nagios

首先 update 一下,然后安装 Nagios,同时安装 Apache、Postfix,所以下面会涉及简单的邮件服务器的配置。

$ sudo apt-get update
$ sudo apt-get install nagios3 apache2 libapache2-mod-php postfix

操作截图:
在这里插入图片描述

点击“TAB”键选择确定:

在这里插入图片描述
回车确定:
在这里插入图片描述
填写邮件服务器域名,此处选择默认主机名 ,直接“TAB+回车”确定:

在这里插入图片描述
填写 Nagios 管理员密码:(ysc123)
在这里插入图片描述
确定密码:
在这里插入图片描述
安装完毕:
在这里插入图片描述

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

$ sudo apt-get install tree

$ cd /etc/nagios3

$ tree

操作截图:
在这里插入图片描述

访问测试

启动 apache2 与 nagios:

$ sudo service apache2 start

$ sudo service nagios3 start

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

http://127.0.0.1/nagios3/

在这里插入图片描述
操作截图:
在这里插入图片描述

使用 Nagios

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

操作截图:
在这里插入图片描述
参考文档:
NAGIOS

4、Linux 监控的 Python 脚本

目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具,比如 inotify-sync(文件系统安全监控软件)、glances(资源监控工具)。在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控。本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU、内存和网络的监控脚本的编写。

实验原理

基于/proc 文件系统

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

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

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

编写脚本

下面开始编写系统监控的脚本。

CPU 监测

$ touch cpu.py

$ gedit cpu.py

在 cpu.py 中写入以下代码:

#!/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'])

操作截图:
在这里插入图片描述

运行此 python 文件:

$ python cpu.py

结果如下:
在这里插入图片描述
程序简要解析:

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

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

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

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

Python 实现系统负载监测

建立 sys_load.py, 并写入以下代码:

$ touch sys_load.py

$ gedit 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']

操作截图:
在这里插入图片描述

运行此脚本:

$ python sys_load.py

结果如下:
在这里插入图片描述

程序简要解析:

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

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

Python 实现内存信息的获取

建立 mem.py,并写入以下代码:

$ touch mem.py

$ gedit 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']))

操作截图:
在这里插入图片描述

运行此脚本:

$ Python mem.py

结果如下:
在这里插入图片描述

代码简要解析:

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

Python 实现网络接口的监测

建立 net.py,并写入以下代码:

$ touch net.py

$ gedit 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'

操作截图:
在这里插入图片描述

运行此脚本:

 $ python net.py

结果如下:
在这里插入图片描述

对于有多个网卡的主机,可以利用如下命令查看其它网卡流量,例如 eth1,由于本实验环境只有一个网卡,所有只能跟踪 eth0。

$ python net.py eth1

代码简要解析:

读取/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()。

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

Python脚本总结

本文主要介绍了使用 python 脚本监控 cpu,系统负载,内存信息,网络接口。

对代码还不熟悉的同学可以多敲几遍代码,加深对代码的理解。如果对 Python 还不是太熟悉的同学,可以点击Python3 简明教程进行学习。

总结

在Linux系统监控的实战中,我深入了解了系统监控的基本原理和工具。通过学习,我掌握了一些关键的命令和工具,如CPU 监控 top、虚拟、内存监控 vmstat等等,还学习了使用vmstat和iostat等工具来监测系统的虚拟内存和磁盘I/O性能等等。通过这次实战,我深刻认识到系统监控对于维护和优化Linux系统的重要性。

Chatgpt帮助

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值