学习 系统资源观察 的原因:
我们在使用linux操作系统的计算机来帮助我们完成一些工作任务时,或多或少会碰到一些计算机反应迟钝、甚至死机的情况。其中多数是由于内存不足等等,一系列系统资源问题引起。因此了解一些观察系统资源的linux指令,学会寻找当机原因,从而有的放矢得寻找解决问题的方法是有必要的~因此写这篇文章也是有必要的~
还记得在Linux 之 进程管理 -- 进程观察里学到的top
吗?里面有非常详细的关于top
的解释。相比较文章中一起学习的ps
,猫毛更喜欢用top
,因为它不仅能用来动态得观察进程,还可以观察系统资源。今天就从 1.系统资源观察指令 和 2.特殊文件 /proc/* 两个方面展开系统资源的观察。
1.系统资源观察指令
1.1观察内存使用情况 free
工作模式: free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
选项与参数:
-
-b
直接输入free
时,显示的单位是Kbytes,我们可以使用b(bytes),m(Mbytes),k(Kbytes),g(Gbytes)来显示单位。也可以直接让系统自己指定单位(-h) -
-t
在输出的最终结果,显示物理内存与swap的总量 -
-s
可以让系统每几秒钟输出一次,不间断一直输出 -
-c
与-s
同时处理,让free
列出几次的意思
这里解释一下我们看到的内容:
因为使用的命令是free -m(Mbytes来显示)
,所以我的系统当中有2848MB左右的物理内存,swap有1GB左右。 - 横向来看
Mem行:显示物理内存的量
Swap行:显示内存置换空间的量 - 纵向来看
total 是总量
used 是已被使用的量
free 是剩余可用的量
后面的 shared/buffers/cached则是在已被使用的量当中,用来作为缓冲及快取的量,而这些用量中,在系统比较忙碌时可以被释放出来继续利用,因此后面有avaliable
1.2 查阅系统与核心相关信息uname
工作模式:uname [-asrmpi]
选项与参数:
-
-a
所有系统相关的信息,包括底下的数据都会被列出来 -
-s
系统核心名称 -
-r
核心的版本 -
-m
本系统的硬件名称,例如i686或x86_64等 -
-p
CPU的类型,与-m
类似,只是显示CPU的类型 -
-i
硬件的平台(ix86)
1.3 观察系统启动时间与工作负载 uptime
鸡肋~uptime
这个指令很单纯,就是显示出,目前系统已经开机多久的时间,以及1,5,15分钟的平均负载,就是top
画面的最上面一行
1.4 追踪网络或插槽文件 netstat
netstat
的输出分为两大部分:
- 上半部:与网络较相关的部分
- 下半部分:与系统自己的进程相关性(非网络)
工作模式:netstat -[atunlp]
选项与参数: -
-a
将目前系统上所有的联机、监听、Socket数据都列出来 -
-t
列出tcp网络封包的数据 -
-u
列出udp网络封包的数据 -
-n
不以进程的服务名称,以埠号(port number)来显示 -
-l
列出目前正在网络监听(listen)的服务 -
-p
列出该网络服务的进程PID
1.4.1 网络联机情况部分
解释一下每一列的意义:
- Proto:网络的封包协议,主要分为TCP与UDP封包
- Recv-Q:非由用户程序链接到此socket的复制的总bytes数
- Send-Q:非由远程主机传送过来的acknowledged总bytes数
- Local Address:本地端的IP:port情况
- Foreign Address:远程主机的IP:prot情况
- State:联机状态,主要由建立(ESTABLISED)及监听(LISTEN)
上面这张图里仅有一条联机的数据,他的意义是:透过TCP封包的联机,远程的172.16.220.234:48300联机到本地端的172.16.15.100:ssh,这条联机状态是建立(ESTABLISHED)的状态!
1.4.2 系统自己进程相关部分
除了网络上的联机之外,其实Linux系统上面的进程是可以接受不同进程发来的信息,那就是Linux上头的插槽档(socket file)。
socket file可以沟通两个进程之间的信息,因此进程可以取得对方传送过来的资料。由于有socket file,因此类似X Window这种需要透过网络连接的软件,目前新版的distributions就以socket来进行窗口接口的联机沟通了。
解释一下socket file的输出字段意义:
- Proto:一般就是unix
- RefCnt:连接到此socket 的进程数量
- Flags:联机的旗标
- Type:socket 存取的类型。主要有确认联机的STREAM与DGRAM两种
- State:若为CONNECTED表示多个进程之间已经联机建立
- Path:连接到此socket的相关程序的路径,或者是相关数据输出的路径
利用netstat去看看我们的哪些进程有启动哪些网络的后门呢?
1.5 查看核心产生的讯息 dmesg
系统在开机的时候,核心会去侦测系统的硬件,所有核心侦测的讯息,不管是开机的时候还是系统运作过程中,反正只要是核心产生的讯息,都会被记录到内存中的某个保护区段。
如果我想要查看“核心的侦测”过程中产生的信息?便可以使用dmesg
命令,它就相当于一个“查看”指令,会将保护区段的信息读出来(为了查看方便,最好通过管线符号加上more
或者 less
查看)
1.6侦测系统资源变化 vmstat
vmstat
可以侦测 [CPU/内存/磁盘输入输出状态]等等,可以帮你系统中哪个环节是最累人的。
vmstat
的常见选项与参数说明:
-
-a
使用 inactive/active(活跃与否)取代 buffer/cache 的内存输出信息; -
-f
开机到目前为止,系统复制(fork)的进程数 -
-s
将一些事件(开机至目前为止)导致的内存变化情况列表说明 -
-S
后面可以接单位,让显示的数据有单位。例如K/M取代bytes的容量 -
-d
列出磁盘的读写总量统计表 -
-p
后面列出分区槽,可显示该分区槽的读写总量统计表
如果你想要实时得知道系统资源的运作状态,这个指令就不能不知道 - 进程字段(procs)的项目分别为
r:等待运作中的进程数量
b:不可被唤醒的进程数量
注意:这两个项目越多,代表系统越忙碌(因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒) - 内存字段(memory)项目分别为(和
free
相同)
swpd:虚拟内存被使用的容量
free:未被使用的内存容量
buff:用于缓冲存储器
cache:用于高速缓存 - 内存置换空间(swap)的项目分别为
si:由磁盘中将进程取出的量
so:由于内存不足而将没用到的进程写入磁盘的swap的容量
注意:如果si/so的数值太大,表示内存内的数据常常得在磁盘与主存储器之间来回传来传去,系统效能会很差。 - 磁盘读写(io)的项目分别为
bi:由磁盘读入的区块数量
bo:写入到磁盘去的区块数量
注意:这部分的值越高,代表系统的I/O非常忙碌 - 系统(system)的项目分别为
in:每秒被中断的进程次数
cs:每秒钟进行的事件切换次数
注意:这两个数值越大,代表系统与接口设备的沟通非常频繁(这些接口设备当然包括磁盘、网络卡、时间钟等) - CPU 的项目分别为
us:非核心层的CPU使用状态
sy:核心层所使用的CPU状态
id:闲置的状态
wa:等待I/O所耗费的CPU状态
st:被虚拟机(virtual machine)所盗用的CPU使用状态
磁盘部分的观察vmstat -d
2. 学习特殊文件/proc/*
之前,我们通过对“进程”的学习了解到:所谓的进程,都是在内存当中运行的。实际上,内存当中的数据又都是写入
/proc/*
这个目录下的。因此,我们可以通过直接观察proc
这个目录当中的文件,了解进程和系统资源。下面了解一些特殊文件吧,看他们能够提供给我们哪些有用的信息。
2.1 了解/proc
目录下的文件
建议在自己的lunix操作系统中,下达ll /proc
这个指令查看/proc
👇下面是截鸟哥的图来看/proc
目录的样子~
其中,鸟哥省略了很多PID的目录,因为目前主机上面的各个进程的PID都是以目录的型态存在于
/proc
当中。当你在自己的linux系统上查看/proc
时,看到更多的应该是以PID号码命名的目录,每个PID目录中都有好多与该进程相关的工作文档
举例:我们开机所执行的第一支程序systemd他的PID为1,这个PID的所有相关信息都写入在/proc/1/*当中,我们可以直接观察它
同理:我想了解任何一个PID,都可以通过ll /proc/PID号码/*
来查看
解释其中的两个文件 cmdline、environ
- cmdline:这个进程被启动的指令串
- environ:这个进程的环境变量内容
2.2 针对整个Linux系统相关的参数文件
文档名 | 文件内容 |
---|---|
/proc/cmdline | 加载kernel时所下达的相关指令与参数 |
/proc/cpuinfo | 本机的CPU的相关信息,包括频率、类型与运算功能等 |
/proc/devices | 这个文件记录了系统各个主要装置的主要装置代号,与mknod 有关 |
/proc/filesystems | 目前系统已经加载的文件系统 |
/proc/interrupts | 目前系统上面的IRQ分配状态 |
/proc/ioports | 目前系统上面各个装置所配置的I/O地址 |
/proc/kcore | 内存大小 |
/proc/loadavg |
top 以及 uptime 上头的三个平均数值就记录在这 |
/proc/meminfo | 使用 free 列出的内存信息 |
/proc/mounts | 系统已经挂载的数据,就是用mount 这个指令呼叫出来的数据 |
/proc/swaps | 系统挂载的内存就在这里,使用掉的partition就记录在这里啦 |
/proc/partitions | 使用 fdisk -l 会出现目前所有的partition吧?在这个文件当中也有记录 |
/proc/uptime | 就是用uptime 的时候,会出现的信息 |
/proc/version | 核心的版本,就是uname -a 显示的内容 |
/proc/bus/* | 一些总线的装置,还有USB的装置也记录在这里 |
了解了/proc
目录下的文件信息,是不是有种茅塞顿开、恍然大悟的感觉:我们刚刚学习的那些“查看系统资源的指令”如uptime
、free
等等,会不会都只是被系统包装好的快捷键,本质工作就是调取/proc
目录下的相关文件?猫毛深刻怀疑如此~以后,如果我们想要撰写一些监控系统资源的工具软件,这个目录下的文件没准就有帮助啦~