Author:rab
目录
- 前言
- 一、性能指标
- 1.1 进程
- 1.1.1 进程定义
- 1.1.2 进程状态
- 1.1.3 进程优先级
- 1.1.4 进程与程序间的关系
- 1.1.5 进程与进程间的关系
- 1.1.6 进程与线程的关系
- 1.2 内存
- 1.2.1 物理内存与虚拟内存
- 1.2.2 页高速缓存与页写回机制
- 1.2.3 Swap Space
- 1.3 文件系统
- 1.3.1 文件系统分类
- 1.3.2 文件系统选择
- 1.3.3 优化思路
- 1.4 磁盘 I/O
- 1.4.1 认识磁盘
- 1.4.2 磁盘 I/O 调度策略
- 1.4.3 磁盘与缓存机制
- 1.5 网络
- 二、性能分析工具
- 2.1 CPU 性能分析工具
- 2.1.1 vmstat
- 2.1.2 mpstat
- 2.1.3 uptime
- 2.2 内存性能分析工具
- 2.2.1 free
- 2.2.2 smem
- 2.3 磁盘性能分析工具
- 2.3.1 iotop
- 2.3.2 iostat
- 2.4 网络性能分析工具
- 2.4.1 ping
- 2.4.2 traceroute
- 2.4.3 mtr
- 2.5 系统性能综合分析工具
- 2.5.1 top
- 2.5.2 htop
- 总结
前言
Linux 系统性能指标无非就是这几个方面,CPU、内存、磁盘 I/O、文件系统、网络等相关指标。不同的性能指标都有对应的具体命令工具进行查看与监控,接下来我们将介绍一些常见的 Linux 系统性能指标及其对应的命令工具(通过命令工具找出 Linux 系统性能瓶颈),而要优化 Linux 系统性能,首先就要对 Linux 性能指标的知识点进行整体掌握,否则一切都是空谈。
一、性能指标
1.1 进程
1.1.1 进程定义
在计算机网络领域中,进程是指正在运行的程序的实例。它是操作系统管理和分配资源的基本单位。每个进程都包含程序代码、数据、内存、寄存器和系统资源的集合,它们在内存中独立存在,相互隔离,互不干扰。
1.1.2 进程状态
在操作系统中,进程可以处于不同的状态,这些状态表示了进程在其生命周期中的不同情况和条件。通常,进程可以分为以下几种主要状态:
-
创建(Created):
当一个新进程被创建但尚未被操作系统调度执行时,它处于创建状态。在这个状态下,进程的控制块被初始化,但尚未分配 CPU 资源。
-
就绪(Ready):
一旦进程被初始化并且满足了运行的条件,它就会进入就绪状态(其实就是进入了任务队列)。在就绪状态下,进程等待操作系统的调度以获得 CPU 时间片来执行。
-
运行(Running):
当操作系统调度进程并将其分配到 CPU 时,进程进入运行状态。在运行状态下,进程将会执行其指令和代码。
-
阻塞(Blocked):
如果一个进程在执行过程中需要等待某些事件(例如I/O操作完成、等待资源释放等),它就会进入阻塞状态。在阻塞状态下,进程不会消耗CPU时间,直到等待的事件发生。、
其实我们经常说的
可中断睡眠进程
和不可中断睡眠进程
就是处于阻塞的一种状态,唯一的区别就是可中断的等待状态
的进程一旦达到某种条件就会处于运行状态
或由于接收到信号被提前唤醒并进入运行状态
,而不可中断的等待状态
的进程则不会对接收的信号进行响应(典型的例子就是等待磁盘 I/O 操作)。 -
终止(Terminated):
当进程完成其任务或由于某种原因终止时,它会进入终止状态。在终止状态下,进程的所有资源被释放,并且进程的控制块被清除。
-
挂起(Suspended):
有时操作系统可以将进程挂起,即使它是就绪或运行状态。挂起状态意味着进程被暂时停止,不会消耗CPU时间。通常,挂起状态是为了释放资源或优化系统性能。
进程状态之间的转换通常如下:
-
进程可以从创建状态转换到就绪状态。
-
进程可以从就绪状态转换到运行状态,从运行状态转换到就绪状态(例如,时间片用完),或者从运行状态转换到阻塞状态(例如,等待I/O操作完成)。
-
进程可以从阻塞状态转换到就绪状态(例如,等待的I/O操作完成),或者从阻塞状态转换到终止状态(例如,因为发生了错误)。
-
进程可以从就绪状态转换到挂起状态或从挂起状态转换回就绪状态。
-
进程可以从就绪状态或阻塞状态转换到终止状态。
进程状态的管理和调度是操作系统的重要任务之一,以确保资源的有效分配和进程的合理执行顺序。不同的操作系统和调度算法可能会有不同的状态管理方式和规则。
1.1.3 进程优先级
首先要清楚,Linux 是一个多用户多任务的操作系统,如何理解多用户
和多任务
?
-
多用户
即 Linux 系统允许多个用户同时访问和使用系统资源,每个用户有自己的用户账户(用于身份验证和授权),且每个用户账户通常有自己的家目录,用于存储个人文件和配置。
-
多任务
多任务是指操作系统能够同时运行多个程序或进程,而不仅仅是一个程序在运行,这使得多个任务可以并发执行。在 Linux 系统中,每个任务通常是一个独立的进程或线程。这些任务可以是用户启动的应用程序、系统服务、后台进程等。所有的任务都放在一个队列中,操作系统通过分时调度算法来分配 CPU 时间片,以便在多个任务之间切换,从而实现并发执行。
对于
单 CPU 多任务操作系统
而言,CPU 通过分配时间片以并发的方式来执行多任务(串行执行——即在某个时间点只能执行一个任务);而对于多 CPU 多任务操作系统
而言,CPU 既可以过分配时间片以并发的方式来执行多任务,也可以在某个时间点并行执行多个任务,这就是多核 CPU 比单核 CPU 处理性能高的原因。
那在队列中的这些任务谁先会被 CPU 执行呢?是随机的吗?于是这里就涉及到了进程优先级与 nice 值的相关概念了
。在操作系统中,通常存在两种类型的进程优先级:动态优先级和静态优先级。这两种优先级概念用于进程调度和资源分配,但它们有不同的性质和影响。
-
静态优先级(Static Priority):
- 静态优先级是在进程创建时分配的,并且在进程的整个生命周期内保持不变。
- 静态优先级通常由用户或程序员明确设置,以反映进程的重要性或性能需求。这通常通过操作系统提供的API或命令来实现。
- 进程的静态优先级在进程的整个生命周期中不会改变,除非明确修改。
-
动态优先级(Dynamic Priority):
- 动态优先级是在运行时根据系统负载和其他因素动态调整的优先级。
- 动态优先级的调整可以根据进程的行为、CPU利用率、等待时间等因素进行,以便更好地响应系统的需求。
- 操作系统的调度算法通常会考虑动态优先级来决定哪个进程在给定时刻获得CPU时间。
那 nice 值又是个什么东西呢?nice
值用于表示进程的优先级(静态优先级),但是与一些其他操作系统不同的是,Linux 系统的nice
值的范围通常是 -20~19
,而不是 0~139
,较低的nice
值表示较高的优先级,较高的nice
值表示较低的优先级。因此在任务队列中谁会先被 CPU 调度取决于该任务的优先级,若某些任务的优先级较高,则操作系统将更频繁地分配CPU时间给这些进程,反之将较少地获得 CPU 时间。那在 Linux 系统中,我们如何设置任务(进程)的 nice 值呢?具体方法如下:
-
设置 nice 值的基本语法
# 语法1 - 运行一个新任务(进程)时为其指定nice值 nice -n <nice_value> <command># <nice_value>:是一个整数,表示要为进程设置的nice值,范围(-20~19) # <command>:是要运行的程序及其参数(即程序启动命令)
# 语法2 - 修改一个正在运行的进程的nice值 renice <nice_value> -p <PID># <nice_value>:是一个整数,表示要为进程设置的nice值,范围(-20~19) # <PID>:正在运行的进程PID号
-
案例
nice -n -10 ./your_program renice 5 -p <your_program_PID>
注意的是:nice
命令可允许普通用户降低进程的优先级,但不能提高其优先级,提高优先级通常需要超级用户权限。而且在 Linux 中,大多数进程的默认nice
值为0,这表示它们具有标准的优先级。
1.1.4 进程与程序间的关系
进程(Process)和程序(Program)是计算机科学中相关但不同的概念,它们之间存在紧密的关系:
-
程序(Program): 程序是一组指令和代码的集合,它是以某种编程语言编写的、用于完成特定任务的软件。程序是静态的,它通常存储在磁盘上,等待被执行。程序的典型示例包括编写的源代码文件、可执行二进制文件(已经编译并可以运行的程序)、脚本文件等。
-
进程(Process): 进程是程序的实际执行实例。当程序在计算机上运行时,操作系统会为它创建一个进程,分配资源(如内存、CPU时间、文件描述符等),并在计算机上执行程序的指令。每个进程都是独立的、有自己的内存空间和执行环境。多个进程可以同时运行,彼此独立。
1.1.5 进程与进程间的关系
在操作系统中,不同进程之间可以有多种关系和交互方式。以下是一些常见的进程之间的关系:
-
父子进程关系: 在某些操作系统中,一个进程可以创建其他进程(通过 fork() 系统调用来创建),这些创建的进程被称为子进程,而创建它们的进程称为父进程。子进程通常继承父进程的一些属性,如文件描述符、环境变量等。父子进程之间可以通过进程间通信机制来交换数据和信息。
父子进程中又会涉及到
僵尸进程
和孤儿进程
的概念:-
僵尸进程(Zombie Process)
僵尸进程是指一个子进程在执行完毕后,但其父进程尚未通过系统调用(通常是
wait()
或waitpid()
)来获取子进程的终止状态信息。因为操作系统需要保留子进程的一些信息(如退出状态码),直到父进程请求这些信息,所以这个子进程被称为"僵尸"。僵尸进程不占用系统资源,但在系统中存在时,会占用进程号(PID)等资源。解决僵尸进程的常见方法是父进程调用
wait()
或waitpid()
等系统调用,来获取子进程的退出状态信息,然后将僵尸进程彻底清理掉。如果父进程没有正确处理子进程的退出状态,就会导致僵尸进程的堆积,最终可能会耗尽系统的进程号资源。一句话:僵尸进程是子进程在终止后父进程未处理其退出状态信息的情况,需要父进程调用
wait()
或waitpid()
来清理。 -
孤儿进程(Orphan Process)
孤儿进程是指一个子进程的父进程在子进程终止后,自己提前退出或异常终止,导致子进程失去了父进程。这时候,孤儿进程会被操作系统的init进程(通常具有PID 1)接管。init进程会成为孤儿进程的新父进程,负责收养和管理它们。
孤儿进程的存在是为了确保进程不会变成僵尸进程。因为 init 进程会定期检查并处理它的子进程,一旦孤儿进程终止,init 进程会及时回收它的资源,包括终止状态信息,从而避免了僵尸进程的问题。
一句话:孤儿进程是子进程的父进程提前终止,导致子进程失去了父进程。这些子进程会被操作系统的init进程接管,以避免它们变成僵尸进程。
如果父进程在子进程
-
-
兄弟进程关系: 兄弟进程是指由同一个父进程创建的多个子进程。这些兄弟进程通常是独立运行的,但它们可以共享某些资源,如父进程创建的文件描述符或共享内存区域。
-
并发进程关系: 并发进程是指在系统中同时运行的多个独立进程,它们可以在不同的处理器核心(比如多核服务器)上并行执行,以提高系统性能。
-
竞争条件和同步关系: 当多个进程试图同时访问共享资源时,可能会发生竞争条件。为了避免数据损坏和不一致性,需要使用同步机制来确保进程之间的顺序执行或互斥访问共享资源。
-
进程间通信关系: 进程之间可以通过进程间通信(Inter-Process Communication,IPC)机制来交换数据和信息。常见的 IPC 方式包括管道、消息队列、信号、套接字、共享内存等。
-
进程间协作关系: 进程可以协作来完成复杂的任务。这种协作可以通过共享数据、互相通知、等待其他进程完成某些操作等方式来实现。
-
进程间客户端-服务器关系: 在分布式系统中,进程之间可以扮演客户端和服务器的角色。客户端进程请求服务并与服务器进程通信,以实现分布式应用程序的功能。
1.1.6 进程与线程的关系
进程(Process)和线程(Thread)都是操作系统中用于实现多任务处理的关键概念,它们之间存在紧密的关系,但也有一些重要的区别。
-
进程和线程的定义:
- 进程是程序的执行实例,它有独立的内存空间、资源和执行环境。每个进程都有自己的地址空间和系统资源,进程之间相互独立。
- 线程是进程内的一个执行单元,线程共享进程的内存空间和资源,因此多个线程可以在同一进程内并发执行。
-
资源分配和管理:
- 进程需要独立的资源,如内存、文件描述符等,操作系统需要分配和管理这些资源,因此进程之间的资源隔离较强。
- 线程共享进程的资源,包括内存和文件句柄等。这使得线程之间的通信和数据共享更加容易,但也需要更小心地进行同步和互斥,以避免竞态条件和数据访问冲突。
-
创建和销毁开销:
- 创建和销毁进程通常比较昂贵,因为它们需要分配和释放独立的资源。
- 创建和销毁线程的开销相对较小,因为它们共享进程的资源,不需要额外的资源分配。
-
并发性:
- 进程之间的并发性较低,因为它们通常是相互独立的,通信和同步需要较复杂的机制。
- 线程之间的并发性较高,因为它们共享相同的内存空间,可以更容易地共享数据和通信。
-
故障容忍性:
- 进程之间的故障通常不会相互影响,一个进程的崩溃不会导致其他进程崩溃。
- 线程之间的故障容忍性较低,因为它们共享相同的内存空间,一个线程的错误可能会影响整个进程的稳定性。
-
多核利用:
- 线程更容易在多核处理器上并行执行,因为它们属于同一进程,可以充分利用进程的多个核心。
- 进程在多核处理器上的并行执行可能需要更多的协调和通信开销。
一句话:“进程是程序的一次动态执行,它对应着从代码加载、执行至执行完毕的一个完整过程,是一个动态的实体,有自己的生命周期;而线程是进程的一个实体,是 CPU 调度和分派的基本单位,同一进程中的多个线程间可并发执行。而且一个线程(父线程)可以创建一个或多个子线程,这些子线程还可以继续创建更多的子线程,以此类推。”
1.2 内存
1.2.1 物理内存与虚拟内存
每个进程在执行时都有自己的地址空间,这个地址空间其实就是 Linux 内核根据需要给进程分配的一个内存空间(区域)来作为当前进程的工作区,也称为进程的内存空间。这个地址空间包括了程序的指令、数据、堆栈、共享库和其他资源。操作系统负责分配和管理每个进程的地址空间,确保进程之间不会相互干扰。
当操作系统启动一个进程时,它会将进程的可执行文件加载到进程的地址空间中,使进程能够执行其中的指令。这包括将程序的代码段加载到内存中,为进程分配数据段和堆栈,以及加载所需的共享库等。尽管进程的地址空间通常是隔离的,但操作系统也允许进程之间共享内存区域,以便进行进程间通信(IPC)。这种共享可以通过共享内存、内存映射文件等机制来实现。
然而内存又涉及到两个概念,物理内存(Physical Memory)
与虚拟内存(Virtual Memory)
。所谓的物理内存就是计算机系统中实际存在的硬件内存,通常是 RAM(随机访问存储器)的形式。它是计算机用于存储和访问数据、指令和程序的物理硬件。在 Linux 系统中还有一个逻辑内存的概念,逻辑内存是为了满足物理内存不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存区域,被用作逻辑内存的这块磁盘空间我们称之为交换空间(Swap Space)
。
但在 Linux 系统中,不管是物理内存还是逻辑内存,都会被映射为虚拟内存,这样的话,应用程序在使用内存时,就需要向 Linux 内核申请一个特定大小的内存映射,并且会收到其申请的虚拟内存的映射。因此,应用程序申请到的这个虚拟内存不一定是全部是物理内存的映射,还可能是逻辑内存的映射。然而,这种虚拟内存管理机制对用户和程序来说通常是不可见的(由底层自动实现),但我们还是需要理解 Linux 内存架构、地址布局等。
1.2.2 页高速缓存与页写回机制
页
是物理内存或虚拟内存中一组连续的线性地址,Linux 以页
为单位处理内存,页的大小通常是 4KB 或更大。
1、页高速缓存(Page Cache)
页高速缓存通常以页面
的单位来存储数据,因此被称为"页"高速缓存。页高速缓存
是操作系统在物理内存中维护的一个缓存,用于存储磁盘上的文件数据的副本。Linux 系统中当一个文件的数据(内容)被读取时,操作系统将数据从磁盘读取到页高速缓存中,以便后续的读取操作可以更快速地访问数据。
因此页高速缓存提高了文件的读取性能,因为它允许频繁访问的数据保留在快速的内存中,而不是每次都从慢速的磁盘中读取。
2、页写回机制(Page Writeback)
页写回机制是一种优化技术,用于减少文件写入操作对性能的影响。当文件数据被修改并需要写回磁盘时,操作系统通常不会立即将数据写回磁盘,而是将数据标记为"脏",并将其保留在页高速缓存中。操作系统通过一种策略,例如延迟写回或按需写回,决定何时将脏数据写回磁盘。这允许操作系统将多个写操作合并,以减少磁盘写入的次数,提高性能。
页写回机制可以防止频繁的磁盘写入操作对系统性能造成明显的影响,因为它允许系统在更高效的时间进行磁盘写入,而不是在每个写操作之后立即进行。
小结:
-
页高速缓存
是一种用于提高文件读取性能的技术,通过将磁盘数据缓存在物理内存中。 -
页写回机制
是一种用于减少文件写入操作对性能的影响的优化策略,它延迟了脏数据的磁盘写入操作,以提高效率。 -
页高速缓存
与页写回机制
这两个概念通常用于操作系统的文件系统和虚拟内存管理中,以改善性能和响应时间。
1.2.3 Swap Space
前面说到了,用作 Linux 系统逻辑内存的磁盘空间我们称之为 Swap Space(即交换空间),其除了填补因物理内存不足的空缺外,还将会在适当的时候将物理内存中不经常读写的数据块自动交换到 Swap 交换空间(这个交换的操作是由 Linux 内核来执行的),从而侧面将经常读写的数据保留在了物理内存。说白了就是,它为什么叫交换空间
,就是要实现数据的交换(即将不常用数据交换到作为逻辑内存的磁盘空间,而保留常用数据在真正的物理内存空间中)。这个交换的策略由 Linux 系统内核定时执行,目的就是为了保持尽可能多的空闲物理内存。
那什么叫做在适当的时候会进行数据交换,我们所说的适当时间其实是 Linux 内核根据“最近最经常使用”
算法(LRU 算法),定时地将一些不经常使用的页面文件(其实就是文件数据,因为我们说了,内存是以页面存储数据的)交换到 Swap。
有时候你会发现:Linux 物理内存还有很多,而 Swap 的数据占用却很大,这是什么原因呢?其实,这是正常现象,你想想,如果一个内存占用很大的进程正在运行,必然就会耗费大量的内存资源,此时 Linux 内核就会将一些不常用的页面文件交换到 Swap Space 中,但当后来该内存占用较大的进程终止时,Linux 就会释放该进程占用的大量内存资源,而此时被交换出去的页面文件数据并不会自动又交换到物理内存中来(除非有这个必要),那此时你看到的就是物理内存空闲,Swap Space 占用较大的现象了。
这里要明白的是,当程序要读虚拟内存中的某个页面数据时,而恰好这个页面数据位于 Swap Space 中。那此时的流程就是:交换空间(Swap Space)中的数据在被读取时通常会首先被交换到物理内存,然后才能被程序访问。因此,这里又涉及到了两个知识点:
1、页面缺失(Page Fault)
当程序尝试访问一个在物理内存中不存在的内存页时,会触发一个页面缺失。这可能是因为该页已经被交换到了交换空间中,或者是因为程序首次访问该页。在任何情况下,操作系统会注意到页面缺失。
2、页面调度(Page Scheduling)
操作系统负责页面调度,决定哪些页面从交换空间加载到物理内存中以满足程序的需求。通常,操作系统会使用一种页面替换算法(例如LRU - 最近最少使用)来选择哪些页从交换空间中加载,以便最大限度地减少性能开销。
一旦数据加载到物理内存中,操作系统会更新进程的页表,以指示这些页面现在位于物理内存中,程序可以访问它们。页表是一个数据结构,用于映射虚拟地址到物理地址。
1.3 文件系统
1.3.1 文件系统分类
在Linux中,文件系统可以根据不同的分类标准进行归类。以下是一些常见的文件系统分类:
-
本地文件系统(Local File Systems):
本地文件系统是直接挂载到计算机上的物理或虚拟存储设备上的文件系统。这些文件系统用于存储本地数据,如硬盘驱动器、固态驱动器、USB 驱动器等。常见的本地文件系统包括 EXT 家族(ext2、ext3、ext4)、Btrfs、XFS、F2FS 等。
-
网络文件系统(Network File Systems):
网络文件系统允许远程计算机通过网络访问和共享文件。这些文件系统通过网络协议(如 NFS、SMB/CIFS 等)提供文件共享数据。常见的网络文件系统包括 NFS(Network File System)和 SMB/CIFS(Server Message Block / Common Internet File System)。
-
虚拟文件系统(Virtual File Systems):
虚拟文件系统是 Linux 内核中的一种抽象层,用于管理文件系统的抽象概念,而不是物理存储。它允许操作系统访问不同类型的文件系统,如本地文件系统、网络文件系统和特殊文件系统,以统一的方式。如 procfs 文件系统(/proc,用于访问进程和系统信息)、sysfs 文件系统(/sys,用于管理设备和内核参数)、tmpfs 文件系统(用于临时文件系统)等。
-
特殊文件系统(Special File Systems):
特殊文件系统用于提供对系统和硬件资源的访问,通常不存储文件数据,而是提供对系统信息的访问。这些文件系统通常位于
/proc
和/sys
目录下。例如,/proc
文件系统提供了有关正在运行的进程、系统信息和内核参数的信息。有时候面试会问你,/proc 目录占用磁盘空间吗?显然是不占用的。 -
虚拟化文件系统(Virtualization File Systems):
这些文件系统用于虚拟化环境中,例如虚拟机管理器(如 KVM、VirtualBox)中,它们允许虚拟机访问主机系统上的文件和资源。常见的虚拟化文件系统包括 9pfs(用于QEMU虚拟机)等。
-
日志文件系统(Logging File Systems):
这些文件系统使用日志记录(journaling)来跟踪文件系统的变化,以提高数据一致性和恢复性。ext3和ext4是常见的日志文件系统。
-
闪存文件系统(Flash File Systems):
闪存文件系统专门设计用于闪存存储设备,如 SSD、USB 闪存驱动器和 SD 卡,如 F2FS 文件系统。
1.3.2 文件系统选择
以上众多眼花缭乱的文件系统分类中,我们应该怎么选择呢?实际上选择文件系统应根据您的需求和硬件来决定,因为每种文件系统都有其适用场景和特点。不同的文件系统可能在性能、可靠性、功能和兼容性方面有所不同。比如像 Linux 本地磁盘存储文件系统,我们选择 XFS 或 EXT4 完全够用了。
1.3.3 优化思路
那在磁盘文件系统这一块我们是怎么优化的呢?其实在我最早的那篇文章《xfs文件系统的完全备份、增量备份及数据恢复》中就有提到 —— 磁盘冗余阵列(RAID)。如果程序访问磁盘的方式是顺序访问的,那么就更换一个更好的磁盘控制器,如果是随机访问,则增加更多的磁盘控制器,其实就是分布式和集中式的访问概念。
磁盘冗余阵列(RAID)是一种用于提高数据存储可靠性和性能的技术。RAID 将多个硬盘驱动器组合在一起,以创建一个单一的逻辑存储单元,数据会分散存储在这些驱动器上,不同的 RAID 级别提供不同级别的冗余和性能。
以下是一些常见的 Linux 支持的 RAID 级别:
- RAID 0:RAID 0 也称为条带化(striping)阵列,它将数据块分成多个条带并将这些条带分散存储在多个硬盘上。RAID 0 提供了更高的性能,因为数据可以并行读取和写入多个驱动器。然而,RAID 0 没有冗余,如果一个驱动器故障,所有数据都会丢失。因此,如果你的程序读写数据频繁、且对数据安全性一般的话,就可采用 RAID 0
- RAID 1:RAID 1 是镜像(mirroring)阵列,它将相同的数据复制到两个或更多硬盘上。因此 RAID 1 提供了数据冗余,如果一个驱动器故障,数据仍然可用。RAID 1 通常用于重要数据的备份。RAID 1 需要至少两个硬盘驱动器。
- RAID 5:RAID 5 使用条带化和奇偶校验来提供数据冗余和性能。数据被分成多个条带,并且奇偶校验信息分布在不同的驱动器上。如果一个驱动器故障,可以通过奇偶校验信息恢复数据。RAID 5 需要至少三个硬盘驱动器。
- RAID 6:RAID 6 类似于 RAID 5,但提供更高级别的冗余。它使用两组奇偶校验信息来保护数据,因此可以容忍两个驱动器的故障。RAID 6 需要至少四个硬盘驱动器。
- RAID 10:RAID 10 是RAID 1+0 的组合,它将数据复制到多个驱动器上,并使用条带化提供更高的性能。RAID 10提供了很高的性能和冗余,但需要至少四个硬盘驱动器。
要在 Linux 上设置 RAID,通常需要硬件支持或使用软件 RAID。软件 RAID 使用 Linux 内核中的软件驱动程序来管理 RAID 阵列,而硬件 RAID 依赖于专用 RAID 控制器。在 Linux 中,可以使用工具如 mdadm
(用于软件 RAID 管理)或硬件 RAID 控制器的管理工具来创建、管理和监控 RAID 阵列。配置 RAID 阵列时,请确保备份重要数据,因为 RAID 虽然提供了一定程度的数据冗余,但并不是绝对可靠的备份解决方案。
1.4 磁盘 I/O
1.4.1 认识磁盘
在计算机存储系统中,硬盘是主要的数据存储设备之一,数据被存储在硬盘的表面上,而硬盘表面被划分为许多扇区,每个扇区都是数据存储和访问的最小单位。但实际中操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取
的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。以下是磁盘和扇区之间的关系的要点:
- 硬盘驱动器:硬盘驱动器是计算机中的存储设备,它包含一个或多个磁盘盘片。这些盘片上有一个或多个磁性涂层,用于存储数据。
- 磁道:磁盘表面被划分为一个个同心圆环,每个环被称为一个磁道(track)。数据通常存储在这些磁道上。
- 扇区:每个磁道被分为若干个扇区(sector),扇区是存储数据的最小物理单位。通常,每个扇区的大小为512字节或4K字节。
- 磁头:硬盘驱动器上有多个读/写头,它们位于磁盘的顶部和底部,用于读取和写入数据。磁头可以移动到不同的磁道上,以读取或写入数据。
- 柱面:柱面(cylinder)是垂直堆叠在多个盘片上的同心圆磁道的集合。在磁盘驱动器上,读/写头可以同时访问相同柱面上的多个磁道。
数据在磁盘上的存储和检索过程通常涉及到读/写头移动到正确的柱面和磁道上,然后在相应的扇区上进行数据传输。操作系统和文件系统管理这些硬件细节,以便应用程序可以读取和写入文件,而无需关心底层硬件的物理结构。
1.4.2 磁盘 I/O 调度策略
在 Linux 中,磁盘 I/O 调度策略用于决定磁盘上的 I/O 请求的执行顺序,以最大程度地提高系统性能和吞吐量。不同的磁盘 I/O 调度策略采用不同的算法来管理 I/O 请求队列。以下是一些常见的Linux磁盘I/O调度策略:
-
CFQ(Completely Fair Queuing)
CFQ 调度器旨在提供公平性,确保每个进程都能公平地访问磁盘。它为每个进程维护一个 I/O 请求队列,并使用时间片轮转的方式为各个队列提供服务。在 Linux 2.6 内核上默认采用的就是该调度策略。
-
Deadline
Deadline 调度器着重于 I/O 请求的响应时间。它将 I/O 请求分为两类:读取请求和写入请求,然后按照截止时间来排序。读取请求通常具有较短的截止时间,以减少读取延迟,而写入请求通常具有较长的截止时间,以优化写入性能。其核心就是在于保证每个 I/O 请求在一定时间内一定要被服务到,避免某个请求饥饿。在 Linux 3.x 内核上默认采用的就是该调度策略。
-
NOOP
NOOP 调度器是一个简单的 FIFO(先进先出)队列,不执行任何排序或优化。它通常用于高性能存储设备,如固态硬盘(SSD),因为这些设备通常具有较低的访问延迟。
-
BFQ(Budget Fair Queueing)
BFQ 调度器旨在提供更好的磁盘 I/O 吞吐量和响应时间。它采用基于权重的算法,为每个进程分配预算,然后根据预算来调度I/O请求。BFQ 适用于需要更好响应时间的多任务工作负载。
-
Kyber
Kyber 调度器是一个新的 I/O 调度器,旨在兼顾低延迟和高吞吐量。它使用一种称为 Kyber Deadline 的方式来管理 I/O 请求,尽量减少延迟并提高性能。
-
MQ-DEADLINE
MQ-DEADLINE 是一种多队列版本的 Deadline 调度器,它在多核系统中更有效地管理 I/O 请求队列。
如何查看 Linux 的磁盘 I/O 调度策略?
cat /sys/block/sda/queue/scheduler
# 字段解释:
noop:表示当前使用的是noop调度策略
[deadline]:表示默认策略是deadline(但当前未激活)
1.4.3 磁盘与缓存机制
在当今的计算机系统中,处理器的运行速度是非常快的,但 RAM 和磁盘并没有质的飞跃(尤其是磁盘读写速度),这就导致了系统整体性能并没有因为处理器速度的提升而提升。于是就使用到了缓存技术(其实就是内存缓存的技术),通过缓存机制解决了处理器和磁盘直接速度的不平衡,其实就是我们前面内存中讲到的页高速缓存
与页写回机制
。
1.5 网络
其实这块就是要考虑你的服务网络体系结构(网络拓扑图是否合理)、网络带宽、网络基础硬件设施等,确保能发挥最大的网络性能。在这些基础设施都优化完毕后,接着就是优化我们 Linux 系统中关于网络的内核参数了,如收发数据缓冲区大小、传输窗口、网络等待等相关参数。
二、性能分析工具
2.1 CPU 性能分析工具
2.1.1 vmstat
1、定义
vmstat 是 Virtual Memory Statistics(即虚拟内存统计)的缩写,很多 Linux 发行版都默认安装了此命令工具,用于监控系统性能和虚拟内存统计的命令。它提供了关于CPU、内存、磁盘I/O和系统上下文切换等方面的信息。
2、语法
vmstat [选项] [间隔时间] [计数]
- 选项:
vmstat
命令可以接受以下选项-a
:显示所有的统计信息,包括内存、进程、磁盘、系统和CPU。-d
:显示磁盘I/O统计信息,包括每个磁盘设备的读写操作和等待时间。-p
:显示每个分区的磁盘I/O统计信息。-s
:显示内存使用的摘要信息,包括物理内存、虚拟内存、页面交换等。-m
:显示内存统计信息,包括活动、非活动、缓冲区和缓存内存的使用情况。-t
:在输出的第一行显示时间戳。-n
:显示内核线程的统计信息。
- 间隔时间:可选参数,用于指定
vmstat
命令执行的时间间隔(以秒为单位)。如果未指定间隔时间,默认值是 1 秒。 - 计数:可选参数,用于指定
vmstat
命令按照时间间隔时间执行的次数。如果未指定计数,默认情况下命令将持续运行直到手动中止(否则按照指定的次数结束统计)。
3、案例
-
不添加任何选项
vmstat
-
每 2s 输出(采集)一次系统数据
vmstat 2
-
每 2s 输出(采集)一次系统数据,共采集 5 次
vmstat 2 5
4、性能分析
上图中字段输出解释:
-
procs:显示队列和等待状态
- r 列:表示运行队列中的进程数,即当前正在运行的进程数。如果这个值长期大于系统 CPU 个数,说明 CPU 紧张,需进行 CPU 升级(即增加系统 CPU)。
- b 列:表示在等待资源的进程数,即处于不可中断(blocked)状态的进程数,通常是等待 I/O、内存交换完成的进程数。
-
memory:显示物理内存状态
- swpd 列:表示交换(swap)的虚拟内存使用量,表示从实际物理内存已经交换到交换空间的数据量,我这里的值为 0,因为我压根就没有启用 Swap Space。如果你启用了交换空间,发现swpd 列下的值很大,且 swap 字段下的 si、so 列的值长期为 0,这也不会影响系统性能。
- free 列:表示当前可用的空闲物理内存。
- buff 列: Buffers Cache,表示内存缓冲区缓存的数据量,一般对块设备的读写才需要缓冲(即通常用于文件I/O缓存)。
- cache 列:Page Cache,表示内存的页高速缓存的数据量,一般作为文件系统的缓存(即通常用于文件系统缓存),频繁访问的文件都会被缓存,如果 cache 列的值比较大,说明页缓存的文件数较多,如果此时 io 字段中的 bi 列的值较小,说明文件系统效率较好。
-
swap:显示交换分区读写情况
-
si 列:表示每秒从磁盘(即交换空间)交换到内存的数据量(swap in)(单位KB/s)。
-
so 列:表示每秒从内存交换到磁盘(即交换空间)的数据量(swap out)(单位KB/s)。
说明:如果 si、so 长期不为 0,那我们的 Linux 系统的物理内存资源肯能不足了。为什么呢?你想一想,根据内存的相关机制,我们知道长期不为 0,说明数据频繁地在物理内存和交换空间中交换数据,如:需要使用内存的进程会在内存中运行,然后内存会将不常用的文件数据交换到 Swap Space,这样的话 si、so 值势必是不会为 0 的,而且会存在频繁波动。
-
-
io:显示磁盘读写情况
-
bi 列:表示每秒从块设备(磁盘)读取的块数量(blocks in)(单位KB/s)。
-
bo 列:表示每秒写入块设备(磁盘)的块数量(blocks out)(单位KB/s)。
说明:如果 bi + bo 的值大于 1000KB/s,且 wa 值较大,则表示系统磁盘 I/O 有瓶颈,应该提高磁盘的读写性能。
-
-
system:显示采集间隔内发生的中断数
-
in 列:每秒中断的数量,包括时钟中断、网络中断等。
-
cs 列:每秒上下文切换的数量,包括进程切换和内核线程切换。
说明:如果这两个值越大,说明内核消耗的 CPU 时间会越多。
-
-
cpu:显示 CPU 的使用状态
- us 列:用户空间占用CPU时间的百分比。如果长期大于 50%,就需要考虑优化程序或算法。
- sy 列:内核空间占用CPU时间的百分比。如果 us + sy 长期大于 80%,说明 CPU 资源不足。
- id 列:CPU空闲时间的百分比。
- wa 列:等待 I/O 完成的CPU时间的百分比。wa 越高说明 IO 等待越严重,一般如果 wa 超过 20%,说明 IO 等待严重(可能是因为磁盘大量的随机读写造成)。
- st 列:用于虚拟机监控程序(hypervisor)的CPU时间的百分比(仅在虚拟化环境中可见),因为我使用的就是虚拟机,所以我有这一列。
因此,对于 CPU 的性能瓶颈分析重点关注 procs 字段的 r 列和 CPU 字段的值。
2.1.2 mpstat
1、定义
mpstat 是 Multiprocessor Statistics(即多处理器统计),它用于显示多核CPU系统中每个CPU核心的性能统计信息。这个命令可以帮助系统管理员监控和分析系统的CPU使用情况,尤其是在多核 CPU 的环境中。一般地,有些 Linux 发行版默认没有安装次工具,需我们手动安装。
yum install -y sysstat
该命令与 vmstat 命令类似,mpstat 是通过 /proc/stat
里面的状态信息进行统计的,mpstat 的好处在于,它可以查看多核 CPU 中每个 CPU 计算核的统计数据的情况,而 vmstat 只能查看系统整体 CPU 的情况。
2、语法
mpstat [选项] [间隔时间] [计数]
- 选项:
vmstat
命令可以接受以下选项-P
:指定要显示的CPU核心号码,例如-P 0
表示只显示 CPU 核心 0 的信息。如果未指定核心号码,默认情况下会显示所有核心的信息。-I
:指定要显示的中断统计信息。
- 间隔时间:可选参数,用于指定
vmstat
命令执行的时间间隔(以秒为单位)。如果未指定间隔时间,默认值是 1 秒。 - 计数:可选参数,用于指定
vmstat
命令按照时间间隔时间执行的次数。如果未指定计数,默认情况下命令将持续运行直到手动中止(否则按照指定的次数结束统计)。
3、案例
-
不添加任何选项
mpstat
-
每 2s 输出(采集)一次系统数据
mpstat 2
-
每 2s 输出(采集)一次系统数据,共采集 5 次,并指定采集具体 CPU
mpstat -P 1 2 5# 即采集CPU编号为1的CPU状态信息
4、性能分析
上图中字段输出解释:
-
Linux 3.10.0-1160.el7.x86_64 (base):显示操作系统版本和主机名。
-
10/08/2023:显示当前日期。
-
_x86_64_:显示系统架构(在此示例中为x86_64,表示64位系统)。
-
(2 CPU):显示 CPU 核心数量,本例中有 2 个CPU核心。
-
07:41:22 AM:显示统计信息的时间戳。
-
CPU:处理器的 ID 号,采集时不指定则默认为系统整体 CPU 情况(all 表示系统整体 CPU 情况,其他如 CPU 0、CPU 1 等)。
-
%usr:用户空间占用 CPU 时间的百分比。
-
%nice:优先级较高的用户空间占用 CPU 时间的百分比。
-
%sys:内核空间占用 CPU 时间的百分比。
-
%iowait:CPU 等待 I/O 操作完成的百分比。
-
%irq:CPU 处理硬件中断的百分比。
-
%soft:CPU 处理软件中断的百分比。
-
%steal:CPU 被虚拟机监控程序(hypervisor)"偷取"的百分比。
-
%guest:运行虚拟机中的操作系统时,CPU花费在虚拟机中的百分比。
-
%gnice:虚拟机中运行的优先级较高的用户空间占用CPU时间的百分比。
-
%idle:CPU空闲时间的百分比。
-
Average:平均值,如果指定了采集次数,系统为自动为我们计算出相关字段的平均值。
在实际开发中,可能有些不使用多线程体系结构的应用程序可能会运行在一个多核 CPU 的服务器上(比如 2 个 CPU),从而不使用所有处理器(而只使用其中一个 CPU),最终导致一个 CPU 过载,而另一个 CPU 空闲,此时通过 mpstat 命令就能很好地诊断这类问题(而此时 vmstat 去无法看出是哪个 CPU 过载,哪个 CPU 空闲),因此我们一般会将 vmstat 和 mpstat 配合使用。
2.1.3 uptime
uptime
命令用于显示系统的当前运行时间以及平均负载信息。
uptime
输出字段解释:
-
15:56:28:这是当前的系统时间,显示小时:分钟:秒。
-
up 5:07:这是系统的运行时间。它表示系统自上次启动以来已经运行了5小时7分钟。
-
1 users:这是当前登录到系统的用户数量。
-
load average: 0.00, 0.01, 0.05:这是系统的平均负载信息,它提供了系统的负载状态。平均负载是一个三个数字的列表,分别表示过去1分钟、5分钟和15分钟内的系统负载情况。负载是指等待CPU资源的进程数量,所以这三个负载值一般不要长期超过系统的 CPU 核数,否则负载较高,影响系统性能(但不是绝对的,偶尔大于系统 CPU 核数也是每问题的)。
在上图这个例子中,负载就非常低,因为它们接近于零(而我 CPU 核数是 2)。
2.2 内存性能分析工具
2.2.1 free
1、定义
free
命令用于显示Linux系统上的内存使用情况。它提供了有关物理内存(RAM)和交换空间(swap)的信息,包括已使用、空闲、缓冲区和缓存内存等。
2、语法
free [选项]
选项:free
命令可以接受以下选项
-b
:以字节(bytes)为单位显示内存使用情况。-k
:以千字节(kilobytes)为单位显示内存使用情况(缺省值)。-m
:以兆字节(megabytes)为单位显示内存使用情况。-g
:以吉字节(gigabytes)为单位显示内存使用情况。-t
:在输出的末尾显示总内存和总交换空间的汇总信息。-h
:人性化显示 => 直观。
3、案例
-
不添加任何选项
free# 不带参数时默认选项为-k
-
人性化显示
free -h
4、性能分析
上图中字段输出解释:
- total:物理内存的总量,包括实际可用内存和内核保留的内存。
- used:已使用的物理内存量,包括用于进程和系统的内存。
- free:空闲的物理内存量,尚未分配给任何进程。
- shared:被共享的内存量,通常用于共享内存段的进程(如进程间通信机制)。
- buff/cache:用于缓冲区和缓存的内存量。这包括Linux内核用于缓存文件系统数据的内存,以及用于文件I/O的内存缓冲区。
- available:可用内存量,表示系统当前可供新进程使用的内存,包括缓冲区和缓存。
- Mem:物理内存的相关信息,包括总内存空间、使用、剩余等相关信息。
- Swap:交换空间的信息,包括总交换空间、已使用的交换空间和空闲交换空间。
通常,total = used + free + buff/cache
,available 是在 buff/cache 基础上减去 shared 和 buffer 内存损耗剩下的资源,因此查看服务器的内存资源是否充足,看 available 部分即可,一般地 20% < available < 70%,则系统内存资源基本能满足应用需求,暂时不影响系统性能。
2.2.2 smem
1、定义
smem
是一个用于查看 Linux 系统中进程内存使用情况的工具。它提供了详细的内存统计信息,包括物理内存、虚拟内存、共享内存、缓冲区和缓存等各种内存指标。smem
命令的功能比标准的 ps
或 top
命令更加详细,可以帮助我们更好地了解各个进程占用内存的情况。
该命令需要额外安装,具体安装方式如下:
yum install -y epel* # 需安装扩展源(因为本地软件仓库中没有找到smem软件包)或下载源码进行编译安装
yum install -y smem
2、语法
smem [选项]
选项:smem
命令可以接受以下选项
-r
:按照内存使用量的逆序(从高到低)排序显示进程列表。-u
:以用户模式显示内存使用情况,按照用户分类显示内存使用情况。-U
:显示虚拟内存(VIRT)的信息。-P
:显示共享内存(SHR)的信息。-c
:显示缓冲区的信息。-C
:显示缓存的信息。-k
:指定按KB显示。-p
:指定按百分比显示。-P
:指定具体的进程。-s
:指定排序规则(如 -s uss,表示对 USS 列进行排序 - 默认为升序)
默认情况下,smem
命令以物理内存(RES)的信息排序,并显示前10个进程。
3、案例
-
不添加任何选项
smem
-
显示内存单位并指定字段进行排序
smem -k -s uss# 显示每个进程占用的系统内存大小
-
以百分比显示并指定字段进行排序
smem -p -s uss# 显示每个进程占用系统内存的百分比
-
查看每个用户使用内存的情况
smem -u
-
查看指定进程使用系统内存的情况
smem -k -P dockerd# 查看dockerd进程使用系统内存的情况
4、性能分析
上图中字段输出解释:
- PID:进程ID。
- User:进程所属用户。
- Command:进程的命令行。
- Swap:进程占用的交换空间。
- USS:唯一内存使用(Unique Set Size),表示进程独占的内存。
- PSS:共享内存使用(Proportional Set Size),表示进程独占内存加上共享内存的平均值。
- RSS:物理内存使用(Resident Set Size),表示进程当前实际占用的物理内存。
因此,通过该命令可清楚地获取每个进程占用的内存资源,以此判断这些进程是否异常,内存分配是否合理。
2.3 磁盘性能分析工具
2.3.1 iotop
1、定义
iotop
是一个 Linux 命令行工具,用于监视系统中磁盘 I/O 活动的实时信息。它可以帮助你查看哪些进程正在读取或写入磁盘,以及它们的磁盘 I/O 活动的相关信息。iotop
通常不会预装在大多数 Linux 发行版中,所以我们需要先安装它。
yum install -y iotop
2、语法
iotop [选项]
选项:
-
-o, --only
:只显示有磁盘 I/O 活动的进程。 -
-b, --batch
:以批处理模式运行,直接显示结果而不需要交互。 -
-n, --iter=<次数>
:指定要显示的迭代次数,然后退出。默认情况下,iotop
会持续显示 I/O 活动,使用此选项可以设置显示的次数。 -
-d, --delay=<秒>
:设置更新间隔,即多长时间刷新一次显示。默认情况下,每秒更新一次。 -
-p, --processes=<进程ID>
:只显示指定进程ID的磁盘 I/O 活动。你可以指定多个进程ID,用逗号分隔。 -
-u, --user=<用户名>
:只显示指定用户名的进程的磁盘 I/O 活动。 -
-P, --process=<进程名称>
:只显示指定进程名称的进程的磁盘 I/O 活动。 -
-a, --accumulated
:显示自iotop
启动以来的积累磁盘 I/O 活动,而不是瞬时值。 -
-q, --quiet
:静默模式,减少输出信息,通常用于脚本。 -
-k
:以千字节显示(默认为 B 字节显示)。 -
-h, --help
:显示帮助信息。
3、案例
-
基础交互操作
iotop
按键盘 O 键显示当前有 I/O 输出的进程
按键盘
< >
键进指定排序字段(默认基于 IO 字段来排序)比如下图我们选择以 DISK READ 这一列来排序
按键盘 P 键进行进程/线程的切换(默认显示的进程 PID 相关信息)
如下图已经切换为线程了(TID)
-
以千字节显示
iotop -k
-
查看指定进程的 I/O 情况
iotop -k -p 1047
4、性能分析
上图中字段输出解释:
-
TID
:线程或进程的唯一标识符(Thread/Task ID),表示正在进行磁盘 I/O 操作的进程或线程的ID。 -
PRIO
:进程的优先级(Priority),通常用于指示进程的执行优先级。 -
USER
:执行磁盘 I/O 操作的用户的用户名。 -
DISK READ
:磁盘读取速率,表示进程正在从磁盘读取数据的速度。以字节/秒(Bytes per Second)为单位显示。 -
DISK WRITE
:磁盘写入速率,表示进程正在向磁盘写入数据的速度。以字节/秒为单位显示。 -
SWAPIN
:表示进程从交换空间中读取数据的速率,通常用于虚拟内存操作。以字节/秒为单位显示。 -
IO>
:磁盘 I/O 操作的总和,包括读取和写入。以百分比形式表示,表示磁盘 I/O 占用的总带宽。 -
COMMAND
:正在进行磁盘 I/O 操作的进程或线程的命令名称。
学会这几个选项够用了,使用 iotop 就可以随时监控消耗 I/O 资源多的进程了,重点关注一下磁盘读写。
2.3.2 iostat
1、定义
iostat
命令是一个用于监视 Linux 系统中磁盘和 CPU 使用情况的命令行工具。它可以提供有关系统的磁盘 I/O 和 CPU 使用的详细统计信息。iotop
通常不会预装在大多数 Linux 发行版中,所以我们需要先安装它。
yum install -y sysstat
2、语法
iostat [选项] [间隔时间] [次数]
选项:
-c
:用于显示 CPU 统计信息。-d
:用于显示磁盘统计信息。
时间间隔:
- 2:表示 2 秒
次数:
- 5:输出 5 组数据
3、案例
-
显示 CPU 使用情况
iostat -c# 这将显示 CPU 使用情况的统计信息,包括用户空间、内核空间、等待 I/O、空闲等百分比。
-
显示磁盘 I/O 使用情况
iostat -d# 这将显示磁盘 I/O 使用情况的统计信息,包括每秒传输的 I/O 操作次数、每秒读取和写入的数据量等。
-
指定间隔时间和次数
iostat -c 2 5
4、性能分析
上图中字段输出解释:
-
Device
:磁盘设备的名称,表示正在监视的磁盘或分区。 -
tps
:每秒传输的 I/O 操作次数(Total I/O Transactions Per Second)。这个值表示每秒完成的读取和写入磁盘的总操作数。 -
kB_read/s
:每秒从磁盘读取的数据量(Kilobytes Read Per Second)。这个值表示每秒从磁盘读取的数据量,以千字节(KB)为单位。 -
kB_wrtn/s
:每秒写入磁盘的数据量(Kilobytes Written Per Second)。这个值表示每秒写入磁盘的数据量,以千字节(KB)为单位。 -
kB_read
:自系统启动以来从磁盘读取的总数据量(Kilobytes Read)。这个值表示自系统启动以来累积的总读取数据量,以千字节(KB)为单位。 -
kB_wrtn
:自系统启动以来写入磁盘的总数据量(Kilobytes Written)。这个值表示自系统启动以来累积的总写入数据量,以千字节(KB)为单位。
通过 kB_read/s
、kB_wrtn/s
就可判断磁盘读写性能及磁盘读写是否频繁的问题。如果 kB_wrtn/s
很大,说明磁盘写操作很频繁,可考虑磁盘或程序优化;如果 kB_read/s
很大,说明程序对磁盘的读操作较频繁,可考虑将读取的数据放入内存中操作,提高读性能。
2.4 网络性能分析工具
2.4.1 ping
1、定义
ping
命令是一个用于测试网络连接的常见命令行工具,通常用于检查目标主机是否可达以及测量网络往返时间(RTT)。
2、语法
ping [选项] 目标主机
选项:
-c
:用于指定发送的 ICMP 报文数量。-i
:用于设置报文发送的时间间隔。-s
:用于设置发送的数据包大小等。
3、案例
-
基本测试
ping www.baidu.com
这会向
www.baidu.com
发送 ICMP 报文,测试是否能够到达目标主机。ping
将连续发送报文,直到你手动中断测试。 -
指定发送报文数量
ping -c 5 www.baidu.com
这会向
www.baidu.com
发送 5 个 ICMP 报文,然后停止测试。你可以更改数字来指定发送的报文数量。
4、性能分析
上图中字段输出解释:
-
PING
:这是ping
命令的第一行,显示正在执行的ping
命令以及目标主机的 IP 地址或主机名。 -
bytes
:每个 ICMP 报文的大小,通常默认为 64 字节。 -
icmp_seq
:ICMP 报文的序列号,从 0 开始递增。 -
ttl
:生存时间(Time to Live),表示报文在网络上能够存活的跳数(路由器数量)。 -
time
:每个 ICMP 报文的往返时间(Round-Trip Time,RTT),以毫秒为单位。这是从发送 ICMP 报文到接收响应所经过的时间。 -
--- www.a.shifen.com ping statistics ---
:表示一个 ICMP 报文的往返时间统计结束并显示ping
统计信息的标题。 -
packets transmitted
:发送的 ICMP 报文数量,表示发送的次数。 -
packets received
:接收的 ICMP 响应报文数量,表示成功收到的次数。 -
packet loss
:丢失的 ICMP 报文数量,表示未收到响应的次数,通常以百分比形式显示。 -
time
:用于显示 RTT 的统计信息,通常包括最小、最大和平均 RTT 时间。
这里重点关注 packet loss
,如果该值越大,说明丢包严重,表明源与目的之间的网络延时很大,此时就需要检查你的本地网络。
2.4.2 traceroute
1、定义
traceroute
是一个用于追踪数据包从源到目标的网络路径的命令行工具。它在 Linux 和类似的操作系统上常用于诊断网络问题,查找数据包在网络中的路由路径,以及确定网络延迟的来源。traceroute
通常不会预装在大多数 Linux 发行版中,所以我们需要先安装它。
yum install -y traceroute
2、语法
traceroute [选项] 目标主机
选项:
-n
:用于禁用域名解析。-q
:用于指定发送数据包的数量。-w
:用于设置超时。
通过该命令,你可以查看数据包从发出到响应经历的路由节点数,以及每个节点之间的网络延时情况,从而判断在整条通信链路中是那个节点网络出问题。
2.4.3 mtr
1、语法
mtr
(My Traceroute)是一个网络诊断工具,结合了 traceroute
和 ping
的功能,用于追踪网络路径和测量网络往返时间(RTT)。mtr
不仅可以显示路由路径,还能实时监控网络路径中每个跳的性能指标。mtr
通常不会预装在大多数 Linux 发行版中,所以我们需要先安装它。
yum install -y mtr
2、语法
mtr [选项] 目标主机
选项:
-n
:用于禁用域名解析。-c
:用于指定发送数据包的次数。-i
:用于设置报文发送的时间间隔。
3、案例
-
基本
mtr
测试mtr www.baidu.com
这会启动
mtr
并追踪到达www.baidu.com
的网络路径,并实时显示每个路由器的 IP 地址、主机名、以及每个路由器的 RTT 时间。
4、性能分析
上图中字段输出解释:
-
Host
:显示路由路径上每个跳的主机名或 IP 地址,其中最后一行显示了目标主机(在本例中是14.119.104.254
)。 -
Loss%
:损失率,表示到达每个跳的数据包丢失的百分比。在这个例子中,192.168.*
跳的损失率都是 0%,这意味着我本地没有数据包丢失,我本地网络正常,而中间网络就存在丢包了,说明中间路由网络是有延迟的。 -
Snt
:发送的数据包数量,表示发送给每个跳的数据包总数。 -
Last
:最后一个数据包的往返时间(RTT),以毫秒为单位。这是从源主机到达每个跳的最后一个数据包的时间。 -
Avg
:平均往返时间,以毫秒为单位。这是从源主机到达每个跳的所有数据包的平均时间。 -
Best
:最短往返时间,以毫秒为单位。这是从源主机到达每个跳的最快数据包的时间。 -
Wrst
:最长往返时间,以毫秒为单位。这是从源主机到达每个跳的最慢数据包的时间。 -
StDev
:往返时间的标准差,以毫秒为单位。它表示 RTT 变化的程度,越小越好。
因此,通过 mtr 我们可以很明显的感知我们网络性能的问题,依次来分析我们本地网络访问外部网络慢的原因。通常网络出问题我们都会使用 ping 命令,但是该命令只是简单的网络连通性测试,却无法确定网络是在哪里出了问题,此时就会使用 traceroute 来查看数据包途径路由,或使用 nslookup 来查看 DNS 解析状态是否正常。而我们的 mtr 命令正好集成了这三个命令的功能,从而实现了我们的需求。
一般情况下 mtr 前几跳都是本地 ISP,后几跳属于服务商(如本次案例的百度
),中间跳数则是中间网络互联节点,如果前几跳异常,需联系本地 ISP,如果后几跳出现问题,则需联系服务商(百度),如果中间几跳出现问题,则两边都无完全解决问题。
2.5 系统性能综合分析工具
2.5.1 top
1、定义
top
命令是一个用于实时监视 Linux 系统中进程的命令行工具,它提供了有关系统性能和进程活动的实时信息。top
可以帮助我们监视系统资源的使用情况,识别性能问题,并查看正在运行的进程的相关信息。
2、语法
top
top
命令没有参数,直接运行它将显示实时的系统性能信息和进程列表。默认情况下,top
会按 CPU 利用率降序排列进程。
3、案例
这里就不过多解释,其实我们前面已经说过了,所谓综合分析工具,就是该工具能帮我们查看 Linux 系统 CPU、内存、负载等很多数据。让我们可整体掌握服务器的资源使用情况,便于做进一步优化。
2.5.2 htop
1、定义
htop 可看成是 top 的一个升级版,相比传统的 top,htop 更加人性化,它可让用户交互式操作,支持颜色主题、鼠标操作等多种操作。htop
通常不会预装在大多数 Linux 发行版中,所以我们需要先安装它。
yum install -y epel*
yum install -y htop
2、语法
htop# 想要查看那个区的具体指标,鼠标点点点即可
如何自定义显示字段?
-
设置(F2)
-
选择 Columns 字段,并按照下图添加即可,最右边的列为可选列
-
此时你会发现已经添加完成了
3、分析
上图可分为 5 大区:
-
CPU 状态区
展示每个每个 CPU 逻辑核的使用百分比,并通过不同颜色条进行区分,蓝色表示 low-prority 使用,绿色表示 normal 使用情况,红色表示 Kernel 使用情况,青色表示 vistualiz 使用情况,上图案例中共有 2 个逻辑核。、
-
内存状态区
展示物理内存和 Swap Space 的状态,同样也使用不同的颜色条来区分,其中绿色表示已使用内存情况,蓝色表示用于缓冲的内存情况,黄色表示用于缓存的内存情况。
-
整体状态区
Task 表示当前系统进程总数和当前正在运行的进程数;
Load average 表示过去 1、5、15 分钟的系统平均负载;
Uptime 表示系统运行时长。
-
进程状态区
-
PID
:进程 ID(Process ID),表示每个正在运行的进程的唯一标识符。 -
USER
:进程的所有者(用户),显示启动进程的用户帐户。 -
PRI
:进程的优先级(Priority),通常是一个负整数。较低的数值表示更高的优先级。 -
NI
:进程的 Nice 值(Nice Value),用于调整进程的优先级。负值表示较高的优先级,正值表示较低的优先级。 -
VIRT
:虚拟内存大小(Virtual Memory),表示进程已分配但未必使用的虚拟内存大小,以千字节(KB)为单位。 -
RES
:常驻内存大小(Resident Set Size),表示进程实际占用的物理内存大小,以千字节(KB)为单位。 -
SHR
:共享内存大小(Shared Memory),表示多个进程之间共享的内存大小,以千字节(KB)为单位。 -
S
:进程的状态,可以是以下之一:R
:运行中(Running)S
:睡眠中(Sleeping)D
:不可中断的休眠状态(Uninterruptible Sleep)Z
:僵尸进程(Zombie)T
:已停止(Stopped)t
:跟踪/停止(Tracing/Stopped)W
:等待内存交换(Paging)X
:死掉(Dead)K
:内核线程(Kernel Thread)
-
%CPU
:进程的 CPU 利用率,表示进程使用 CPU 的百分比。 -
%MEM
:进程的内存使用率,表示进程使用系统内存的百分比。 -
TIME+
:进程已运行的累计 CPU 时间,以小时:分钟:秒
的格式表示。 -
COMMAND
:进程的命令名称,显示启动进程的完整命令。
这些字段提供了关于系统中运行的进程和它们使用的系统资源的详细信息。你可以使用
htop
的交互式命令来对进程列表进行筛选、排序和管理,以及查看更多信息,如线程和性能图表。htop
提供了更多的功能和用户友好的界面,相对于标准的top
命令,使其成为了一个强大的系统监视和管理工具。 -
总结
性能分析工具其实还有很多,以上只是一些常用的分析工具,其实会使用一两个工具已经够用了,我们重点是要能够通过数据分析这些性能的瓶颈,而分析的前提就是你得知道这些性能指标能对 Linux 系统产生哪些影响(如 CPU、内存、磁盘 I/O、网络等)。
-
CPU 性能瓶颈分析
- 若只想查看整体 CPU 的使用情况,可使用 vmstat;
- 若想查看具体 CPU 的使用情况,可使用 mpstat。
-
内存性能分析
- 若只想查看 Linux 系统内存的整体使用情况,可使用 free;
- 若想查看具体进程占用的具体内存情况,可使用 seme。
-
磁盘性能分析
- 若只想查看 Linux 系统磁盘的整体 I/O 情况,可使用 iostat;
- 若想查看具体进程具体的对磁盘 I/O 情况,可使用 iotop。
-
网络性能分析
- 若只是简单的网络连通性测试,可使用 ping;
- 若想查看具体的网络性能(如经历的各个路由、延迟等),可使用 mtr。
-
系统综合分析
-
若想整体掌握系统性能通过 top 即可;
-
若想更深入地查看系统中具体的进程对系统资源的占用,可使用 htop。
-
—END