RedHat Linux 7 性能调优指南

Home

RedHat Linux 7 性能调优指南

硬核摇滚 + 硬核优化

Directory

调优前菜

Linux7的变革

两个看懂的:

  • 红帽企业版 Linux 7deadline 作为默认的 I/O 调度器替代了 cfq。这个变更为大多数的用例提供更好的性能表现。
  • XFS文件系统替代ext4成为默认的文件系统,并且现在支持最大容量可达 500 TB 的文件系统,及最大 容量可达 8 EB(稀疏文件)的文件偏移。

性能监控工具

如果说Linux下的性能监控工具,以下所有应该能handle几乎所有监控需求。

/proc

/proc “文件系统”是一个目录,其中包含的文件层次结构代表了 Linux 内核的当前状态。它允许用户和管理员查看系统的内核视图。

/proc 目录中还包含关于系统硬件及任何当前正在运行的程序信息。大部分在 /proc 中的文件是只读文件, 但一些文件(主要是 /proc/sys 文件)能够被用户和应用程序操作,以便向内核传达配置的修改信息。

GNOME系统监控器

GNOME 桌面系统包含一个图形工具,即系统监控器来协助用户监控及修改系统性能。系统监控器显示基本的系统信息并能让用户监控系统进程,以及资源或文件系统的用量。

要启动系统监控器,按超级键进入活动概览,输入 “System Monitor” ,然后按回车键。

PCP

红帽企业版 Linux 7 引入了对 PCP(性能协驾)的支持,PCP 是一套工具、服务及程序库,用于获取、存储 及分析系统级的性能测量值。其轻量级分布式体系结构尤其适合复杂系统的集中化分析。可以使用 Python,Perl,C++ 和 C 接口来添加性能指标。分析工具可以直接使用客户 API (应用编程接口) (Python, C++, C),而且丰富的网页应用程序可以通过一个 JSON 接口来搜索所有可用的性能数据。

Tuna

Tuna 调试配置细节,如调度器策略、线程优先级以及 CPU 和中断关联。tuna 数据包提供了命令行工具和有 同样功能的图形界面。

CentOS里没见着。

内置命令行工具

红帽企业版 Linux 7 提供大量工具来从命令行监控用户系统,使用户可在运行级 5 外监控系统。本章会简要论述每个工具,并提供更多关于在何处使用及如何使用这些工具。

top

top 工具由 procps-ng 数据包提供,提供运行系统中进程的动态视图。它能显示多种信息,包括系统摘要和当 前由 Linux 内核管理的任务列表。它也具有有限的控制流程的能力,并且在系统重启时永久保存配置更改。 默认情况下,显示的进程会根据 CPU 使用率比例来调整,以便容易地看出消耗最多资源的进程。显示的信息 及操作都是高度可配置型的,这使用户可以专注于所需的不同用量的统计数据。

$ top

ps

ps 工具由 procps-ng 数据包提供,提供选定的一组运行进程快照。默认情况下,检测过的组别受限于当前用户所占有的进程,并与运行 ps 的终端相关联。 较之于 top 工具,ps 可以提供更多关于进程的信息,但默认情况下提供的是这一数据的单一快照,并通过进程标识符来调整。

$ ps aux | grep something

vmstat

虚拟内存统计数据工具,即 vmstat,提供关于系统进程、内存、分页、输入/输出、中断和 CPU 活动的即时 报告。vmstat 让用户设置一组采样间隔以接近实时地观察系统活动。

$ vmstat 1 1000
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  1 5937668 235240   1764 3267540  166   70  3001   703    0    0  7  1 89  4  0
 0  0 5937580 243204   1764 3258724  196    0 55108   239 8864 25317  4  1 91  4  0
 2  0 5936776 242336   1764 3258920  192    0 43572  3284 8008 20310 10  1 85  4  0

sar

系统活动报告,即 sar,收集及报告系统当天到目前为止发生的活动信息。默认的输出以十分钟为间隔,显示 当天 CPU 的使用情况(自系统时间00:00:00 始)。 用户也可以使用 -i 选项来以秒为单位设置间隔时间,例如,sar -i 60 意味着 sar 每一分钟检查一次 CPU 使用率。

$ sar
Linux 3.10.0-327.3.1.el7.x86_64 (Xserver)       2016年12月13日  _x86_64_       (8 CPU)

00时00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
00时10分01秒     all      0.65      0.27      0.14      0.03      0.00     98.92
00时20分01秒     all      0.56      0.24      0.13      0.02      0.00     99.05
01时40分01秒     all      0.48      0.17      0.12      0.02      0.00     99.21

tuned && tuned-adm

tuned 是一种后台调节程序,可通过设置调节配置文件使操作系统在特定工作负载下发挥更好的性能。tuned-adm 是一个命令行工具,允许用户在不同调节配置文件中进行切换。

常见用例包含一些预定义文件,但是 tuned-adm 允许用户自定义配置文件,既可以是预定义文件中的一个,也可以从头定义。在红帽企业版 Linux 7 中,默认文件是 throughput-performance。

tuned-adm 提供的文件分为两类:节能文件和性能提升文件。性能提升文件的内容如下,其侧重点分别为:

  • 存储和网络的低延迟
  • 存储和网络的高吞吐量
  • 虚拟计算机性能
  • 虚拟主机性能

perf

perf 工具通过使用硬件性能计数器和内核跟踪程序来追踪其他命令和应用程序对系统的影响。不同 perf 子命令显示并记录常见性能活动的统计数据,并对数据进行分析和报告。

turbostat

turbostat 由 kernel-tools 数据包提供。是对 Intel® 64 位处理器中处理器的拓扑、频率、空闲的电源状态统 计、温度和用电量的报告。

turbostat 有助于识别服务器的用电量或空闲时间低效问题,也有助于识别系统的管理中断率 (SMI),并能 验证电源管理调节的效果。

turbostat 需要 root 特权来运行,也需要处理器支持以下需求:

  • 不变的时间戳计数器
  • APERF 特定模型寄存器
  • MPERF 模型特定寄存器

iostat

iostat 工具由 sysstat 数据包提供。它对系统输入/输出设备负载进行监控和报告,以协助管理员就如何在物 理磁盘间输入/输出负载做出决定。它是对处理器或设备自 iostat 上次运行或启动的使用率的报告。

$ iostat -xmt 1
Linux 3.10.0-327.3.1.el7.x86_64 (Xserver) 	2016年12月13日 	_x86_64_	(8 CPU)

2016年12月13日 17时01分14秒
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.22    0.31    0.68    3.72    0.00   89.07

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc             264.34    97.83  536.48   84.64     6.77     2.71    31.23     0.34    0.45    0.25    1.70   0.11   6.98
sda               0.08     0.40  427.04   48.75     4.67     1.15    25.04     0.75    1.58    0.18   13.84   0.12   5.88

irqbalance

irqbalance 是一个通过分配处理器硬件中断以提高系统性能的命令行工具。

ss

ss 是一个命令行实用程序,显示 socket 的统计信息,使管理员能够根据时间来评估设备性能。ss 默认打开 已建立连接但未在列表内的 TCP socket,也提供很多有用选项来协助管理员筛选出特定 socket 的统计数 据。 红帽推荐在红帽企业版 Linux 7 中使用 ss 代替 netstat。 一个常见的用法是ss -tmpie,它显示(包括内核信息在内)关于TCPsocket、内存使用率和使用socket 进程的详细信息。

ss -tmpie | more
State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port
ESTAB      0      0      10.8.8.111:27017                10.8.8.8:42589                 timer:(keepalive,10sec,0) uid:996 ino:24159328 sk:ffff8800702925
80 <->
	 skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0) ts sack cubic wscale:7,7 rto:209 rtt:8.827/14.758 ato:40 mss:1448 cwnd:10 send 13.1Mbps lastsnd:119
920 lastrcv:119920 lastack:119881 pacing_rate 26.2Mbps rcv_rtt:9341.62 rcv_space:28960
ESTAB      0      0      10.8.8.111:27017                10.8.8.8:56542                 timer:(keepalive,10sec,0) uid:996 ino:23531273 sk:ffff8801041a3c
00 <->
	 skmem:(r0,rb458016,t0,tb87040,f0,w0,o0,bl0) ts sack cubic wscale:7,7 rto:213 rtt:12.287/16.369 ato:40 mss:1448 cwnd:10 send 9.4Mbps lastsnd:119
922 lastrcv:119922 lastack:119883 pacing_rate 18.9Mbps rcv_rtt:6711.25 rcv_space:44912

numastat

numastat 工具以每一个 NUMA 节点为基础了,显示处理器和操作系统的内存统计数据。 默认情况下,numastat 显示每个节点的 NUMA 从内核的内存分配器中缺失的系统统计数据。最佳性能表现 为高 numa_hit 值和低 numa_miss 值。Numastat 也提供很多命令行选项来说明系统和进程的内存如何 通过系统中 NUMA 节点进行分配。 交叉引用每个节点的 numastat 输出和每个 CPU 的 top 输出是很有用的,可以用来验证进程线程是在内存 分配的同一节点上运行。

numad

numad 是一个自动的 NUMA 关联管理后台程序。它监控系统的 NUMA 拓扑和资源使用率,目的是为了动态 地提高 NUMA 的资源分配和管理(从而提高系统性能)。numad 可以根据系统的工作负载来为性能基准提供 高达 50% 的改善。它还提供预先安置咨询服务,可以通过多种工作关联系统进行查询,以此为最初绑定的 CPU 和内存资源的进程提供协助。

numad 以一个节点为基础,通过定期访问 /proc 文件系统中的信息来监控可用的系统资源。它能尝试将资 源使用率保持在一个特定的等级,并在必要时通过移动 NUMA 节点间的进程来调整资源分配。numad 可以试 图通过本地化和隔离系统中 NUMA 节点子集的重要进程来获得 NUMA 的最佳性能。

numad 主要对长时间运行程序的系统有用,这些程序消耗大量的资源并包含在总系统资源中的一个子集里。 它也对消耗多个 NUMA 节点资源值的应用程序有用,但当系统资源消耗比例增加时,numad 的优势会减小。

当程序只运行几分钟或不消耗太多资源时,numad 不大可能会提高性能。拥有连续且不可预测的内存访问模 式的系统,如大内存数据库,也不大可能受益于 numad。

SystemTap

SystemTap 是一个跟踪和探测工具,使用户可以详尽地监控和分析操作系统的活动,尤其是内核活动。它提 供的信息类似于 top、ps、netstat 和 iostat 工具的输出,但包括筛选和分析所收集数据的额外选项。

SystemTap 提供对系统活动和应用程序性能更为深入且更为准确的分析,使用户能够精确地找到系统和应用 程序的瓶颈。

OProfile

OProfile 是一个全系统性能监控工具。它使用处理器的专业性能监控硬件来检索关于内核和系统可执行文件的 信息,以便确定某些事件的频率,比如引用内存时,就接收第二级缓存请求数和硬件请求数。OProfile 也可用 于确定处理器的使用率,并确定最常使用的应用程序和服务。 但 OProfile 有一些局限性:

  • 性能监控样本可能不太准确。由于处理器可能无法执行指令,样本就会记录一个附近的指令,而不是记录触发中断的指令。
  • OProfile 希望程序多次启动和停止。这样的话多次运行得到的样本就可以累积,用户可能需要清除上一次运行的样本数据。
  • OProfile 集中识别 CPU 访问限制的进程问题。因此,对于等待锁定其他事件来识别睡眠状态的进程并无 帮助。

Valgrind

Valgrind 提供大量的检测及分析工具以帮助提高应用程序的性能。这些工具能检测内存和与线程相关的错误,同样也能检测堆、栈和数组的超限运行,使用户能够轻松地定位和修改应用程序代码错误。它也可以配置缓存、堆和分支预测来确定能增加应用程序速度并最小化内存使用率的因素。

Valgrind通过在合成的 CPU 上运行应用程序来进行分析,并在执行时对现有的应用程序代码进行测试。之后显示的评论会清楚地标识出每个参与应用程序执行的进程至用户指定文件、文件描述符或网络 socket。要注意的是执行测试代码会花上正常执行情况下四至五十倍的时间。

Valgrind 可以按原样应用于应用程序,不需要进行重新编制。但由于 Valgrind 使用调试信息来定位编码中的问题,若应用程序和支持库没有启用调试信息编制,红帽建议进行程序编制以便能包含该信息。

Valgrind 也与 GNU 项目调试器 (gdb)一起使用来提高调试效率。

调优实战

CPU

下文中针对 Linux 7 中会影响应用性能的 CPU(中央处理器)硬件细节及配置选择进行了概述。详述了与 CPU 相关的会影响性能的因素,以及针对相关性能问题的工具和策略。

了解以下因素是如何影响系统和应用程序性能的:

  • 处理器如何互相连接,并且如何连接到相关资源,如内存。
  • 处理器如何为执行操作调度线程。
  • 处理器如何处理Kernel中的间断。

在现代计算机技术中,一个”中央”处理单元的观念是误导性的,因为大部分现代化的系统都有多个处理器。 这些处理器是如何相互连接,并且如何连接至其他系统资源 —”系统拓扑”— 会对系统和应用程序的性能以 及系统调节选项产生巨大的影响。

现代计算机技术主要运用两种主要的拓扑类型:

  • SMP拓扑

SMP (对称多处理器)拓扑允许所有的处理器同时访问内存。然而,由于内存访问权限的共享性和平等性,固然会迫使所有 CPU 及 SMP 系统序列化的内存访问权限的局限性增加,目前这种情况常不被接受。因此,几乎所有现代服务器系统都是 NUMA(非一致性内存访问)机器。

  • NUMA拓扑

比起 SMP 拓扑,NUMA(非一致性内存访问)拓扑是近来才开发的。在 NUMA 系统中,多个处理器物理分组至一个 socket。每个 socket 都有一个专用内存区,对该内存进行本地访问的服务器统称为一个节点。

同一个节点上的服务器能高速访问该节点的存储体,但访问其他节点上的存储体速度就较慢。因此,访问非本地存储体会造成性能的损失。

考虑到性能损失,服务器执行应用程序时,NUMA 拓扑结构系统中对性能敏感的应用程序应访问同一节点的内存,并且应尽可能地避免访问任何远程内存。

因此,在调节 NUMA 拓扑结构系统中的应用程序性能时,重要的是要考虑这一应用程序的执行点以及最靠近此执行点的存储体。

在 NUMA 拓扑结构系统中,/sys 文件系统包含处理器、内存及外围设备的连接信息。/sys/devices/system/cpu 目录包含处理器在系统中相互连接的详情。 /sys/devices/system/node 目录包含系统中 NUMA 的节点信息以及节点间的相对距离。

如何确认系统的拓扑结构?numactl --hardware指令概述了系统的拓扑结构。lscpu指令提供了更为详细的CPU信息:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
座:                 1
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              94
型号名称:        Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
步进:              3
CPU MHz:             4007.343
BogoMIPS:            8016.05
虚拟化:           VT-x
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           8192K
NUMA 节点0 CPU:    0-7

CPU执行进程的最小单元叫做一个”线程”。系统调度器决定运行线程的处理器和运行的时间。但由于调度器主要关注的是保持系统繁忙,因此可能不会为应用程序的性能而对线程进行最佳调度。

例如,在 NUMA 系统中,一个处理器在节点 B 可用,一个应用程序在节点 A 运行,要使在节点 B 的处理器保 持忙碌, 调度器会把应用程序的一个线程转移到节点 B。但是,线程上的应用程序仍然需要访问在节点 A 的内存。由于该线程目前在节点 B 运行,并且对于此线程来说节点 A 的内存已不再是本地内存,访问起来就要花更长的时间。较于在节点 A 等待可用的处理器,并且在能够进行本地内存访问的源节点上执行线程,此线程在节点 B 结束运行可能就更加费时。

设计器或管理员确定线程的运行位置能使对性能敏感的应用程序从中受益。如何保证适当地调度线程,以满足对性能敏感的应用程序的需要。

在早期红帽企业版 Linux 版本中,Linux 内核会定期中断每个 CPU 以查看需要完成的任务。查看的结果用来决定进程调度及负载均衡。这种常规性的中断叫做一个内核 “滴答信号”。

此标记的出现不考虑内核是否有任务要执行。这意味着为了回应这些中断,即使是空闲的内核也会被迫定期进入高能状态(每秒高达1000次)。这阻止了系统有效地利用新近 x86 代处理器的深睡眠状态。

在红帽企业版 Linux 6 和 7 中,默认情况下内核不再中断趋于低功率状态的空闲 CPU,这种性能叫做无时钟内核。当一个或几个任务在运行时,按需中断取代了定时中断,使 CPU 可以更久地处于空闲或低功率状态, 减少了电量的消耗。

红帽企业版 Linux 7 提供一种动态的无时钟设置( nohz_full ),通过用户空间的任务来减少内核干扰以进一步改善其确定性。这一设置可以在指定的内核中通过 nohz_full 内核参数来启用。当这一设置在一个内核中启用时,所有的计时活动将会被移动至无延迟敏感性的内核。这对于高性能计算和实时计算工作负载来说都很有用,因为其用户空间任务对由于内核计时器滴答信号造成的微秒级的延迟尤为敏感。

中断请求或 IRQ 是请求及时关注的信号,是从硬件发送至处理器的。系统中的每个设备都分配到一个或多个 IRQ 号,以便能发送独一的中断信号。当启用中断时,收到中断请求的处理器会立即暂停执行当前应用程序线程,这是为了处理该中断请求。

因为中断了正常的运行,高中断率会严重降低系统性能,但减少中断的时间是可能的,可以设置中断关联或发送一批低优先率的中断(“组合中断”)。

CPU监控和诊断

  • turbostat

Turbostat 在规定的间隔中给出计时器的结果以协助管理员识别服务器异常,例如过度耗电,无法进入深睡 眠状态或是创建了不必要的系统管理中断(SMIs)。

$ sudo turbostat
cpu0: Guessing tjMax 100 C, Please use -T to specify
     CPU Avg_MHz   %Busy Bzy_MHz TSC_MHz CoreTmp
       -      62   27.89     223     296      37
       0     155   65.79     236     296      37
       1      55   25.08     219     296      37
       2      18    9.51     187     296      36
       3      21   11.16     187     296      32
  • /proc/ interrupts

/proc/interrupts 文件列举了从一个特殊的 I/O 设备发送至各处理器的中断数量,显示了中断请求 (IRQ)数量、系统中各处理器处理该类型中断请求的数量,发送的中断类型以及以逗号分隔开的回应所列中 断请求的设备列表。

如果一个特定的应用程序或是设备生成大量的中断请求给远程处理器处理,其性能就会受到影响。这种情况下,当应用程序或设备在处理中断请求时,可以在同一节点设置一个处理器,以此来缓解性能不佳的状况。

默认情况下,红帽企业版 Linux 7 使用无时钟内核,它不会中断空闲 CPU 来减少用电量,并允许较新的处理器利用深睡眠状态。

红帽企业版 Linux 7 同样提供一种动态的无时钟设置(默认禁用),这对于延迟敏感型的工作负载来说是很有帮助的,例如高性能计算或实时计算。

要启用特定内核中的动态无时钟性能,在内核命令行中用 nohz_full 参数进行设定。在 16 核的系统中,设定 nohz_full = 1-15 可以在 1 到 15 内核中启用动态无时钟内核性能,并将所有的计时移动至唯一未设定的内核中(0 内核)。这种性能可以在启动时暂时启用,也可以在 /etc/default/grub 文件中永久启用。要持续此性能,请运行 grub2-mkconfig-o/boot/grub2/grub.cfg 指令来保存配置。

启用动态无时钟性能需要一些手动管理。

  • 当系统启动时,必须手动将 rcu 线程移动至对延迟不敏感的内核,这种情况下为 0 内核。

# for i in pgrep rcu ; do taskset -pc 0 $i ; done

  • 在内核命令行上使用 isolcpus 参数来将特定的内核与用户空间任务隔离开。

  • 可以选择性地为辅助性内核设置内核回写式 bdi-flush 线程的 CPU 关联:

可以选择性地为辅助性内核设置内核回写式 bdi-flush 线程的 CPU 关联:

验证动态无时钟配置是否正常运行,执行以下命令,其中 stress 是在 CPU 中运行 1 秒的程序。

# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1

默认的内核计时器配置在繁忙 CPU 中显示 1000 次滴答记号:

# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1
1000 irq_vectors:local_timer_entry

动态无时钟内核配置下,用户只会看到一次滴答记号:

# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1
1 irq_vectors:local_timer_entry

x86_energy_perf_policy 工具允许管理员定义性能与能效的相对重要性。当处理器在性能与能效间权衡选择时,此信息可用来改变支持这一特征的处理器。默认情况下适用于所有在 performance 模式下的处理器,它要求处理器的支持,由CPUID.06H.ECX.bit3 显示,且必须在有 root 特权的情况下运行。

taskset 工具由 util-linux 数据包提供。Taskset 允许管理员恢复和设置进程中的处理器关联,或通过特定的处理器关联来启动一个进程。

管理员可以通过特定的调度或内存安置策略来使用 numactl 运行进程。Numactl 也可以为共享内存片段或文件设置永久性策略,并设置处理器关联和进程的内存关联。

在 NUMA 拓扑系统中,处理器访问内存的速度会由于处理器和存储体之间距离的增加而减慢。因此,重要的是要对性能敏感的应用程序进行配置,以便它们能够从最近的且可能的存储体分配内存。最好是使用在同一NUMA 节点的内存和 CPU。

对性能敏感的多线程应用程序经配置后在特定的 NUMA 节点上运行会比在特定的处理器上运行好处更多。这是否适合则取决于用户系统及应用程序的需求。如果多个应用程序线程访问同一缓存数据,那么对那些线程进行配置,使其在同一处理器上运行可能是合适的。但是,如果在同一处理器上运行的多线程访问及缓存的是不同数据,那么每个线程可能会收回之前线程访问的缓存数据。这就意味着每个线程会“ 缺失” 缓存,会浪费运行时间来从磁盘中获取数据并在缓存中替代它。用户可以使用 perf 工具查看大量的缓存缺失。

$ numactl

可以通过隔离CPU,隔离线程的方式实现性能调优。

MEM

对于适中的工作负载,红帽企业版 Linux 7 会默认优化。如果用户的应用程序或用例需要大量的内存,那么改变系统处理虚拟内存可以提高应用程序的性能。

物理内存管理区块称为页面。每一个页面的物理位置都映射到一个虚拟位置以便处理器能够访问内存。这种映射存储于一个叫做页面表的数据结构中。

默认情况下,一个页面大约有 4 KB。由于页面的默认大小非常小,因此用户需要很多页面来管理大量的内 存。但是,页面表只能存储有限的地址映射,增加其存储地址映射的数量既昂贵又困难,因为要考虑到将性能 等级保持在内存需求的范围内。

红帽企业版 Linux 通过静态大型分页来给每个页面管理大内存的能力。静态大型分页可以配置到 1 GB 大小。 但很难对其进行手动管理,必须在启动时就分配好。

透明大型分页很大程度上是之余静态大型页面的一个自动选择。透明大型页面大小为 2 MB 且默认启动。它们有时会干扰对延迟敏感的应用程序,因此常常在延迟严重时被禁用。

从页面表中读取地址映射很耗时且资源很宝贵,因此 Linux 操作系统提供最近使用地址的缓存:转换后背缓冲区(TLB)。但默认的TLB只能缓存一定量的地址映射。如果需要的地址映射不在 TLB 中(即,TLB missed),系统仍然需要读取页面表以决定物理到虚拟的地址映射。

由于应用程序内存需求与用来缓存地址映射的页面大小之间的关系,较于对内存需求小的应用程序来说,对内存需求大的应用程序更容易受到 TLB 缺失造成的性能下降问题。因此无论何时,避免 TLB 缺失很重要。

红帽企业版 Linux 提供大型转换后背缓冲区 (大型 TLB),可以将内存分为大片段进行管理。这使大量的地址映射能同时进行缓存,以此降低 TLB 缺失的可能性,并提高需要大内存的应用程序的性能。

有两大内存诊断工具:

  • vmstat

Vmstat 由 procps-ng 数据包提供,输出用户系统进程、内存、网页、字块输入/输出、中断以及 CPU 活动等的报告。这是在机子最后一次启动或上一个报告之后提供的关于这些活动平均数的即时报告。

  • Valgrind

Valgrind 是一个为用户提供空间二进制文件测量方法的框架。它包含大量的工具来概述和分析程序性能。本章列出的 valgrind 工具能帮助用户检测内存错误,例如未初始化的内存使用和不适当的内存分配及解除分配。

\# yum install valgrind

Memcheck 是默认的 valgrind 工具。它检测并报告大量难以检测和诊断到的内存错误,例如:

  • 不应发生的内存访问
  • 使用未定义或未初始化的值
  • 不正确的释放堆内存
  • 指示字重叠
  • 内存泄露

用法如下:

\# valgrind --tool=memcheck application

Cachegrind 会模拟应用程序与系统缓存层次结构和分支预测器间的交互作用。它会追踪模拟的第一级指令 和数据缓存使用情况,以此检测出该级缓存与代码间不良的交互作用。它也会追踪最后一级缓存(第二或第三 极)以便追踪内存访问。这样的情况下,使用 cachegrind 的应用程序运行起来会比通常慢 20-100 倍。

Cachegrind 会收集应用程序执行期间的统计数据,并且将概要输出至操作台。要在应用程序中运行 cachegrind ,请执行以下指令:

\# valgrind --tool=cachegrind application

Massif 测量特定应用程序的堆空间。它测量可用空间和额外用来记录和调准的空间。massif 有助于用户了 解减少应用程序内存使用的方法,以便提高运行速度,减少应用程序耗尽系统交换空间的可能性。使用 massif 执行的应用程序运行起来比平常通常慢 20 倍左右。

\# valgrind --tool=massif application

内存使用量往往是通过设置一个或多个内核的参数值来进行配置的。这些参数可以通过改变在 /proc 文件系统中的文件内容来进行暂时设置,或是通过设置系统核心参数工具来进行永久设置,此工具由 procps-ng 数据包 提供。

例如,要将 overcommit_memory 参数暂时设置为 1,请运行以下指令:

\# echo 1 > /proc/sys/vm/overcommit_memory

要永久设置这个值,请运行以下指令:

\# sysctl vm.overcommit_memory=1

大页面依赖于连续的内存区域,因此最好在启动时,也就是在内存变为片段前就定义好大页面。为此,请添加以下参数至内核启动命令行:

  • hugepages:

启动时在内核中定义 2MB 定值大页面的数量。默认值为 0。只有在系统拥有足够的物理持续性空闲 页面时才能进行分配(或是收回)大页面。此参数保留的页面不能用于其他目的。 此值可以在启动后通过改变 /proc/sys/vm/nr_hugepages 文件值来调节。

  • /proc/sys/vm/nr_overcommit_hugepages:

通过超量使用内存来定义系统所能创建和使用的最大数量的额外大页面。在此文件中写入任何非零的值,表示系统包含此数目的大页面,在不变的页面池耗尽后,这些大页面便来自于内核的常规页面池。由于这些额外的大页面是未使用过的,因此它们会释放并返回至内核的常规页面池中。

配置系统内存容量,主要看三个文件:

  • /proc/sys/vm
  • /proc/sys/fs
  • /proc/sys/kernel

存储和文件系统

追求极致性能优化,请果断使用SSD。

SSD (固态硬盘)使用闪存芯片而非旋转磁盘存储永久数据。它们为逻辑块地址内的全部数据提供恒定访问时 间,且不会像它们旋转的对应物那样出现可测量的搜寻成本。每千兆字节的存储空间更昂贵且存储密度更小, 但比 HDD 延迟时间短、吞吐量更大。

存储和文件系统性能的合理设置在很大程度上取决于存储目的。 I/O 和文件系统性能会受到下列因素的影响:

  • 数据写入或读取模式
  • 数据重新排列与底层几何
  • 块大小
  • 文件系统大小
  • 日记大小和位置
  • 记录访问次数
  • 确保数据可靠性
  • 预取数据
  • 预先分配磁盘空间
  • 文件碎片
  • 资源争用

阅读此章节可了解影响文件系统吞吐量、可伸缩性、响应能力、资源使用和可用性的格式和挂载选项。

I/O调度器

I/O 调度器决定 I/O 操作何时运行在存储设备上以及运行多久。它也被称为 I/O elevator(I/O 升降机)。

RedHat Linux 7 提供三种I/O调度器:

  • deadline

除了 SATA 磁盘为所有块设备的默认 I/O 调度器。Deadline 尝试为指向到达 I/O 调度器的请求提供有保障的延迟。该调度器适合大多数用例,尤其适用于读取操作比写入操作更频繁的请求

将排队的 I/O 请求分类为读或者写批处理,并按照 LBA 递增顺序执行。默认设置下,读批处理优先 于写批处理,这是因为应用更可能阻止读取 I/O。批处理后,d ead l i ne 检查写入操作因等待处理 器时间而处于多久的“ 饥饿” 状态,并且适当地调度下一个读批处理或写批处理。解决批处理的请求 数量、发出写批处理的读批处理数量、以及请求过期前的时间量都是可配置的。

  • cfp

默认调度器只适用于标识为 SATA 硬盘的设备。完全公平队列调度器,cfq ,将进程分成三个独立类别:实时尽其所能空闲。实时类别的进程总是先于尽其所能类别进程执行,而尽其所能类别进程总是在空闲类别进程之前执行。这意味着实时类别的进程可以使尽其所能和空闲进程等待处理器时间而忍受“饥饿”。默认设置下,分配进程到尽其所能类别。

Cfq 使用历史数据来预测应用是否会在不久之后发出更多 I/O 请求。如果将有更多 I/O 请求,cfq 空闲则会等待新的 I/O,即使有来自其他进程的 I/O 在等待处理。

因为有空闲的趋势,cfq 调度器不应用于连接不会引起大量搜寻 penalty(惩罚)的硬件,除非它为 此目的而被调整。cfq 调度器也不应用于连接其他断续工作型调度器,例如基于主机的硬件 RAID 控制器,因为这些调度器的堆积有造成大量延迟的趋势。

  • noop

noop I/O 调度器执行简单的 FIFO(先进先出)调度算法。请求通过简单的最后选中的缓存数据在一般块层合并。对于使用最快存储的受 CPU 限制的系统,这是最佳调度器。

文件系统

  • XFS

XFS 是一个可靠的、且可高度缩放的 64 位文件系统。它是红帽企业版 Linux 7 中默认文件系统。 XFS 使用基于分区的分配,具有一些分配方案,包括预先分配和延迟的分配,这两种都会减少碎片和辅助性能。它也支持促进故障恢复的元数据日志。当挂载并激活时,能够对 XFS 进行碎片整理和放大,红帽企业版 Linux 7 支持几种 XFS 特定的备份和还原工具程序。 自红帽企业版 Linux 7.0 GA 起,XFS 支持最大容量可达 500 TB 的文件系统,以及最大容量为 8 EB 的文件偏移量(稀疏文件)。

  • Ext4

Ext4 是 ext3 文件系统的可缩放扩展。它的默认行为对大部分工作负载是最佳的。然而,它只支持最大容量为 50 TB的文件系统以及最大容量为 16 TB 的文件。

  • Btrfs

Btrfs 是提供缩放性、容错和方便管理的 copy-on-write(写时复制)文件系统。它包括内置快照和 RAID 支持,通过数据和元数据校验来提供数据的完整性。它也通过数据压缩提高性能及使用空间的效率。Btrfs 作为一种技术预览,支持最大容量可达 50 TB 的文件系统。

Btrfs 是最适合桌面存储和云存储的。最初格式化设备时,最好按照预期使用而调整 btrfs。

  • GFS2

GFS2 是具有极高可用性附加装置的一部分,为红帽企业版 Linux 7 提供簇文件系统支持。GFS2 集群提供所有服务器一致的文件系统图像,允许服务器在一个单独共享文件系统中读取和写入。 GFS2 支持最大容量可达 250 TB 的文件系统。

磁盘性能问题监控和诊断

vmstat

Vmstat 报告整个系统的进程、内存、分页、阻止 I/O、中断和 CPU 活动。它能帮助管理员决定 I/O 子系统是否对任何性能问题负责。

下列是I/O性能最相关的信息:

  • si 切换进硬盘,或者以 KB 为单位写入交换空间。
  • so 从硬盘中切换出,或者以 kb 为单位从交换空间读取
  • bi 写入块,或者以 kb 为单位阻止写操作
  • bo 读取块,或者以 kb 为单位阻止读操作
  • wa 等待 I/O 操作完成的队列部分
iostat

报告加载在您系统中的 I/O 设备。如果使用 vmstat 的分析显示 I/O 子系统对性能下降负责,您可以使用 iostat 来确定负责的 I/O 设备。

网络

发送至红帽企业版 Linux 系统的数据包是由 NIC(网络接口卡) 接收的,数据包置于内核硬件缓冲区或是循环缓冲区中。NIC 之后会发送一个硬件中断请求,促使生成一个软件中断操作来处理该中断请求。 作为软件中断操作的一部分,数据包会由缓冲区转移到网络堆栈。根据数据包及用户的网络配置,数据包之后会被转发、删除或转移到一个应用程序的 socket接收队列,并将从网络堆栈中删除。这一进程会持续进行, 直到 NIC 硬件缓冲区中没有数据包或一定数量的数据包(在/proc/sys/net/core/dev_weight 中指定)被转移。

虽然网络堆栈基本上是自我优化的,但是在网络堆栈处理过程中有很多导致瓶颈且降低性能的问题。有三大可能瓶颈的地方:

  • NIC硬件缓冲区或循环缓冲区
  • 硬件或软件中断队列
  • 应用程序的socket接收队列

网络相关主要用到的工具有:

  • ss
  • ip
  • dropwatch
  • ethtool
  • /proc/net/snmp

工具参考

\1. irqbalance

irqbalance 是一个命令行工具,在处理器中分配硬件中断以提高系统性能。默认设置下在后台程序运行,但只可通过 –o neshot 选项运行一次。

\2. Tuna

Tuna 使您能够控制处理器和调度关联。此章节包含命令行界面,但是也可使用有相同功能范围的图形界面。运行命令行 tuna 启动图形工具。

\3. ethtool

允许管理员查看和编辑网络接口卡设置。这有助于观察某些设备的统计信息,比如被设备丢弃 的数据包的数量。

\4. ss

ss 是一个命令行工具,显示 socket的统计信息,允许管理员超时访问设备性能。默认设置下,ss 列出打开的非监听且已建立联系的 TCP socket,但向管理员提供一些为筛选掉特定 socket数据的有用选项。

\5. tuned

Tuned 是一个调整的后台程序,在某种工作负载量下通过设置调整配置文件使操作系统有更好的性能表现。 对其进行配置,使其对 CPU 和网络使用的变化做出响应,调整设置以提高激活设备的性能,并减少在未激活设备中的能耗。

在 /etc/tuned/tuned-main.conf 文件中编辑 dynamic_tuning 参数以配置动态调整行为。您也能在调整检查使用和更新调整细节之间,使用 update_interval 参数以秒为单位配置时间。

\7. tuned-adm

\8. perf

  • perf record 将性能数据记录到随后可使用perf report分析的文件中.
  • perf report 从文件中读取性能数据并分析记录数据.
  • perf list 列出特定机器上有效事件。这些事件因系统性能监控硬件和软件配置而异
  • perf top 此命令执行与 top 工具相似的功能。它实时生成并显示性能计数器配置文件。
  • perf trace 此命令执行与 strace 工具相似的功能。它监控特定线程或进程使用的系统调用以及该应用程序接收的所有信号。可获得其他的跟踪目标。