Linux性能工具

2021/01/07 Linux

Linux性能优化

在学习Linux操作系统中各种调优参数和性能测量工具之前,我们先讨论各种可用的度量标准和它们在相关系统性能中的含义是很有意义的。因为这是一个开源的操作系统,所以我们有很多性能测量工具可以利用。最终你选择的工具,取决于你的个人喜好、数据量、你的详细需求。由于有很多工具可以使用,有些性能测量工具的功能是相同的,因此你能够使用所熟悉的工具来测量。因此,这里只涉及最重要的性能测量。

处理器度量标准

以下是处理器的度量标准:

  • CPU使用率。 这可能是最直接的指标。它描述了每个处理器的整体使用率。如果在一段持续时间内CPU的使用率超过80%,则处理器可能有瓶颈。
  • 用户进程消耗CPU的时间。 描述了CPU花费在用户进程的百分比,包括nice time。较高值的user time通常是有利的,因为,在这种情况下,系统在执行实际的工作。
  • 内核操作消耗CPU的时间。 其描述了CPU花费在内核操作的百分比,包括IRQ和softirq时间。较高和持续的system time值可以指出在网络和驱动程序堆栈中你的瓶颈。一个系统通常应保持花在内核操作上的时间尽可能的少。
  • 等待。 CPU花费在等待(由于一个I/O操作发生等待)上的时间总量,像是阻塞值。一个系统不应该花费太多时间等待(因为I/O操作);否则应该检查各自的I/O子系统性能。
  • CPU空闲时间。 其描述了系统空闲等待任务的CPU百分比。
  • Nice消耗CPU时间。 描述了CPU花费在re-nicing进程(更改进程的执行顺序和优先级)上的时间百分比。
  • 平均负载。 load average不是一个百分比,而是以下总和的滚动平均值:
  • 队列中等待处理的进程数。
  • 等待不可中断任务被完成的进程数。 也就是说,TASK_RUNNING和TASK_UNINTERRUPTIBLE进程数的总和的平均值。如果进程请求CPU时间而被阻塞(这意味着CPU没有时间处理它们),load average会增加。另一方面,如果每个进程得到直接访问CPU的时间,它们没有在CPU周期丢失,则负载将减小。
  • 可运行的进程。 这个值描述了已经准备好执行的进程数。在一段持续的时间内,这个值不应该超过物理处理器数量的10倍。否则处理器可能是瓶颈。
  • 阻塞的进程。 不被执行的进程数,因为它们要等待I/O操作结束。阻塞的进程数能反映出是否有I/O瓶颈。
  • 上下文切换。 在系统上发生线程之间切换的数量。大量上下文切换如果与大量中断相关,则可能是驱动程序或应用程序出现问题的信号。上下文切换通常是不利的,因为每一次上下文切换都会导致CPU缓存被刷新,但是有些上下文切换是必要的。参考1.1.5节的内容。
  • 中断。 中断包含硬中断与软中断。硬中断对系统性能有更加不利的影响。较高的中断值表明可能有软件瓶颈,可能是在内核中,也可能是一个驱动程序出现瓶颈。记住,中断还包括CPU时钟引起的中断。参考1.1.6节的内容。

内存度量标准

下面是内存度量标准:

  • 空闲内存。 对比大多数其他操作系统,在Linux中不应该只关注空闲(free)内存的值。正如在1.2.2节讲述的,Linux内核分配大部分未使用的内存作为文件系统缓存,所以从已使用的(used)内存中减去缓冲(buffer)和缓存(cache)的内存数量,来确定(有效的)空闲(free)内存。
  • 使用的swap。 这个值描述了已使用的swap空间的数量。正如1.2.2节中描述的,swap空间的使用只能告诉你Linux管理内存真的有效。Swap In/Out是一个识别内存瓶颈的可靠手段。在一段持续的时间内每秒200到300以上的分页值,表明可能有内存瓶颈。
  • 缓冲与缓存。 缓冲被分配作为文件系统和块设备缓存。
  • Slab。 其描述了内核使用的内存数。注意内核的分页不能移出到磁盘。
  • 活跃与非活跃内存。 关于活跃使用的系统内存信息。非活跃内存可能是kswapd守护进程swap out到磁盘的候选者。参考1.2.2节的内容。

块设备度量标准

以下是块设备度量标准:

  • I/O等待。 CPU等待一个I/O操作的发生所花费时间。较高和持续的值很多时候可能表明存在一个I/O瓶颈。
  • 平均队列长度。 未完成的I/O请求数量。一般情况下,一个磁盘有2到3个队列是最佳的;较高的值可能表明有一个磁盘I/O瓶颈。
  • 平均等待时间。 服务一个I/O请求所测量的平均时间,以毫秒为单位。等待时间是由实际的I/O操作和它在I/O队列中等待的时间组成的。
  • 每秒传输。 描述了每秒钟多少个I/O操作被执行(读和写)。该指标要结合每秒kB值,以帮助你确定系统的平均传输大小。平均传输大小一般应该与你的磁盘子系统使用的条带大小相匹配。
  • 每秒读取/写入块的数量。 这个指标描述了每秒读和写的块数,在2.6内核中块为1024B。早期的内核可能会报告不同的块大小,从512B到4KB。
  • 每秒读取/写入的字节。 从块设备读取和写入(读和写到块设备)的字节数,表示从块设备(到块设备)传输的实际数据量。

网络接口度量标准

下面是网络接口的度量标准:

  • 接收和发送的数据包。 这个指标用来通知你,一个给定网络接口接收和发送数据包的数量。
  • 接收和发送的字节。 这个指标描述了一个给定网络接口接收和发送的字节数。
  • 每秒钟的冲突数量。 这个值给出了在网络上连接的每个接口发生冲突的相对数量。如果发生持续冲突通常要关注网络基础设施的问题,而不是服务器。在大多数正确配置的网络中,冲突一般是非常罕见的,除非网络基础设备是由集线器(HUB)组成的。
  • 丢弃的数据包。 已经被内核丢弃的数据包的统计数。丢弃的原因可能是由于防火墙配置,也可能是由于缺乏网络缓冲区。
  • 溢出。 该指标表示网络接口溢出缓冲区空间的次数。这个指标应该结合数据包被丢弃的值使用,用来确定是网络缓冲区还是网络队列长度出现瓶颈。
  • 错误。 被标记为故障帧的数量。通常这些错误是由网络不匹配或是部分网络电缆中断导致的。部分网络电缆中断对于铜线千兆网络是一个明显的性能问题。

监控工具

企业级Linux发行版附带了许多监控工具。一些工具可处理度量标准,并提供更好的格式化输出,便于我们理解系统活动。一些工具是针对特定的性能度量标准(比如磁盘I/O)的,并可以给出更详细的信息。

  • top 提供运行系统的动态实时视图。显示系统摘要信息以及任务列表
  • uptime 显示系统平均负载
  • ps、pstree 提供当前进程列表
  • free 显示系统中空闲内存和已使用内存的数量
  • mpstat 报告处理器相关的统计数据
  • vmstat 报告进程、内存、磁盘、系统、CPU的统计信息
  • iostat 报告CPU统计数据,还有设备和分区的输入/输出统计数据
  • netstat,ss 显示相关网络统计信息
  • sar 收集、报告系统活动信息
  • numastat 显示每个NUMA节点的内存统计信息
  • pmap 报告一个进程的内存映射
  • iptraf 交互式局域网监控程序
  • tcpdump,wireshark 用来捕捉和分析网络流量
  • strace,ltrace 系统调用和库调用跟踪程序
  • gnuplot 命令行绘图工具
  • Gnome System Monitor Gnome桌面环境的图形性能分析工具
  • KDE System Guard KDE任务管理器和性能监控器

top

top提供一个运行系统的动态实时视图。它可以显示系统摘要信息,以及目前正在由Linux内核管理的任务列表。默认情况下,它会显示运行在服务器上最占用CPU的任务,并每3s更新列表。可以通过进程标识符(PID)、内存使用(%MEM)、优先级(PR)、命令名称(COMMAND)等对进程进行排序。

top工具支持一些有用的热键,包括:

  • t,显示任务cpu信息的开关。
  • m,显示内存信息的开关。
  • f,进入top的交互式配置屏幕,添加/删除所显示的列,有助于为某个特定的任务设置top。
  • o,进入top的交互式配置屏幕,配置top列显示的顺序(从左到右)。
  • r,使用renice修改某个进程的优先级。
  • k,运行kill命令,如果一个进程挂起或者占用更多的CPU,可以杀死进程。
  • h,显示top热键的帮助信息

uptime

uptime显示一行信息,包含当前时间,系统已经运行了多长时间,当前有多少用户登录,在过去1分钟、5分钟、15分钟的系统平均负载 系统平均负载是可运行状态进程或不可中断状态进程的平均数。处在可运行状态的进程要么是正在使用CPU,要么是等待使用CPU。处在不可中断状态的进程正在等待一些I/O访问,例如等待磁盘。平均值有3个时间间隔。因为系统中CPU的数量、平均负载不是规范化的,所以,平均负载为1意味着一个单CPU系统始终是有负载的,在一个4核CPU系统上则意味着它有75%的空闲时间。 平均负载最佳值为1,这意味着每个进程都能立刻访问CPU,并且没有丢失CPU周期。对于单(核)处理器工作站,1或2是可以接受的,而在多处理器服务器上你可能会看到8到10的数字(单核CPU负载是2,4核CPU负载可能是8)。 可以使用uptime确定问题出在服务器还是网络。例如,如果一个网络应用程序运行很糟糕,则可以运行uptime,查看系统负载是否很高。如果没有,则这个问题很可能关系到你的网络,而不是你的服务器。

ps、pstree

当进行系统分析时,ps命令和pstree命令是最基本的常用命令。ps显示有关选择的活跃进程的信息。ps命令提供当前已存在进程的列表。top命令动态显示进程信息,但是ps命令可以以静态方式提供更详细的信息。

ps可以使用3种不同类型的命令选项:

  • UNIX选项,可以组合起来,必须在前面加一个连字符“-”。
  • BSD选项,可以组合起来,不能使用连字符“-”。
  • GNU长选项,在前面有两个连字符“–”。 默认情况下,ps选择具有与当前用户相同的有效用户ID(euid=EUID),并与使用相同终端作为调用程序相关联的所有进程。它显示进程ID(pid=PID)、进程相关联的终端(tname=TTY)、[dd-]hh:mm:ss格式的累计CPU时间(time=TIME)、可执行文件的名称(ucmd=CMD)。默认输出是不排序的。 列出进程的数量与信息取决于所使用的选项。键入简单的ps -ef命令可列出所有的进程。它们各自的PID对进一步操作至关重要,如果使用pmap或renice工具,PID号码是必需的。

1.简单的进程选择 -A,选择所有进程,与-e相同。 -N,选择除满足指定条件以外的所有进程。(否定选择)与–deselect相同。 T,选择与该终端相关的所有进程。与不带任何参数的t选项相同。 -a,选择除session leader(参见getsid(2))以外的进程和与该终端不相关的所有进程。 a,这个选项使得ps列出使用该终端(tty)的所有进程,或当与x选项一起使用时列出所有进程。 -d,选择除session leader以外的所有进程。 -e,选择所有进程,与-A相同。 g,真正所有的进程,甚至是session leader。此选项已经废弃。 r,限制只选择正在运行的进程。 X,此选项使得ps列出你拥有的所有进程,或当与a选项一起使用时列出所有进程。 –deselect,选择除满足指定条件以外的所有进程。(否定选择)与-N相同。 ps命令可以使用这些选项来选择要显示的信息。输出可以因个性化设置而不同。输出格式控制如下: -F,额外的全格式。参见-f选项。 -O format,类似于-o,但是预加载了一些默认列。与-o pid、format、state、tname、time、command或-o pid、format、tname、time、cmd相同。参见-o。 O format,当作为一个格式化选项使用时,与-O相同。 -M,添加安全性数据列。与Z相同(SELinux)。 X,寄存器的格式。 Z,添加安全性数据列。与-M相同(SELinux)。 -c,为-l选项显示不同的调度器信息。 -f,全格式的列表。此选项可以与很多其他UNIX风格的选项组合来添加额外的列。与-L一起使用时,添加NLWP(线程数量)和LWP(线程ID)列。 j,BSD job控制格式。 -j,job格式。 l,显示BSD长格式。 -l,长格式,-y选项通常对此选项有用。 o format,指定用户定义的格式。与-o和–format相同。 -o format,用户定义的格式。format作为单独的参数,是空格分隔或逗号分隔列表的格式,其提供了一个方法来指定单独输出列。标题可以重命名(ps -o pid,ruser=RealUser -o comm=Command)。如果所有列标题为空(ps -o pid= -o comm=)那么此标题行将不会显示。 s,显示信号格式。 u,显示面向用户的格式。 v,显示虚拟内存格式。 -y,不显示选项;显示rss的地址位。这个选项只能与-l一起使用。 -Z,显示安全上下文格式(SELinux等)。 –format format,用户定义的格式。与-o和o相同。 –context,显示安全上下文格式(SELinux)。

线程显示

H,显示线程,好像它们是进程。 -L,显示线程,可能使用LWP和NLWP列。 -T,显示线程,可能使用SPID列。 M,在进程之后显示线程。 -m,在进程之后显示线程。

进程FLAGS

在F列中显示这些值的总和,它是由flag输出说明符来提供的。 1,已经fork但没有exec。 4,使用超级用户特权。

进程状态代码:

  • D,不可中断的睡眠(通常为IO)。
  • R,正在运行或可运行(在运行队列中)。
  • S,可中断的睡眠(等待一个事件完成)。
  • T,已停止,通过一个job控制信号或因为它正在被跟踪。
  • W,分页(从2.6.xx内核开始已无效)。
  • X,死亡(永远不会看到)。
  • Z,已消亡的进程,已经终止但是它的父进程还没有回收。

pstree可以以树形结构显示运行的进程,从而方便我们观察进程间的父子关系。

free

free命令可以显示系统中空闲物理内存总量、已使用物理内存总量、swap空间、内核使用的缓冲和缓存信息,如图2-7所示。共享内存(shared)表示/proc/meminfo文件中MemShared(2.4内核)或Shmem(2.6内核之后)。在RedHat Enterprise Linux 6之前该字段为0,RedHat Enterprise Linux 7中显示为/proc/meminfo下的Shmem文件。

mpstat

mpstat命令用来报告在多处理器服务器上每个可用CPU的相关统计数据。从CPU 0开始。还会报告所有CPU的全局平均活动。mpstat工具是sysstat软件包的一部分。

vmstat

vmstat用来报告关于进程、内存、分页、块IO、中断、CPU活动的信息。vmstat命令显示平均数据或实际样本。通过给vmstat命令提供一个采样频率和采样次数可启用采样模式。

iostat

iostat报告CPU统计数据,并观察有关设备的平均传输速率的活跃时间,其用来监控系统输入/输出设备负载。iostat命令生成的报告可以用来更改系统配置,进行详细的I/O瓶颈和性能调整,以在物理磁盘之间更好地平衡输入/输出负载。iostat工具是sysstat软件包的一部分。

numastat

numastat为进程和操作系统显示每个NUMA(Non-Uniform Memory Architecture)节点的内存统计信息。

iptraf

iptraf(Red Hat Enterprise Linux 7是iptraf-ng)是一个基于ncurses的IP局域网监控程序,它可以生成各种网络统计数据,包括TCP信息、UDP计数、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验和错误,等等。iptraf工具是由iptraf软件包提供的。

tcpdump和wireshark

tcpdump和wireshark是用来捕捉和分析网络流量的两个工具。在Linux下使用libpcap库可以捕捉数据包。它们在一个网络适配器上通过混杂模式监控所有的流量,并且捕捉此适配器接收到的所有数据帧,这些命令应该由超级用户的特权执行,使接口处于混杂模式。

可以使用这些工具深入研究网络相关的问题。可以找到TCP/IP重传、窗口大小缩放,名称解析问题、网络配置错误,等等。记住,这些工具只可以监控网络适配器接收到的数据帧,而不是整个网络流量。

strace和 ltrace

strace用来跟踪系统调用和信号。strace是一个很有用的诊断、指导和调试的工具。系统管理员可以很方便地使用它来诊断和解决程序出现的问题,因为可以在不需要重新编译的情况下来跟踪它们。最简单的情况就是使用strace运行指定的命令,直到命令结束。它拦截并记录进程执行的系统调用和进程接收的信号。每个系统调用的名称、参数和返回值都将被显示在标准错误输出中或可以通过-o选项指定到文件。

ltrace是一个库调用跟踪程序,其可以通过ltrace简单运行指定命令直到它退出。它截取和记录执行进程所进行的动态库调用,和进程接收的信号。它也可以截取和显示程序执行的系统调用。它的使用与strace非常类似。ltrace显示调用函数的参数和系统调用。要确定每个函数有什么样的参数,它需要函数原型的外部声明。

gnuplot

gnuplot是一个可移植的命令行绘图工具,其可以工作在Linux、OS/2、MS Windows、OSX、VMS和许多其他平台上,支持交互模式,也支持脚本。其源代码是有版权的,但是可以自由地发布。它最初被创建是为了让科学家和学生可以交互式地生成可视化数学函数和数据,gnuplot支持许多不同类型的二维平面和三维立体图形。自1986年由Colin Kelley和Thomas Williams开发以来,gnuplot一直都在被提供支持并积极发展。

Search

    微信好友

    博士的沙漏

    Table of Contents