彩票做网站,网站如何做好内链,网站开发技术分享ppt,做网站端口内容无法替换Author#xff1a;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…
Authorrab 目录 前言一、性能指标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/O1.4.1 认识磁盘1.4.2 磁盘 I/O 调度策略1.4.3 磁盘与缓存机制 1.5 网络 二、性能分析工具2.1 CPU 性能分析工具2.1.1 vmstat2.1.2 mpstat2.1.3 uptime 2.2 内存性能分析工具2.2.1 free2.2.2 smem 2.3 磁盘性能分析工具2.3.1 iotop2.3.2 iostat 2.4 网络性能分析工具2.4.1 ping2.4.2 traceroute2.4.3 mtr 2.5 系统性能综合分析工具2.5.1 top2.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 CommunicationIPC机制来交换数据和信息。常见的 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 等提供文件共享数据。常见的网络文件系统包括 NFSNetwork File System和 SMB/CIFSServer 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 0RAID 0 也称为条带化striping阵列它将数据块分成多个条带并将这些条带分散存储在多个硬盘上。RAID 0 提供了更高的性能因为数据可以并行读取和写入多个驱动器。然而RAID 0 没有冗余如果一个驱动器故障所有数据都会丢失。因此如果你的程序读写数据频繁、且对数据安全性一般的话就可采用 RAID 0RAID 1RAID 1 是镜像mirroring阵列它将相同的数据复制到两个或更多硬盘上。因此 RAID 1 提供了数据冗余如果一个驱动器故障数据仍然可用。RAID 1 通常用于重要数据的备份。RAID 1 需要至少两个硬盘驱动器。RAID 5RAID 5 使用条带化和奇偶校验来提供数据冗余和性能。数据被分成多个条带并且奇偶校验信息分布在不同的驱动器上。如果一个驱动器故障可以通过奇偶校验信息恢复数据。RAID 5 需要至少三个硬盘驱动器。RAID 6RAID 6 类似于 RAID 5但提供更高级别的冗余。它使用两组奇偶校验信息来保护数据因此可以容忍两个驱动器的故障。RAID 6 需要至少四个硬盘驱动器。RAID 10RAID 10 是RAID 10 的组合它将数据复制到多个驱动器上并使用条带化提供更高的性能。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调度策略 CFQCompletely Fair Queuing CFQ 调度器旨在提供公平性确保每个进程都能公平地访问磁盘。它为每个进程维护一个 I/O 请求队列并使用时间片轮转的方式为各个队列提供服务。在 Linux 2.6 内核上默认采用的就是该调度策略。 Deadline Deadline 调度器着重于 I/O 请求的响应时间。它将 I/O 请求分为两类读取请求和写入请求然后按照截止时间来排序。读取请求通常具有较短的截止时间以减少读取延迟而写入请求通常具有较长的截止时间以优化写入性能。其核心就是在于保证每个 I/O 请求在一定时间内一定要被服务到避免某个请求饥饿。在 Linux 3.x 内核上默认采用的就是该调度策略。 NOOP NOOP 调度器是一个简单的 FIFO先进先出队列不执行任何排序或优化。它通常用于高性能存储设备如固态硬盘SSD因为这些设备通常具有较低的访问延迟。 BFQBudget 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 54、性能分析
上图中字段输出解释 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 时间的百分比。 %iowaitCPU 等待 I/O 操作完成的百分比。 %irqCPU 处理硬件中断的百分比。 %softCPU 处理软件中断的百分比。 %stealCPU 被虚拟机监控程序hypervisor偷取的百分比。 %guest运行虚拟机中的操作系统时CPU花费在虚拟机中的百分比。 %gnice虚拟机中运行的优先级较高的用户空间占用CPU时间的百分比。 %idleCPU空闲时间的百分比。 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 -h4、性能分析
上图中字段输出解释
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 smem2、语法
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 iotop2、语法
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 10474、性能分析
上图中字段输出解释 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 sysstat2、语法
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 54、性能分析
上图中字段输出解释 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_seqICMP 报文的序列号从 0 开始递增。 ttl生存时间Time to Live表示报文在网络上能够存活的跳数路由器数量。 time每个 ICMP 报文的往返时间Round-Trip TimeRTT以毫秒为单位。这是从发送 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 traceroute2、语法
traceroute [选项] 目标主机选项
-n用于禁用域名解析。-q用于指定发送数据包的数量。-w用于设置超时。
通过该命令你可以查看数据包从发出到响应经历的路由节点数以及每个节点之间的网络延时情况从而判断在整条通信链路中是那个节点网络出问题。
2.4.3 mtr
1、语法
mtrMy Traceroute是一个网络诊断工具结合了 traceroute 和 ping 的功能用于追踪网络路径和测量网络往返时间RTT。mtr 不仅可以显示路由路径还能实时监控网络路径中每个跳的性能指标。mtr 通常不会预装在大多数 Linux 发行版中所以我们需要先安装它。
yum install -y mtr2、语法
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、语法
toptop 命令没有参数直接运行它将显示实时的系统性能信息和进程列表。默认情况下top 会按 CPU 利用率降序排列进程。
3、案例 这里就不过多解释其实我们前面已经说过了所谓综合分析工具就是该工具能帮我们查看 Linux 系统 CPU、内存、负载等很多数据。让我们可整体掌握服务器的资源使用情况便于做进一步优化。
2.5.2 htop
1、定义
htop 可看成是 top 的一个升级版相比传统的 tophtop 更加人性化它可让用户交互式操作支持颜色主题、鼠标操作等多种操作。htop 通常不会预装在大多数 Linux 发行版中所以我们需要先安装它。
yum install -y epel*
yum install -y htop2、语法
htop# 想要查看那个区的具体指标鼠标点点点即可如何自定义显示字段 设置F2 选择 Columns 字段并按照下图添加即可最右边的列为可选列 此时你会发现已经添加完成了
3、分析
上图可分为 5 大区 CPU 状态区 展示每个每个 CPU 逻辑核的使用百分比并通过不同颜色条进行区分蓝色表示 low-prority 使用绿色表示 normal 使用情况红色表示 Kernel 使用情况青色表示 vistualiz 使用情况上图案例中共有 2 个逻辑核。、 内存状态区 展示物理内存和 Swap Space 的状态同样也使用不同的颜色条来区分其中绿色表示已使用内存情况蓝色表示用于缓冲的内存情况黄色表示用于缓存的内存情况。 整体状态区 Task 表示当前系统进程总数和当前正在运行的进程数 Load average 表示过去 1、5、15 分钟的系统平均负载 Uptime 表示系统运行时长。 进程状态区 PID进程 IDProcess ID表示每个正在运行的进程的唯一标识符。 USER进程的所有者用户显示启动进程的用户帐户。 PRI进程的优先级Priority通常是一个负整数。较低的数值表示更高的优先级。 NI进程的 Nice 值Nice Value用于调整进程的优先级。负值表示较高的优先级正值表示较低的优先级。 VIRT虚拟内存大小Virtual Memory表示进程已分配但未必使用的虚拟内存大小以千字节KB为单位。 RES常驻内存大小Resident Set Size表示进程实际占用的物理内存大小以千字节KB为单位。 SHR共享内存大小Shared Memory表示多个进程之间共享的内存大小以千字节KB为单位。 S进程的状态可以是以下之一 R运行中RunningS睡眠中SleepingD不可中断的休眠状态Uninterruptible SleepZ僵尸进程ZombieT已停止Stoppedt跟踪/停止Tracing/StoppedW等待内存交换PagingX死掉DeadK内核线程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