Linux操作系统监控服务器CPU、内存、磁盘、网络和dstat

  • Post author:
  • Post category:linux




top命令

TOP命令是Linux下一个实时的、交互式的,对操作系统整体监控的命令,可以对CPU、内存、进程监控。是Linux下最常见的监控命令。

在这里插入图片描述

通常使用top命令,我们主要关注一下这些数据:

  • user:当前登录用户数

  • load average:我们从上方图中可以看到,load average 中分别有三个值,这三个值分别表示在过去1分钟、5分钟、15分钟的系统负载,即任务队列的平均长度。(在我们业内有个规范,load average最好不要大于Cpu的核数,否则系统都超负载了)

  • Task:102 total 进程总数

    1、running 正在运行的进程数
    2、sleeping 睡眠的进程数
    3、 stopped 停止的进程数
    4、 zombie 僵尸进程数
    
  • %Cpu(s): 31.2% us 用户空间占用 CPU 百分比

    1、 sy:内核空间占用 CPU 百分比,通常来说,us(用户)高于sy(系统),会比较好,毕竟我们的操作系统主要还是给用户用的。
    2、 ni: 用户进程空间内改变过优先级的进程占用 CPU 百分比
    3、	id:空闲的CPU百分比(CPU使用率,主要关注这个数据)
    4、	wa:等待输入输出的 CPU 时间百分比(IOwait,通常这个较高的话,则意味这个网络IO或者磁盘IO存在一定的问题,需要进一步排查)
    5、 hi:硬中断
    6、 si:软中断
    

    这里cpu统计的是整个cup的平均数据,因为我们cpu有很多核,如果我们想要看每个核的cpu数据,可以按数字1,查看具体的cpu数据,这里也可以看到我当前的Liunx系统是2核的,所以有两条数据

    在这里插入图片描述


    这里注意,很多人在看cpu使用率的时候,以为达到100%,cpu就满负荷了,但其实不是的,实际工作中,经常会出现cpu大于100%的情况,这里cpu主要是根据你系统的核数也决定的,比如你当前的操作系统是8核的,那么cpu可以高达800%。



内存监控 – free

free 命令可以查看当前系统内容的使用情况

在这里插入图片描述

  • free -m: 以MB为单位显示系统内存的使用情况,同理,也可以使用 -k, -g等其他的单位显示
  • free 命令从两个诶度统计了内存的使用情况

    1、第一行Mem:从操作系统角度统计了内存的total、used、free、buffers、cached、available

    2、第二行 Swap: 从应用程序角度统计了内存的total、used、free、buffers、cached、available


buffer 和 cache

两者都是linux下的缓存机制,但是其中buffer为写操作的缓存,cache为读操作的缓存。


swap


交换空间,磁盘上的一块空间,当前系统内存不足时,会使用交换空间,通常情况下不会。


通常内存的判断标准为使用内存不能大于90%,我们可以用avaliable / total 来计算使用率。



磁盘IO监控 – iostat

在这里插入图片描述


iostat -x -k 1

  • -x:展示磁盘的扩展信息
  • -k:以k为单位展示磁盘数据
  • 1:没1秒刷新一次数据


展示结果

  • unti:磁盘IO的使用率,单位%,反应磁盘的繁忙程度,上限100%
  • r/s:每秒读请求数
  • w/s:每秒写请求数
  • rkb:每秒写磁盘的字节数
  • wkb:每秒读磁盘的字节数


磁盘我们主要关注磁盘的读写率,但是通常我们通过磁盘读写率,并不能看出来磁盘是否有问题,因为有写磁盘性能较好,即使他的读写率较高,但是对于磁盘来讲并没有什么问题,相反有些磁盘读写率较低,相同的读写率,磁盘的性能存在差异,因此我们需要通过 %until,去看到磁盘IO的使用的百分比。建议通常不要超出80%



磁盘空间监控 – df

df命令可以查看当前系统磁盘空间的使用情况

在这里插入图片描述


磁盘速度测试

dd if=/dev/zero of=/home/ddtest bs=8k count=100000 oflag=direct

在这里插入图片描述



综合监控工具 – vmstat

vmstat 命令是最常见的 Linux/Unix 监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的 CPU 使用率,内存使用,虚拟内存 交换情况,IO 读写情况。

这个命令是我查看 Linux/Unix 最喜爱的命令,一个是 Linux/Unix 都支持,二是相比 top,我可以看到整个机器的 CPU,内存,IO 的使用情况,而不是单单看到各个进程的 CPU 使用率和内存使用率(使用场景不一样)。

在这里插入图片描述

上方 vmstat 1,表示采集每秒的数据。下面我们来看看每个数据的具体含义。

  • r :表示运行队列(就是说多少个进程真的分配到 CPU),我测试的服务器目前 CPU 比较空闲,没什么程序在跑,当这个值超过了 CPU 数目,就会出现 CPU 瓶颈 了。这个也和 top 的负载有关系,一般负载超过了 3 就比较高,超过了 5 就高,超过了 10 就不正常了,服务器的状态很危险。top 的负载类似每秒的运行队 列。如果运行队列过大,表示你的 CPU 很繁忙,一般会造成 CPU 使用率很高。
  • b :表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
  • swpd: 虚拟内存已使用的大小,如果大于 0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
  • free :空闲的物理内存的大小
  • Linux/Unix: 系统是用来存储,目录里面有什么内容,权限等的缓存
  • cache :直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用 300 多 M(这里是 Linux/Unix 的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached 会很快地被使用。)
  • si :每秒从磁盘读入虚拟内存的大小,如果这个值大于 0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
  • so :每秒虚拟内存写入磁盘的大小,如果这个值大于 0,同上。
  • bi :块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是 1024byte,我本机上没什么 IO 操作,所以一直是 0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到 140000/s,磁盘写入速度差不多 140M 每秒
  • bo :块设备每秒发送的块数量,例如我们读取文件,bo 就要大于 0。bi 和 bo 一般都要接近0,不然就是 IO 过于频繁,需要调整。
  • in :每秒 CPU 的中断次数,包括时间中断
  • cs :每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的 数目,例如在apache 和 nginx 这种 web 服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择 web 服务器的进程可以由进程或 者线程的峰值一直下调,压测,直到 cs 到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核 空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的 CPU 大部分浪费在上下文切换,导致 CPU 干正经事的 时间少了,CPU 没有充分利用,是不可取的。
  • us :用户 CPU 时间,我曾经在一个做加密解密很频繁的服务器上上,可以看到 us 接近 100,r运行队列达到 80(机器在做压力测试,性能表现不佳)。
  • sy :系统 CPU 时间,如果太高,表示系统调用时间长,例如是 IO 操作频繁。
  • id 空闲 CPU 时间,一般来说,id + us + sy = 100,一般我认为 id 是空闲 CPU 使用率,us 是用户 CPU 使用率,sy 是系统 CPU 使用率。
  • wt: 等待 IO CPU 时间。
  • vmstat –s 可以查看 page in/page out 的数量


通常在性能测试工作中,主要使用vmstat 1 来查看当前系统是否有发生swap,主要关注si 和 so,如果说你当前系统swap中数据一直在发生变动,则说明你们操作系统当前存在一定的性能问题,需要进行排查和调优。



网络监控- netstat

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

下面我们来看看执行netstat后的输出结果,从整体上看,netstat 的输出结果可以分为两个部分:

在这里插入图片描述

1、一个是 Active Internet connections,称为有源 TCP 连接,其中”Recv-Q”和”Send-Q”指%0A的是接收队列和发送队列。这些数字一般都应该是 0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

2、另一个是 Active UNIX domain sockets,称为有源 Unix 域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。

Proto 显示连接使用的协议,RefCnt 表示连接到本套接口上的进程号,Types 显示套接口的类型,State 显示套接口当前的状态,Path 表示连接到套接口的其它进程使用的路径名。


常见参数:

-a (all)显示所有选项,默认不显示 LISTEN 相关

-t (tcp)仅显示 tcp 相关选项

-u (udp)仅显示 udp 相关选项

-n 拒绝显示别名,能显示数字的全部转化成数字。

-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名

-r 显示路由信息,路由表

-e 显示扩展信息,例如 uid 等 -s 按各个协议进行统计

-c 每隔一个固定时间,执行该 netstat 命令。


提示:LISTEN 和 LISTENING 的状态只有用-a 或者-l 才能看到


实用命令实例

列出所有端口 (包括监听和未监听的)

在这里插入图片描述

列出所有 tcp 端口 netstat -at

netstat -at

列出所有 udp 端口 netstat -au

netstat -au



超级监控工具 – dstat

dstat是一个全能的性能监控工具,整合了CPU、内存、磁盘、网络等几乎所有的监控项,支持实时刷新。


安装dstat

yum install -y dstat

在日常性能测试工作中,最常用的命令是

dstat -tcmnd --disk-util

在这里插入图片描述



版权声明:本文为weixin_43865008原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。