初创期应用架构实践 (11): 操作系统监控

叁叁肆2018-11-14 16:06

欢迎访问网易云社区,了解更多网易技术产品运营经验。


3.3.3  操作系统监控


一般情况下,通过应用进程状态我们可以大致判断应用是否正常,如果在某些场景下, 单纯依赖应用进程数据无法判断时,就需要依赖操作系统的一些监控数据来做参考。


操作系统提供对运行硬件资源的封装,从互联网应用的角度看,一般需要关注如下子 系统的基础监控:CPU、内存、磁盘及网络等。这几个子系统之间相互影响,一个子系统 出问题可能会影响其他几个子系统正常工作。


CPU 

CPU 使用率情况和使用它的资源密切相关。系统内核调度器的主要职责是调度两种不 同的资源:线程及中断。调度器针对不同的资源有不同的优先级。一般来说,优先级从高 到低依次是:中断处理、内核线程和普通用户态进程(不考虑实时进程)。中断由硬件设备 产生,设备在完成一项任务时,比如网上传输完一个数据包或者磁盘读完数据等,就会产生一个中断,操作系统在接收到中断后,需要调用对应的中断处理过程。所有内核相关的 处理过程(比如系统调用),中断处理以及内核线程都运行在内核态。除此之外的,一般我 们所熟悉的 Web 服务相关的程序(Web 服务器、数据库服务器及各种中间件程序)都属于 普通用户态进程,它们通过系统调用访问内核资源。为了正确理解或者能够通过操作系统 所提供的数据判断应用是否正常,我们需要理解一些概念。


上下文切换(Context Switch)

现代的单核 CPU 在同一时间也只能运行一个线程,多个 CPU 核心可以同时运行多个 线程。但一个标准的 Linux 内核,却可以同时(用户角度)运行几十到几万的线程。在只 有一个 CPU 核心的情况下,内核就需要在这些线程之间进行调度,以保证每个任务都能 得到 CPU 时间。每个线程都会分配一个时间片,在这个时间片用户有更高优先级的任务 到达时,当前线程的 CPU 资源就会被抢占,然后放到一个等待队列,这就称为上下文切 换。上下文切换的频率越高,说明内核需要花更多的时间做任务调度,而不是实际的运行 任务。


运行队列(Run Queue)

每个 CPU 核心都要维护一个运行队列,保存当前可运行但暂未执行的线程。理想情况 下,CPU 应该一直在运行或者执行线程,但是如果 CPU 的使用率比较高,有些线程就会处 理等待状态,保存在运行队列中。运行队列越大,线程等待运行的时间就越长。一般通过 Load 来描述运行队列的状态。系统 Load 描述的是当前系统中正在执行的线程与正在运行 队列中等待线程的综合情况。


CPU 使用率 

CPU 使用率反映的是 CPU 的使用情况,一般分如下几类:用户时间(User Time), CPU 执行用户空间线程的时间;系统时间(System Time), CPU 执行内核线程或者中断的时间; Wait IO(iowait)时间,CPU 因为所有线程都在等待 I/O 请求完成或者处理 idle 状态的时 间;空闲时间(Idle),CPU 处理完全空闲状态的时间。


CPU 负载判断 

综合前面提到的几个方面(运行队列、上下文切换和 CPU 使用率)的数据就可以对当 前的 CPU 负载做一个大致的判断。一般的判断标准如下。


1. 如果 CPU 满负载运行,那么 65%~70%的用户时间,30%~35%的系统时间,0%~5%的空间时间是比较正常的。
2. 单个 CPU 核心的运行队列一般不能超过 1~3 个运行线程,也就是说一般系统 Load 不能超过系统核心数的 2~3 倍。
3. 上下文切换的频率直接跟 CPU 使用率有关,如果 CPU 使用率比较高,而且比较符 合前面提到的用户系统时间分布,那么就算上下文切换比较多也可以接受。


在 Linux 下,一般可以通过 vmstat 命令来查看 CPU 的负载情况。 


vmstat 的输出对上下文切换的情况(cs) 、运行队列的情况(r)及 CPU 使用情况都有 统计。如果是多核系统,就可以通过 mpstat 命令查看 CPU 负载情况。






内存 

这里的“内存”包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内 存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(Swap)组合在一起作为虚拟 内存为进程提供了一个连贯的虚拟内存空间,好处是我们拥有的内存“变多了”,可以运行 更多、更大的程序,坏处是把部分硬盘当内存用,整体性能受到影响,硬盘读写速度要比 内存慢几个数量级,并且 RAM 和 Swap 之间的交换增加了系统的负担。


初期的内存监控主要关注两个点,一个是内存占用总量,一个是 Swap 空间的使用率。 Linux 系统下可使用 vmstat 命令查看内存使用情况(如 free、buff、cache 等) 。



内存使用量比较大,一方面可能是应用本身对内存需求比较大,那就需要扩容;另一 方面可能是程序本身的内存泄露,导致内存使用量越来越大。


当系统的物理内存使用量低到一定程序度时,系统就会开始使用 Swap 空间。如果观 察到系统在持续的使用 Swap 空间,一般说明系统内存不够,不能满足应用的需求。


磁盘 

磁盘 I/O 是操作系统中最慢的一个子系统,这主要是因为一般磁盘操作需要物理工作 (旋转和寻道,当然 SSD 不需要)。所以,我们在设计应用系统时,都要考虑尽量减少磁盘I/O 操作。一般的数据库系统,带持久化的队列或者缓存系统都需要写磁盘,我们需要对磁 盘的状态进行监控。


 磁盘使用空间 

磁盘使用空间是最基本的磁盘监控指标,如果磁盘已经没有空闲空间,就会影响应用 程序的运行。虽然有些程序会根据磁盘使用空间情况进行一定的保护措施(如基于磁盘使 用空间进行流控),但大部分时候我们需要主动监控这个指标,发现磁盘使用空间比较高时, 就要人工介入清理或者通过自动化工具定时清理。Linux 可通过 df 命令来查看磁盘空间的 使用情况。


磁盘使用率 

磁盘使用率反映磁盘的繁忙程度,主要有以下几个指标。
1. IOPS (I/O Operations Per Second):每秒钟完成的I/O操作数量。一般硬盘的最大IOPS 都可以根据磁盘的转速,寻道时间等估计出来,比如 SATA 磁盘的 IOPS 大概在 80 左右,SAS 磁盘的 IOPS 大概在 150~200 左右,而 SSD 的 IOPS 可以达到几万。通 过 IOPS 可以大概判断磁盘是否已经到瓶颈。


2. 平均等待时间(await):平均等待时间反映的是一个 I/O 请求从发出到磁盘完成处 理所经过的时间,包含在磁盘 I/O 请求队列中排队的时间以及磁盘处理请求的时间, 通过等待时间可以判断磁盘性能是否能满足应用对延迟的需求。如果等待时间增长 得比较快,对应用的影响就会比较大。


3. 使用率(ioutil): 在随机 I/O 比较多的多磁盘系统中,这个不是很精确,只有参考 意义。但是如果 ioutil 一直增长,说明对应磁盘的利用率比较高。一般情况下,应 该把使用率与平均等待时间放在一起来评估磁盘状态,如果使用率达到 100%,平 均等待时间并没有明显增加,就说明磁盘还没有到瓶颈,但如果平均等待时间显著 增加,就说明磁盘已经到瓶颈。


Linux 系统下可以通过 iostat 命令查看磁盘的负载情况。 


网络

互联网产品最主要的特征就是通过网络向用户提供服务,网络子系统的问题会影响服 务的质量。


网络带宽 

网络带宽是指在单位时间(一般指的是 1s)内传输的数据量。网络和高速公路类似, 带宽越大,就类似高速公路的车道越多,其通行能力越强。


Linux 系统下,ethtool 命令可以查看网卡信息,包括网上的处理能力。


网络流量(吞吐量) 

网络流量反映单位时间内经过网卡的数据量,一般能够反映业务的负载。如果流量突 然飙升,有可能说明用户请求量变多,也有可能是碰到网络攻击。如果流量突然降低,在 确定用户负载波动不大的情况下,说明 Web 服务器可能出现故障,无法正常接收用户请求。 sar 命令可以提供网上的流量统计信息。 



连接数量 

连接数量是客户端与服务端连接数量的统计,连接数量有比较大的波动时,一般也预 示着应用程序的问题。连接数量上经常会遇到的两个问题:一个是因为同时打开文件数目 的限制(可调整)导致无法建立新的连接;另一个是端口范围太小无法分配端口导致无法 建立新的连接。


连接状态 

一般是指 TCP 协议中的连接状态,主要关注 ESTABLISHED、CLOSE_WAIT、TIME_WAIT 这几个状态:比如是否存在大量 TIME_WAIT、CLOSE_WAIT 状态的连接, ESTABLISHED 连接的数量是否有大的波动等。连接状态及其数量的统计,在 Linux 系统 下可以通过 ss 命令来完成。



小 结 

本章我们分析了一个应用在初创期,从最初的技术选型到上线运行的全过程。在技术 选型介绍中,我们分析了做业务框架选型时要考虑的因素,并以 Java 做一个 Web 系统为例 进行介绍。同时也介绍了关于数据库、缓存及图片视频这些非结构化数据存储的技术选型。 在架构实践中,我们主要关注了如何实现快速迭代开发及交付部署,高可用及应用安全等 问题。最后,当系统上线后,我们还需要对运行的系统进行监控,主要介绍了一些监控的 指标,以期系统遇到问题时,能被我们先行发现和快速解决。在初创期,我们的目标是使 用工程化的方式,实现一个架构系统的成长,为接下来满足业务膨胀对系统扩展及增强的 需求提供良好的基础。


文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著


网易云计算基础服务深度整合了 IaaSPaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。点击可免费试用