Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
性能调节指南
在红帽企业版 Linux 6 中优化子系统流量
版 4.0
红帽 主题专家
编辑
Don Domingo
编辑
Laura Bailey
摘要
第 1 章 概述
- 性能
- 各个子系统章节论述红帽企业版 Linux 6 中特有的性能。这些章节还论述了红帽企业版 Linux 6 中具体子系统性能比红帽企业版 Linux 5 的显著改善。
- 分析
- 本书还模拟每个具体子系统的性能指标。根据具体服务给出这些指标的常用值,帮助您理解其在真实产品系统中的意义。另外,《性能调节指南》还演示了查询子系统性能数据(即侧写)的不同方法。注:这里演示的一些侧写工具在其他文档中有具体论述。
- 配置
- 可能本文档中大多数重要信息是告诉您如何在红帽企业版 Linux 6 中调整性能。《性能调节指南》解释了如何为具体服务微调红帽企业版 Linux 6 子系统。
1.1. 读者
- 系统/业务分析师
- 本书模拟并解释了红帽企业版 Linux 6 中包含的性能,提供大量子系统如何为具体工作负载工作的信息(包括默认和优化配置)。用来描述红帽企业版 Linux 6 性能的详细长度可帮助签字客户和销售工程师了解这个平台在可以接受的水平提供消耗资源服务的适合程度。《性能调节指南》还在可能的情况下提供各个特性具体文档的链接。读者可根据这些详细的性能特点构成部署和优化红帽企业版 Linux 6 的高级策略。这样可让读者开发并评估架构提案。这个注重性能的文档适合非常了解 Linux 子系统和企业级网络的读者。
- 系统管理员
- 本文档中模拟的步骤审适合有 RHCE[1]技能(或者有相当于 3-5 年部署和管理 Linux 经验)的系统管理员。《性能调节指南》主要为每个配置提供尽可能详细的效果,就是说论述所有可能的性能平衡。性能调节的基本技能不是了解如何分析和调节子系统。系统管理员应该了解如何为具体的目的平衡和优化红帽企业版 Linux 6 系统。即意味着了解在尝试使用提高具体子系统性能设计的配置时会有什么性能交换和代偿。
1.2. 横向可扩展性
1.2.1. 并行计算
1.3. 分布式系统
- 通讯
- 横向延展需要同时(平行)执行很多任务。因此这些任务必须有进程间通讯以便协调其工作。另外,采用横向延展的平台应该可以跨多个系统共享任务。
- 存储
- 本地磁盘存储不足以满足横向延展的要求。需要分布式或者共享存储,一个有可允许单一存储卷容量渐变增长的提取层,另外还有额外的新存储硬件。
- 管理
- 分布式计算最重要的任务是管理层。这个管理层可协调所有软件和硬件组件,有效管理通讯、存储以及共享资源的使用。
1.3.1. 通讯
- 硬件
- 软件
计算机之间最常用的通讯是使用以太网。目前系统默认提供 Gigabit Ethernet(GbE),且大多数服务器包括 2-4 个 Gigabit 以太网 GbE 端口。GbE 提供良好的带宽和延迟性能。这是目前使用的大多数分布式系统的基础。即使系统使用较快的网络硬件,一般也是使用 GbE 专门用于管理接口。
Ten Gigabit Ethernet (10GbE) 是在高端甚至一些中端服务器中迅速得以广泛使用。10GbE 提供比 GbE 快 10 倍的带宽。其主要优点之一是使用现代多核处理器,它可保证通讯和计算之间的平衡。您可以将使用 GbE 的单核系统与使用 10GbE 的八核系统进行比较。以这种方法使用,10GbE 对保持整体系统性能有特殊意义,并可以避免通讯瓶颈。
Infiniband 提供比 10GbE 更高的性能。除在以太网中使用 TCP/IP 和 UDP 网络连接外,Infiniband 还支持共享内存通讯。这就允许 Infiniband 通过远程直接内存访问 (RDMA) 在系统间使用。
使用以太网的 RDMA (RoCCE) 通过 10GbE 基础设施实施 Infiniband 形式的通讯(包括 RDMA)。鉴于 10GbE 产品产量的增长带来的成本改善,我们有理由相信可能会在更大范围的系统和程序中使用更多的 RDMA 和 RoCCE。
1.3.2. 存储
- 多系统在单一位置保存数据
- 存储单元(例如卷)由多个存储应用组成
网络文件系统 (NFS) 可让多服务器或者用户通过 TCP 或者 UDP 挂载并使用远程存储的同一实例。NFS 一般用来保存由多个程序共享的数据。它还便于对大量数据的海量存储。
存储区网络 (SANs) 使用光纤或者 iSCSI 协议提供对存储的远程访问。光纤基础设施(比如光纤主机总线适配器、开关以及存储阵列)有高性能、高带宽和海量存储。SAN 根据处理分割存储,为系统升级提供可观的灵活性。
- 控制对存储的访问
- 管理海量数据
- 供应系统
- 备份和复制数据
- 提取快照
- 支持系统故障切换
- 保证数据完整性
- 迁移数据
红帽全局文件系统 2(GFS2)提供一些特别定制的功能。GFS2 的基本功能是提供单一文件系统,其中包括同时读/写访问,集群中跨多个成员的共享。即使说该集群的每个成员都可以看到 GFS2 文件系统中“磁盘上”的完全相同的数据。
1.3.3. 聚合网络
使用 FCoE,标准光纤命令和数据包可使用 10GbE 物理基础架构通过单一聚合网卡(CNA)传送。也可使用同一链接传输标准 TCP/IP 以太网流量以及光纤存储操作。FCoE 为多个逻辑网络/存储连接使用一个物理网卡(和一条线缆)。
- 连接数减少
- FCoE 将每台服务器的网络连接减少了一半。您仍可以根据性能或者可用性目的选择使用多个连接,虽然单一连接就可以提供存储和网络连接。这对批萨盒服务器和刀片机都非常有用,因为它们的组件空间都有限。
- 低成本
- 减少的连接数立刻表现在线缆、开关以及其他联网设备的减少。以太网的历史也是规模经济的历史。网络成本急剧下降,因为市场上设备数量已从百万级上升到十亿级,明显的表现就是 100Mb 以太网和 GB 以太网设备价格的下降。同样,10GbE 也变得比以前便宜很多。另外,因为已可将 CNA 硬件整合到单一芯片中,广泛的使用也将增加其在市场中的数量,直接造成价格大幅下降。
Internet SCSI (iSCSI) 是另一个聚合网络协议类型,它是 FCoE 的替换产品。与光纤相似,iSCSI 在网络中提供块级存储。但 iSCSI 不提供完整管理环境。iSCSI 比 FCoE 强的一点是提供更多光纤容量和灵活性,同时成本较低。
第 2 章 红帽企业版 Linux 6 性能特点
2.1. 64 位支持
- 大页面和透明大页面
- 非均匀内存访问改进
在红帽企业版 Linux 6 中采用大页面可让系统在跨不同内存负载工作时更有效地管理内存。大页面动态地使用 2MB 页面,而不是标准的 4KB 页面大小,这样可以让应用程序全面处理 GB 甚至 TB 内存。
很多新系统现在支持非均匀内存访问(NUMA)。NUMA 为大型系统简化硬件设计和创建,但它也增加了应用程序开放的复杂性。例如:NUMA 采用本地和远程内存,但访问远程内存的时间是访问本地内存的好几倍。这个功能(还有其他一些功能)有很多隐患,可能会影响操作系统、应用程序以及应部署的系统配置。
2.2. Ticket 自旋锁
2.3. 动态列表结构
2.4. 无空循环内核
2.5. 控制组
- 分配给该 cgroup 的任务列表
- 分配给那些任务的资源
- CPU 组
- 内存
- I/O
- 网络(带宽)
2.6. 存储和文件系统改进
Ext4 是红帽企业版 Linux 6 的默认文件系统。它是 EXT 文件系统产品线的第四代产品,理论上支持的最大文件系统大小为 1ET,单一文件最大可为 16TB。红帽企业版 Linux 支持最大的文件系统大小为 16TB,单一文件最大可为 16TB。除有较大存储容量外,ext4 还包括几个新功能,比如:
- 基于扩展的元数据
- 延迟的分配
- 日志检查总数
XFS 是一个鲁棒且成熟的 64 位日志文件系统,支持超大文件和单一主机中的文件系统。这个文件系统最初由 SGI 开发,并有在超大服务器和存储阵列中运行的经验。XFS 功能包括:
- 延迟的分配
- 动态分配的内节点
- 剩余空间管理可扩展性的 B-tree 索引
- 在线碎片重组和文件系统增长
- 复杂的元数据预读算法
传统 BIOS 支持的最大磁盘大小为 2.2TB。使用 BIOS 的红帽企业版 Linux 6 系统可以通过使用名为全局分区表(GPT)的新磁盘结构支持超过 2.2TB 的磁盘。GPT 只能用于数据磁盘,不能在使用 BIOS 的引导驱动器中使用,因此引导驱动器最大只能是 2.2TB。BIOS 最初是由 IBM PC 发明的,虽然 BIOS 已经有了长足的发展可以使用先进的硬件,但统一可扩展固件界面(UEFI)的设计是用来支持最新以及新兴的硬件。
重要
重要
第 3 章 监控和分析系统性能
3.1. proc 文件系统
proc
“文件系统”是包含代表 Linux 内核当前状态的文件层级目录。它可让程序和用户从内核角度查看系统。
proc
目录还包含有关系统硬件以及目前正在运行的进程的信息。大多数此类文件为只读,但有些文件(主要是在 /proc/sys
中)是可以由用户和程序控制让内核了解配置更改。
proc
目录的详情请参考《部署指南》,地址为 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。
3.2. GNOME 和 KDE 系统监视器
GNOME System Monitor 显示基本系统信息并可让您监控系统进程以及资源或者文件系统使用。在 Terminal 中使用 gnome-system-monitor
命令打开它,也可已在「应用程序」菜单中选择「系统工具」 > 「系统监视器」打开该程序。
- 「系统」
- 显示计算机硬件和软件基本信息。
- 「进程」
- 显示活跃进程以及那些进程之间的关系,同时还显示每个进程的详细信息。它还让您可以过滤显示的进程并在那些进程中执行某些动作(比如启动、停止、杀死、更改优先权等等。)。
- 「资源」
- 显示当前 CPU 使用时间、内存以及 swap 空间用量和网络使用。
- 「文件系统」
- 列出所有已挂载文件系统及其每个系统的脚本信息,比如文件系统类型、挂载点以及内存使用。
KDE System Guard 可让您监控当前系统负载和正在运行的进程。它还让您在这些进程中执行动作。在 Terminal 中使用 ksysguard
命令打开它,也可点击「Kickoff Application Launcher」,选择「应用程序」 > 「系统工具」 > 「系统监视器」打开该程序。
- 「进程表」
- 显示所有运行中的进程,默认是根据字母顺序显示。您也可以根据其他属性值对进程排序,比如总 CPU 用量、物理或者共享内存用量、拥有者和优先权。您还可以过滤可视结果,搜索具体进程或者在某个进程中执行某些动作。
- 「系统负载」
- 显示 CPU 用量、内存和 swap 空间用量以及网络使用的历史记录图。鼠标放在图形上就可以看到详细分析和图形按钮。
3.3. 内嵌命令行监控工具
top
top 工具为运行中的系统提供一个动态实时的进程查看。它可以显示各种信息,其中包括系统概述以及目前由 Linux 内核管理的任务。它还有一定可以操控进程的能力。其操作和信息都是可以配置的,且所有配置详情在重启后都将被保留。
man top
。
ps
ps 工具提取活跃进程所选组的快照。默认情况下这个组仅限于当前用户以及与之关联的同一终端拥有的进程。
man ps
。
vmstat
vmstat(虚拟内存统计)输出结果可即时报告您系统的进程、内存、页调度、块 I/O、中断以及 CPU 活动。
man vmstat
。
sar
sar(系统活动报告程序)收集并报告今天到目前为止的系统信息。默认输出结果包括今天的 CPU 使用(10 分钟间隔):
12:00:01 AM CPU %user %nice %system %iowait %steal %idle 12:10:01 AM all 0.10 0.00 0.15 2.96 0.00 96.79 12:20:01 AM all 0.09 0.00 0.13 3.16 0.00 96.61 12:30:01 AM all 0.09 0.00 0.14 2.11 0.00 97.66 ...
man sar
。
3.4. Tuned 和 ktune
default
- 默认节电配置。这是最基本的节点配置。它只启用磁盘和 CPU 插件。注:这与关闭 tuned-adm 不同,关闭该程序会同时禁用 tuned 和 ktune。
latency-performance
- 典型延迟性能调试的服务器配置。它禁用 tuned 和 ktune 节能机制。
cpuspeed
模式改为performance
。每个设备的 I/O 提升程序改为deadline
。对于服务的电源管理质量,将cpu_dma_latency
设定为0
。 throughput-performance
- 用于典型吞吐性能调整的服务器侧写。如果系统没有企业级存储则建议使用这个侧写。它与
latency-performance
相同,只是:- 将
kernel.sched_min_granularity_ns
(调度程序最小优先占用时间间隔)设定为10
毫秒, - 将
kernel.sched_wakeup_granularity_ns
(调度程序唤醒间隔时间)设定为15
毫秒。 - 将
vm.dirty_ratio
(虚拟机脏数据比例)设定为 40%,并 - 启用透明超大页面。
enterprise-storage
- 建议最企业级服务器配置中使用这个侧写,其中包括电池备份控制程序缓存保护以及管理磁盘缓存。它与
throughput-performance
配置类似,只是文件系统要使用barrier=0
重新挂载。 virtual-guest
- 建议最企业级服务器配置中使用这个侧写,其中包括电池备份控制程序缓存保护以及管理磁盘缓存。它与
throughput-performance
类似,只是:- 将
readahead
值设定为4x
,同时 - 不使用
barrier=0
重新挂载的 root/boot 文件系统。
virtual-host
- 根据
enterprise-storage
配置,virtual-host
还可减少可置换的虚拟内存,并启用更多集合脏页写回。您可以在红帽企业版 Linux 6.3 以及之后的版本中找到这个配置,同时推荐在虚拟化主机中使用这个配置,包括 KVM 和红帽企业版 Linux 虚拟化主机。
3.5. 应用程序分析工具
3.5.1. SystemTap
3.5.2. OProfile
- 性能监控示例可能不准确因为该处理器可能没有按顺序执行指令,可能是根据最接近的指令执行,而不是触发中断的指令。
- 因为 OProfile 是系统范围内的程序,且会多次启动和停止,多次运行的示例允许有累积。就是说您需要清除以前程序运行产生的示例数据。
- 它主要是识别有 CPU 限制的问题进程,因此无法识别等待为其他事件锁定而处于睡眠状态的进程。
/usr/share/doc/oprofile-<version>
中的 oprofile 文档。
3.5.3. Valgrind
man valgrind
命令。附带的文档也可在此找到:
/usr/share/doc/valgrind-<version>/valgrind_manual.pdf
/usr/share/doc/valgrind-<version>/html/index.html
3.5.4. Perf
perf stat
- 这个命令常见性能事件的总体统计,其中包括执行的质量以及消耗的时钟周期。您可以使用选项标签收集事件中默认测量事件以外的统计数据。从红帽企业版 Linux 6.4 开始,还可以使用
perf stat
过滤根据一个或者多个指定的控制组(cgroup)指定的监控。有关详情请查看 man page:man perf-stat
。 perf record
- 这个命令将性能数据记录到文件中,以后可以使用
perf report
进行分析。有关详情请查看 man page:man perf-record
。 perf report
- 这个命令从文件中读取性能数据并分析记录的数据。有关详情请查看 man page:
man perf-report
。 perf list
- 这个命令列出具体机器中的可用事件。这些时间随性能监控硬件以及系统软件配置而有所不同。有关详情请查看 man page:
man perf-list
perf top
- 这个命令与 top 工具的功能类似。它可以实时生成并显示性能计数器分析。有关详情请查看 man page:
man perf-top
。
3.6. Red Hat Enterprise MRG
- 与电源管理有关的 BIOS 参数、错误探测以及系统管理中断;
- 网络设置,比如中断结合以及 TCP 使用;
- 日志文件系统中的日志活动;
- 系统活动记录;
- 中断和用户进程是由具体 CPU 还是一组 CPU 处理;
- 是否使用 swap 空间;以及
- 如何处理内存不足的意外情况。
第 4 章 CPU
拓扑
线程
中断
4.1. CPU 拓扑
4.1.1. CPU 和 NUMA 拓扑
- 串行总线
- NUMA 拓扑
- 系统使用什么拓扑?
- 该程序目前在哪里执行?
- 最近的内存条在哪里?
4.1.2. 调节 CPU 性能
- CPU(0-3)给出到本地内存控制器的内存地址。
- 内存控制器设置对内存地址的访问。
- CPU 在那个内存地址执行读取或者写入操作。
图 4.1. NUMA 拓扑中的本地和远程内存访问
- CPU(0-3)给出到本地内存控制器的远程地址。
- 会将对那个远程内存地址的 CPU 请求传递给远程内存控制器,到该节点的本地控制器包含那个内存地址。
- 远程内存控制器设置对远程内存地址的访问。
- CPU 在那个远程内存地址执行读取或者写入操作。
- 系统的拓扑(组件是如何连接的),
- 执行程序的核,以及
- 最接近的内存条位置。
4.1.2.1. 使用 taskset 设置 CPU 亲和性
0x00000001
代表处理器 0,0x00000003
代表处理器 3 和 1。
# taskset -p mask pid
# taskset mask -- program
-c
选项提供逗号分开的独立处理器,或者一组处理器列表,类似如下:
# taskset -c 0,5,7-9 -- myprogram
man taskset
。
4.1.2.2. 使用 numactl 控制 NUMA 策略
numactl
使用指定的调度或者内存放置策略运行进程。所选策略是为那个进程及其所有子进程设定。numactl
还可以为共享内存片段或者文件设定永久策略,并设定 CPU 亲和性和进程的内存亲和性。它使用 /sys
文件系统决定系统拓扑。
/sys
文件系统包含有关 CPU、内存和外设是如何通过 NUMA 互联连接的。特别是 /sys/devices/system/cpu
目录中包含有关系统的 CPU 是如何互相连接的信息。/sys/devices/system/node
目录包含有关系统中 NUMA 节点以及那些节点间相对距离的信息。
--show
- 显示当前进程的 NUMA 策略设置。这个参数不需要进一步的参数,且可按以下方式使用:
numactl --show
。 --hardware
- 显示系统中可用节点清单。
--membind
- 只从指定节点分配内存。当使用这个参数时,如果这些节点中的内存不足则分配会失败。这个参数的用法为
numactl --membind=nodes program
,其中 nodes 是您要从中分配内存的节点列表,program 是要从那个节点分配内存的程序。节点号可以采用用逗号分开的列表、范围或者两者的结合方式提供。有关详情请参考 numactl man page:man numactl
--cpunodebind
- 只执行属于指定节点的 CPU 中的命令(及其子进程)。这个参数的用法为
numactl --cpunodebind=nodes program
,其中 nodes 是指定程序(program)要捆绑的 CPU 所属节点列表。节点号可以采用用逗号分开的列表、范围或者两者的结合方式提供。有关详情请参考 numactl man page:man numactl
--physcpubind
- 只执行指定 CPU 中的命令(及其子进程)。这个参数的用法为
numactl --physcpubind=cpu program
,其中 cpu 是用逗号分开的物理 CPU 号列表,这些数据在/proc/cpuinfo
的 processor 字段中显示,program 是应只在哪些 CPU 中执行的程序。还要将 CPU 指定为与当前cpuset
关联。详情请参考 numactl man page:man numactl
。 --localalloc
- 指定永远要在当前节点中分配的内存。
--preferred
- 在可能的情况下分配到指定节点中的内存。如果内存无法分配到指定的节点,则返回其他节点。这个选项只能有一个节点号,例如:
numactl --preferred=node
。详情请参考 numactl man page:man numactl
。
man numa(3)
。
4.1.3. numastat
重要
numastat
,没有任何选项或者参数)可保持与之前版本的严格兼容性,但请注意在这个命令中使用选项或者参数会极大更改输出结果内容及其格式。
numastat
显示进程以及每个 NUMA 节点中操作系统的内存统计数据(比如分配成功数和失败数)。默认情况下,numastat
显示每个节点中的以下事件分类所占内存页数。
numa_miss
和 numa_foreign
值表示最佳 CPU 性能。
默认跟踪分类
- numa_hit
- 为这个节点成功的分配尝试数。
- numa_miss
- 由于在目的节点中内存较低而尝试为这个节点分配到另一个节点的数目。每个
numa_miss
事件都在另一个节点中有对应的numa_foreign
事件。 - numa_foreign
- 最初要为这个节点但最后分配个另一个节点的分配数。每个 每个
numa_foreign
事件都在另一个节点中有对应的numa_miss
事件。 - interleave_hit
- 成功分配给这个节点的尝试交错策略数。
- local_node
- 这个节点中的进程成功在这个节点中分配内存的次数。
- other_node
- 这个节点中的进程成功在另一个节点中分配内存的次数。
-c
- 横向紧凑地显示信息表。这对有大量 NUMA 节点的系统很有用,但栏宽度以及栏间空间有时无法预测。使用这个选项时,会将内存值四舍五入到最接近的 MB 数。
-m
- 显示每个节点中系统范围内的内存使用信息,类似
/proc/meminfo
中的信息。 -n
- 显示与原始
numastat
命令类似的信息(numa_hit, numa_miss, numa_foreign, interleave_hit, local_node, and other_node),采用更新的格式,使用 MB 作为测量单位。 -p pattern
- 为指定的模式显示每个节点的内存信息。如果 pattern 值由数字组成,numastat 假设它是一个数字进程识别符。否则 numastat 会为指定的模式搜索进程命令行。假设在
-p
选项值后输入的命令行参数是过滤器的附加模式。附加模式要扩大而不是缩小过滤范围。 -s
- 以降序模式排列显示的数据以便让最大内存消耗者(根据
total
栏)列在首位。您也可以指定 node,并根据 node 栏排列表格。当使用这个选项时,node 值后必须立即跟上一个-s
选项,如下所示:numastat -s2
不要在该选项及其数值之间有空格。 -v
- 显示更详细的信息。就是说多进程的进程信息会为每个进程显示详细的信息。
-V
- 显示 numastat 版本信息。
-z
- 省略表格显示的信息中数值为 0 的行和列。注:有些接近 0 的值都四舍五入为 0 以方便显示,这些数值不会在显示的输出结果中省略。
4.1.4. NUMA 亲和性管理守护进程(numad)
/proc
文件系统中的信息以便监控每个节点中的可用系统资源。该守护进程然后会尝试在有足够内存和 CPU 资源的 NUMA 节点中放置大量进程已优化 NUMA 性能。目前进程管理阈为至少是一个 CPU 的 50%,且至少有 300 MB 内存。numad 会尝试维护资源使用水平,并在需要时通过在 NUMA 节点间移动进程平衡分配。
-w
选项的详情请参考 man page:man numad
。
4.1.4.1. numad 的优点
4.1.4.2. 操作模式
注意
- 作为服务使用
- 作为可执行文件使用
4.1.4.2.1. 将 numad 作为服务使用
# service numad start
# chkconfig numad on
4.1.4.2.2. 将 numad 作为可执行文件使用
# numad
/var/log/numad.log
文件中。
# numad -S 0 -p pid
-p pid
- 在明确包含列表中添加指定的 pid。numad 进程将管理这个指定的进程直到达到其重要阈值。
-S mode
-S
参数指定扫描的进程类型。如示将其设定为0
则将 numad 管理明确规定到所包含的进程。
# numad -i 0
man numad
。
4.2. CPU 调度
- 实时策略
- SCHED_FIFO
- SCHED_RR
- 一般策略
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. 实时调度策略
SCHED_FIFO
- 这个策略也称作静态优先调度,因为它为每个线程规定固定的优先权(在 1 到 99 之间)。该调度程序根据优先权顺序扫描 SCHED_FIFO 线程列表,并调度准备好运行的最高优先权线程。这个线程会运行到它阻断、推出或者被更高的线程抢占准备运行的时候。即使是最低优先权的实时线程也会比非实时策略线程提前被调度。如果只有一个实时线程,则
SCHED_FIFO
优先权值就无所谓了。 SCHED_RR
SCHED_FIFO
策略的轮循变体。也会为SCHED_RR
线程提供 1-99 之间的固定优先权。但有相同优先权的线程使用特定仲裁或者时间片以轮循方式进行调度。sched_rr_get_interval(2)
系统调用所有时间片返回的数值,但用户无法设定时间片持续时间。这个策略在您需要以相同的优先权运行多个线程是很有帮助。
SCHED_FIFO
线程只有在他们阻断、退出或者由更高优先权线程占先时才停止。因此不建议将优先权设定为 99。因为这样会将您的进程放到与迁移和 watchdog 线程相同的优先权等级。如果这些线程因为您的线程进入计算池而被阻断,则他们将无法运行。单处理机系统会在这种情况下平均分配锁定。
SCHED_FIFO
策略包括一个带宽封顶机制。这样可以保护实时应用程序程序员不会受可能独占 CPU 的任务影响。这个机制可通过 /proc
文件系统参数进行调整:
/proc/sys/kernel/sched_rt_period_us
- 以毫秒为单位定义视为 100% CPU 带宽的时间段(‘us'是明文中与 'µs' 最接近的表示)。默认值为 1000000µs 或者 1 秒。
/proc/sys/kernel/sched_rt_runtime_us
- 以毫秒为单位定义用于运行实时线程的时间段(‘us'是明文中与 'µs' 最接近的表示)。默认值为 950000µs 或者 0.95 秒。
4.2.2. 一般调度策略
SCHED_OTHER
、SCHED_BATCH
和 SCHED_IDLE
。但 SCHED_BATCH
和 SCHED_IDLE
策略主要用于低优先权任务,因此性能调整指南对其不多做论述。
SCHED_OTHER
或者SCHED_NORMAL
- 默认调度策略。该策略使用完全公平调度程序(CFS)提供对所有使用此策略线程的公平访问时间段。CFS 建立了动态优先权列表,部分是根据每个进程线程的
niceness
值。(有关此参数以及/proc
文件系统的详情请参考《部署指南》。)这样可为用户提供一些间接控制进程优先权的权利,但这个动态优先权列表只能由 CFS 直接更改。
4.2.3. 策略选择
SCHED_OTHER
,并让系统为您管理 CPU 使用。
SCHED_FIFO
。如果您只有少量线程,则可以考虑隔离 CPU 插槽,并将线程移动到那个插槽的核中以便没有其他线程与之竞争。
4.3. 中断和 IRQ 调节
/proc/interrupts
文件列出每个 I/O 设备中每个 CPU 的中断数,每个 CPU 核处理的中断数,中断类型,以及用逗号分开的注册为接收中断的驱动程序列表。(详情请参考 proc(5) man page:man 5 proc
)
smp_affinity
,该参数可以定义允许为 IRQ 执行 ISR 的 CPU 核。这个属性还用来提高程序性能,方法是为一个或者多个具体 CPU 核分配中断类似性和程序线程类似性。这可让缓存线可在指定的中断和程序线程之间共享。
/proc/irq/IRQ_NUMBER/smp_affinity
文件中,您可以作为 root 用户查看并修改该值。保存在这个文件中的值是一个十六进制字节掩码,代表系统中所有 CPU 核。
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
smp_affinity
文件:
# cat /proc/irq/32/smp_affinity f
f
,即可为系统中任意 CPU 提供 IRQ。将这个值设定为 1
,如下,即表示只有 CPU 0 可以提供这个中断:
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
smp_affinity
值。在有 32 个以上核的系统有这个要求。例如:以下示例显示在一个 64 核系统的所有核中提供 IRQ 40。
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
注意
smp_affinity
设置硬件以便决定在不影响内核的情况下,硬件层为具体 CPU 提供中断服务。
4.4. 红帽企业版 Linux 6 中 NUMA 的改进
4.4.1. 裸机和可扩展性优化
4.4.1.1. 拓扑识别改进
- 提高的拓扑探测
- 这可让操作系统探测到引导时的底层硬件详情(比如逻辑 CPU,超线程,核,插槽,NUMA 节点以及节点间访问时间),并优化系统进程。
- 完全公平调度程序
- 这个新的调度模式可以保证在有效进程间平均分配运行时间。这个模式与拓扑探测联合使用可将进程在同一插槽的 CPU 中调度以避免昂贵的远程内存访问,同时保证随时保留缓存内容。
malloc
malloc
现在已经优化,可保证分配给某个进程的内存区尽量接近执行该内存的核。这样可以增加内存访问速度。- skbuff I/O 缓存分配
- 与
malloc
类似,现已将其优化为使用与处理 I/O 操作(比如设备中断)的 CPU 最接近的内存。 - 设备中断亲和性
- 设备驱动程序记录的关于哪个 CPU 处理哪个中断的信息可用来限制在同一物理插槽中的 CPU 处理的中断,保留缓存亲和性并限制高容量跨插槽通讯。
4.4.1.2. 改进多核处理器同步
- 读-拷贝-更新(RCU)锁
- 通常 90% 的锁定是用于只读目的。RCU 锁定移除了在未修改数据访问时获得独家访问锁定的要求。这个锁定模式现已用于页缓存分配:现在锁定只可用于分配或者取消分配动作。
- 按 CPU 以及按插槽进行计算的算法
- 很多算法已更新至在同一插槽的合作 CPU 之间执行锁定协作以便允许更细致地调整锁定。大量全局自旋锁已使用按插槽锁定方法替换,且更新的内存分配程序区以及相关的内存页列表可在执行分配或者取消分配操作时让内存分配逻辑贯穿更有效的内存匹配数据结构子集。
4.4.2. 虚拟化优化
- CPU pinning
- 可将虚拟机捆绑到具体插槽中以便优化本地缓存使用,并删除昂贵的插槽间通讯和远程内存访问的需要。
- 透明大页面(THP)
- 启用 THP 后,系统可为大量连续内存自动执行 NUMA 可识别的内存分配要求,减少内存锁竞争量和所需转移后备缓冲器(TLB)内存管理操作,并可在虚拟机中将性能提高达 20%。
- 基于内核的 I/O 实施
- 虚拟机 I/O 子系统现在已在内核中部署,这样可极大降低节点间通讯和内存访问,方法是避免大量上下文切换,减少同步和通讯费用。
第 5 章 内存
5.1. 超大转译后备缓冲器(HugeTLB)
/usr/share/doc/kernel-doc-version/Documentation/vm/hugetlbpage.txt
5.2. 大页面和透明大页面
- 增加硬件内存管理单元中页表数
- 增大页面大小
5.3. 使用 Valgrind 简要描述内存使用
valgrind --tool=toolname program
memcheck
, massif
或者 cachegrind
),同时使用您要使用 Valgrind 进行简要概述的程序替换 program。请注意 Valgrind 的检测可能造成程序比正常情况运行更缓慢。
man valgrind
命令查看相关文档,或者在以下位置查找这些文档:
/usr/share/doc/valgrind-version/valgrind_manual.pdf
以及/usr/share/doc/valgrind-version/html/index.html
。
5.3.1. 使用 Memcheck 简要概述内存使用
valgrind program
一同运行,而无需指定 --tool=memcheck
。它可探测和报告大量很难探测和诊断的内存错误,比如不应该发生的内存访问,使用未定义或者未初始化值,错误释放的堆内存,重叠的光标以及内存泄漏。运行 Memcheck 时程序运行速度要比正常运行时慢 10-30 倍。
/usr/share/doc/valgrind-version/valgrind_manual.pdf
。
--leak-check
- 启用后,Memcheck 会在客户端程序完成后搜索内存泄漏。其默认值为
summary
,它输出找到的泄漏数。其他可能的值为yes
和full
,这两个选项都会给出每个泄漏的详细情况,且no
会禁用内存泄漏检查。 --undef-value-errors
- 启用后(将其设定为
yes
),Memcheck 会报告使用未定义值报告的错误。禁用时(将其设定为no
),则不会报告未定义值错误。默认启用这个选项。禁用该选项会稍稍提高 Memcheck 速度。 --ignore-ranges
- 可让用户指定一个或者多个 Memcheck 检查可寻址能力时应该忽略的范围。多个范围使用逗号分开,例如:
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
。
/usr/share/doc/valgrind-version/valgrind_manual.pdf
中的文档。
5.3.2. 使用 Cachegrind 简要概述缓存使用
# valgrind --tool=cachegrind program
- 一级指令缓存读取(或者执行的指令)和读取缺失,最后一级缓存指令读取缺失;
- 数据缓存读取(或者内存读取),读取缺失,以及最高一级缓存数据读取缺失;
- 数据缓存写入(或者内存写入),写ur缺失,以及最高一级缓存数据写入缺失;
- 已执行和无法预测的条件分支;以及
- 已执行和无法预测的间接分支。
cachegrind.out.pid
,其中pid 为您运行 Cachegrind 的程序的进程 ID)中写入更详细的配置信息。该文件可由 cg_annotate 进行进一步的处理,比如:
# cg_annotate cachegrind.out.pid
注意
# cg_diff first second
--I1
- 指定大小,关联性以及一级指令缓存的块大小,以逗号分开:
--I1=size,associativity,line size
。 --D1
- 指定大小,关联性以及一级数据缓存的块大小,以逗号分开:
--D1=size,associativity,line size
。 --LL
- 指定大小,关联性以及最后一级指令缓存的块大小,以逗号分开:
--LL=size,associativity,line size
。 --cache-sim
- 启用或者禁用缓存访问和缺失计数集合。默认值为
yes
(启用)。注:禁用这个选项和--branch-sim
选项让 Cachegrind 误信息可以收集。 --branch-sim
- 启用或者禁用分支指令和无法预测计数集合。默认将其设定为
no
(禁用),因为它可让 Cachegrind 延缓 25%。注:禁用这个选项和--cache-sim
选项让 Cachegrind 误信息可以收集。
/usr/share/doc/valgrind-version/valgrind_manual.pdf
中的文档。
5.3.3. 使用 Massif 查看堆和栈空间配置
massif
指定为您要使用的 Valgrind 工具:
# valgrind --tool=massif program
massif.out.pid
,其中 pid 是指定的 program 的进程 ID。
ms_print
命令绘制配置数据图,比如:
# ms_print massif.out.pid
--heap
- 指定是否执行堆 分析。默认值为
yes
。将此选项设定为no
即可禁用堆 分析。 --heap-admin
- 指定启用堆 分析时每个块用于管理的字节数。默认每个块有
8
字节。 --stacks
- 指定是否执行栈分析。默认值为
no
(禁用)。要启用栈分析,请将这个选项设定为yes
,但请注意这样做会极大降低 Massif 速度。另外还要注意 Massif 假设开始时主栈大小为 0 以便更好的显示要分析的程序的栈所控制的比例。 --time-unit
- 指定用来分析的时间单位。这个选项三个有效值:执行的指令(
i
),即默认值,用于大多数情况;即时(ms
,单位毫秒),可用于某些特定事务;以及在堆(/或者)栈中分配/取消分配的字节(B
),用于很少运行的程序,且用于测试目的,因为它最容易在不同机器中重现。这个选项在使用ms_print
输出结果画图是游泳。
/usr/share/doc/valgrind-version/valgrind_manual.pdf
中的文档。
5.4. 容量调节
overcommit_memory
临时设定为 1
,请运行:
# echo 1 > /proc/sys/vm/overcommit_memory
sysctl
命令。有关详情请参考《部署指南》,网址为 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。
与容量相关的内存可调参数
/proc/sys/vm/
目录中。
overcommit_memory
- 规定决定是否接受超大内存请求的条件。这个参数有三个可能的值:
0
— 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。1
— 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。2
— 内存拒绝等于或者大于总可用 swap 大小以及overcommit_ratio
指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。注意
只为 swap 区域大于其物理内存的系统推荐这个设置。
overcommit_ratio
- 将
overcommit_memory
设定为2
时,指定所考虑的物理 RAM 比例。默认为50
。 max_map_count
- 规定某个进程可能使用的最大内存映射区域。在大多数情况下,默认值
65530
就很合适。如果您的程序需要映射比这个文件数更多的文件可增大这个值。 nr_hugepages
- 规定在内核中配置的超大页数。默认值为 0。只有系统中有足够的连续可用页时方可分配(或者取消分配)超大页。为这个参数保留的页无法用于其他目的。安装的文件
/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt
中有详细的内容。
与容量相关的内核可调参数
/proc/sys/kernel/
目录中。
msgmax
- 以字节为单位规定信息队列中任意信息的最大允许大小。这个值一定不能超过该队列的大小(
msgmnb
)。默认值为65536
。 msgmnb
- 以字节为单位规定单一信息队列的最大值。默认为
65536
字节。 msgmni
- 规定信息队列识别符的最大数量(以及队列的最大数量)。64 位架构机器的默认值为
1985
;32 位架构机器的默认值为1736
。 shmall
- 以字节为单位规定一次在该系统中可以使用的共享内存总量。64 位架构机器的默认值为
4294967296
;32 位架构机器的默认值为268435456
。 shmmax
- 以字节为单位规定内核可允许的最大共享内存片段。64 位架构机器的默认值为
68719476736
;32 位架构机器的默认值为4294967295
。注:但内核支持的值比这个值要多得多。 shmmni
- 规定系统范围内最大共享内存片段。在 64 位和 32 位架构机器中的默认值都是
4096
。 threads-max
- 规定一次内核使用的最大线程(任务)数。默认值与
max_threads
相同。使用的方程式是:max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE )
threads-max
的最小值为20
。
与容量相关的文件系统可调参数
/proc/sys/fs/
目录中。
aio-max-nr
- 规定在所有活动异步 I/O 上下文中可允许的最多事件数。默认值为
65536
。注:更改这个值不会预先分配或者重新定义内核数据结构大小。 file-max
- 列出内核分配的文件句柄最大值。默认值与内核中的
files_stat.max_files
映射,该参数可将最大值设定为(mempages * (PAGE_SIZE / 1024)) / 10
或者NR_FILE
(在红帽企业版 Linux 中是 8192)。增大这个值可解决由于缺少文件句柄而造成的错误。
Out-of-Memory Kill 可调参数
/proc/sys/vm/panic_on_oom
参数设定为 0
会让内核在出现 OOM 时调用 oom_killer
功能。通常 oom_killer
可杀死偷盗进程,并让系统正常工作。
oom_killer
功能杀死的进程的控制。它位于 proc 文件系统中 /proc/pid/
目录下,其中 pid 是进程 ID。
oom_adj
- 定义
-16
到15
之间的一个数值以便帮助决定某个进程的oom_score
。oom_score
值越高,被oom_killer
杀死的进程数就越多。将oom_adj
值设定为 -17 则为该进程禁用oom_killer
。重要
由任意调整的进程衍生的任意进程将继承该进程的oom_score
。例如:如果sshd
进程不受oom_killer
功能影响,所有由 SSH 会话产生的进程都将不受其影响。这可在出现 OOM 时影响oom_killer
功能救援系统的能力。
5.5. 调整虚拟内存
swappiness
- 参数值可为 0-100,控制系统 swap 的程序。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为
60
。 min_free_kbytes
- 保证系统间可用的最小 KB 数。这个值可用来计算每个低内存区的水印值,然后为其大小按比例分配保留的可用页。
警告
设定这个参数时请小心,因为该值过低和过高都有问题。min_free_kbytes
太低可防止系统重新利用内存。这可导致系统挂起并让 OOM 杀死多个进程。但将这个参数值设定太高(占系统总内存的 5-10%)会让您的系统很快会内存不足。Linux 的设计是使用所有可用 RAM 缓存文件系统数据。设定高min_free_kbytes
值的结果是在该系统中花费太多时间重新利用内存。 dirty_ratio
- 规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始写下脏数据(pdflush)。默认值为
20
。 dirty_background_ratio
- 规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始在后端写下脏数据(pdflush)。默认值为
10
。 drop_caches
- 将这个值设定为
1
、2
或者3
让内核放弃各种页缓存和 slab 缓存的各种组合。- 1
- 系统无效并释放所有页缓冲内存。
- 2
- 系统释放所有未使用的 slab 缓冲内存。
- 3
- 系统释放所有页缓冲和 slab 缓冲内存。
这是一个非破坏性操作。因为无法释放脏项目,建议在运行sync
设定这个参数值。重要
不建议在产品环境中使用drop_caches
释放内存。
swappiness
临时设定为 50
,请运行:
# echo 50 > /proc/sys/vm/swappiness
sysctl
命令。有关详情请参考《部署指南》,网址为 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。
第 6 章 输入/输出
6.1. 功能
- 现在可自动识别固态磁盘(SSD),且 I/O 调度程序的性能可利用这些设备每秒可执行的 I/O(IOPS)次数较高。
- 已在内核中添加了忽略支持以便向基础存储报告未使用的块。这样可以帮助 SSD 进行耗损平衡计算。还可以帮助支持逻辑块分配的存储(类似存储的虚拟地址空间),方法是具体观察实际使用的存储量。
- 红帽企业版 Linux 6.1 会大量更改屏障使用以便提高其性能。
- 已使用 per-backing-device 清空线程替换
pdflush
,可在使用大量 LUN 计数配置时极大改进系统灵活性。
6.2. 分析
图 6.1. 一线程、一文件的 aio-stress 输出结果
- aio-stress
- iozone
- fio
6.3. 工具
si
(换入),so
(换出),bi
(阻止进入),bo
(阻止外出),以及wa
(I/O 等待时间)。当您的交换空间与数据分区同在一个设备中时 si
和 so
有用,且表示总体内存压力。si
和 bi
是读取操作,so
和 bo
是写入操作。这些分类以 Kb 为单位报告。wa
是停滞时间,表示在等待 I/O 完成时哪部分运行队列被阻断。
free
、buff
和 cache
栏最值得关注。cache
值会随着 bo
值增加,随着 cache
的降低 free
值会增大,表示系统正在执行写回操作,且无法使用页缓存。
vmstat
报告的 I/O 数是集合了所有设备的 I/O 总数。如果您确定 I/O 子系统中可能有性能问题,则可以使用 iostat 做进一步的检查,该程序可以根据设备报告 I/O 情况。您还可以搜索更多详细信息,比如平均需求大小,每秒读取和写入数以及正在进行的 I/O 合并数量。
avgqu-sz
)可预估如何使用在描述存储性能时生成的图表执行存储。可采用一些概括估计方法:例如,如果平均请求大小为 4KB,且平均队列大小为 1,则不大可能有非常高的性能。
8,64 3 1 0.000000000 4162 Q RM 73992 + 8 [fs_mark] 8,64 3 0 0.000012707 0 m N cfq4162S / alloced 8,64 3 2 0.000013433 4162 G RM 73992 + 8 [fs_mark] 8,64 3 3 0.000015813 4162 P N [fs_mark] 8,64 3 4 0.000017347 4162 I R 73992 + 8 [fs_mark] 8,64 3 0 0.000018632 0 m N cfq4162S / insert_request 8,64 3 0 0.000019655 0 m N cfq4162S / add_to_rr 8,64 3 0 0.000021945 0 m N cfq4162S / idle=0 8,64 3 5 0.000023460 4162 U N [fs_mark] 1 8,64 3 0 0.000025761 0 m N cfq workload slice:300 8,64 3 0 0.000027137 0 m N cfq4162S / set_active wl_prio:0 wl_type:2 8,64 3 0 0.000028588 0 m N cfq4162S / fifo=(null) 8,64 3 0 0.000029468 0 m N cfq4162S / dispatch_insert 8,64 3 0 0.000031359 0 m N cfq4162S / dispatched a request 8,64 3 0 0.000032306 0 m N cfq4162S / activate rq, drv=1 8,64 3 6 0.000032735 4162 D R 73992 + 8 [fs_mark] 8,64 1 1 0.004276637 0 C R 73992 + 8 [0]
Total (sde): Reads Queued: 19, 76KiB Writes Queued: 142,183, 568,732KiB Read Dispatches: 19, 76KiB Write Dispatches: 25,440, 568,732KiB Reads Requeued: 0 Writes Requeued: 125 Reads Completed: 19, 76KiB Writes Completed: 25,315, 568,732KiB Read Merges: 0, 0KiB Write Merges: 116,868, 467,472KiB IO unplugs: 20,087 Timer unplugs: 0
- Q — 将块 I/O 排队
- G — 获得请求新排队的块不能作为与现有请求合并的人选,因此会分配一个新的块层请求。
- M — 将 I/O is 与现有请求合并。
- I — 在设备队列中插入一个请求。
- D — 已向设备发出一个请求。
- C — 驱动程序已完成请求。
- P — 已插上块设备队列以便允许整合请求。
- U — 已撤销设备队列,允许向该设备发出整合的请求。
- Q2Q — 将请求发送到块层的时间
- Q2G — 从将块 I/O 排队到为其分配一个请求之间所需要的时间
- G2I — 从为其分配一个请求到将其插入设备队列之间所需时间
- Q2M — 将块 I/O 排队到将其与现有请求合并之间所需时间
- I2D — 从将请求插入设备队列到实际向该设备发出请求之间所需时间
- M2D — 从将块 I/O 与现有请求合并到向该设备发出该请求之间所需时间
- D2C — 该设备请求的服务时间
- Q2C — 为一个请求消耗在块层中的时间总量
图 6.2. seekwatcher 输出结果示例
6.4. 配置
6.4.1. 完全公平调度(CFQ)
ionice
命令手动分配调度等级,或者使用 ioprio_set
系统调用编程分配。默认情况下将进程设定为最佳效果调度等级。在实时调度等级和最佳效果调度等级中有分为八个 I/O 优先级,其中 0 代表最高优先权,7 代表最低优先权。采用实时调度等级的进程比采用最佳效果和闲置等级的进程会被更频繁地调度,因此所有调度的实时 I/O 都要在最佳效果或者闲置 I/O 前执行。这意味着实时优先权 I/O 可耗尽最佳效果和闲置等级。最佳效果调度是默认调度等级,且给等级中的默认优先权为 4。停滞调度等级中的进程只有在系统中没有其他等待处理的 I/O 时才会执行。因此请记住只有在进程 I/O 完全不需要向前进行时方可将进程调度等级设定为闲置。
/sys/block/device/queue/iosched/
中同一名称的文件中设定以下参数:
slice_idle = 0 quantum = 64 group_idle = 1
group_idle
设定为 1 后,可能会产生 I/O 停止(而由于闲置后端存储并不繁忙)。但这些停止的情况并不比系统队列中的闲置情况出现得频繁。
可调参数
back_seek_max
- 反向查询通常对性能有负面影响,因为它比正向查询标头重置时间要长很多。但如果负载较小,则 CFQ 仍执行此查询。这个可调参数以 KB 为单位控制 I/O 调度程序允许反向查询的间距。默认为
16
KB。 back_seek_penalty
- 由于反向查询的效率低,每项反向查询都有惩罚与之关联。惩罚是一个乘数。例如:视磁头位置在 1024KB。假设在队列中有两个请求,一个在 1008KB,一个在 1040KB。这两个请求到当前磁头位置登距。但如果应用反向查询惩罚(默认:2),则磁盘中距离较远的请求现在与较近的请求的距离缩短了一倍。因此磁头将向前移动。
fifo_expire_async
- 这个可调参数控制异步(缓存写入)请求等待的时间长度。过期后(以毫秒计)会将无法满足的异步请求移动到调度表中。默认为
250
毫秒。 fifo_expire_sync
- 这个参数与 fifo_expire_async 相同,用于同步请求(读取和 O_DIRECT 写入)。默认为
125
毫秒。 group_idle
- 设定后,CFQ 会在最后一个进程 cgroup 中发出 I/O 后闲置。当使用加权 I/O cgroup 并将
slice_idle
设定为0
后将其设定为1
(通常用于快速存储)。 group_isolation
- 如果启用组隔离(设定为
1
),它可以吞吐量为代价提供组群间更强大的隔离。一般来说,如果禁用组隔离,则只为连续负载提供公平机制。启用组隔离则会为连续以及随机负载提供公平机制。默认值为0
(禁用)。详情请参考Documentation/cgroups/blkio-controller.txt
。 low_latency
- 启用低延迟后(设定为
1
),CFQ 会尝试为设备中每个发出 I/O 的进程提供最长 300 ms 的等待时间。禁用低延迟(设定为0
)可忽略目标延迟,这样就可允许系统中的每个进程获得全部时间片段。默认启用低延迟。 quantum
- quantum 参数控制 CFQ 每次向该存储发出的 I/O 数,主要是限制设备队列深度。默认情况下将其设定为
8
。该存储可能支持更深的队列深度,但增加quantum
还将对延迟产生负面影响,特别是有大量连续写操作的时候。 slice_async
- 这个可调参数控制分配给每个发出异步(缓存写入)I/O 的进程的时间片段。默认将其设定为
40
毫秒。 slice_idle
- 这个参数指定 CFQ 在等待进一步请求时应闲置的时间。红帽企业版 Linux 6.1 以及更早版本中的默认值为
8
毫秒。在红帽企业版 Linux 6.2 以及之后的版本中默认值为0
。这个 0 值可通过删除队列以及服务树层中的所有闲置提高外置 RAID 存储流量。但 0 值可降低内置非 RAID 存储的流量,因为它会增加查询总量。对于非 RAID 存储建议您将slice_idle
值设定在 0 以上。 slice_sync
- 这个可调参数专门用于发出同步(读取或者直接写入)I/O 进程的时间片段。默认值为
100
毫秒。
6.4.2. 最后期限 I/O 调度程序
可调参数
fifo_batch
- 这样可以决定单一批次中发出的读取或者写入数。默认为
16
。设为更高的数值可获得更好的流量,但也会增加延迟。 front_merges
- 如果您找到负载永远不会生成前合并,则您可以将这个可调参数设定为
0
。除非您已了解这个检查的代价,建议将其设定为默认值,即1
。 read_expire
- 这个可调参数可让您已毫秒为单位设定读取操作速度。默认将其设定为
500
毫秒(即半秒)。 write_expire
- 这个可调参数可让您已毫秒为单位设定写入操作速度。默认将其设定为
5000
毫秒(即五秒)。 writes_starved
- 这个可调参数控制处理单一写入批之前可以处理多少读取批。这个值越高,越倾向于读取操作。
6.4.3. Noop
/sys/block/sdX/queue 可调参数
- add_random
- 在某些情况下,熵池中用于
/dev/random
的 I/O 事件成本是可以测量的。在某些情况下要求将其设定为 0。 max_sectors_kb
- 默认将发送到磁盘的最大请求设定为
512
KB。这个可调参数可用来增大或者减小该值。最小值为逻辑块大小;最大值由max_hw_sectors_kb
设定。有些 SSD 会在 I/O 大小超过内部删除块大小时性能下降。在此类情况下建议将max_hw_sectors_kb
降低到删除块大小。您可以使用类似 iozone 或者 aio-stress 的 I/O 生成程序对此进行测试,记录大小可从512
字节到1
MB 不等。 nomerges
- 这个可调参数主要用于故障排除。大多数负载都可从请求合并中获益(即使类似 SSD 的告诉存储也是如此)。但在有些情况下要求禁用合并,比如当您要查看存储后端可处理多少 IOPS 而无需禁用预读或者执行随机 I/O 时。
nr_requests
- 每个请求队列都有可为每个读和写 I/O 分配的请求描述符总数限制。这个数的默认值为
128
,即在将某个进程转入睡眠模式时可将 128 个读和 128 个写放入队列。转入睡眠模式的进程是下一个要分配请求的进程,不一定是已分配所有可用请求的进程。如果您一个对延迟敏感的程序,则应考虑在您的请求队列中降低nr_requests
值,并将存储中的命令队列深度降低到较低的数值(甚至可以降低为1
),这样写回 I/O 就无法分配所有可用请求描述符,并使用写入 I/O 设备队列填满该设备。分配nr_requests
后,所有其他尝试执行 I/O 的进程都会转入睡眠模式等待请求可用。这样更为公平,因为这样会以轮循模式分配请求(而不是让一个进程很快消耗完所有资源)。注:只有在使用最后期限或者 noop 调度程序时才会有此问题,因为默认 CFQ 配置可防止出现此类情况。 optimal_io_size
- 在有些情况下,底层存储会报告最佳 I/O 大小。这在硬件和软件 RAID 中很常见,其中最佳 I/O 大小是条大小。如果报告该值,则程序应该发出以及最佳 I/O 大小相当会长成倍数的大小的 I/O。
read_ahead_kb
- 操作系统可探测到程序何时从文件或者磁盘中连续读取数据。在这种情况下,它可执行智能预读算法,因此用户可能会要求从磁盘中读取更多数据。因此当用户下一步尝试读取数据块时,它已经在操作系统的页缓存中了。可能的缺点是操作系统可能从磁盘中读取过多数据,这样就会占用页缓存直到高内存压力将其清除。如果有多个进程执行错误预读就会增加这种情况下的内存压力。对于设备映射器设备,一般应该增大
read_ahead_kb
值,比如8192
。理由是设备映射器设备通常有多个基础设备组成。将其设定为默认的值(128
KB)然后乘以要映射的设备数是个好的调整起点。 rotational
- 传统硬盘一般都采用轮换模式(比如转盘)。但 SSD 不是。大多数 SSD 会以适当的方式进行宣传。但如果您遇到设备没有说明有此功能,则可能需要手动将轮换模式设定为
0
;禁用轮换模式后,I/O 提升程序就不使用要减少查询的逻辑,因为在非轮换介质中会有少量查询操作罚分。 rq_affinity
- 可在与发出 I/O 不同的 CPU 中处理 I/O。将
rq_affinity
设定为1
可让内核向发出 I/O 的 CPU 传递完成信息。这样可以改进 CPU 数据缓存效果。
第 7 章 文件系统
7.1. 为文件系统调整注意事项
7.1.1. 格式化选项
可在执行 mkfs
时选择块大小。不同的系统其有效范围各有不同:上限为主机系统的最大页大小,下限取决于所使用的文件系统。默认块大小适用于大多数情况。
如果您的系统使用带状存储,比如 RAID5,您可以通过在执行 mkfs
时将数据和元数据与基础存储几何对其提高其性能。对于软件 RAID(LVM 或者 MD)以及有些企业级存储,可查询并自动设置这些信息,但在很多情况下必须由管理员在命令行中使用 mkfs
手动设定。
需要大量使用元数据的负载意味着日志文件系统(比如 ext4 和 XFS)的 log 部分会非常频繁地更新。要尽量减少文件系统查询日志的时间,您可以将日志放在专用存储中。注:如果将日志放在速度比主文件系统慢外部存储中可抵消所有可能的与使用外部存储有关的优势。
警告
mkfs
时创建,并要在挂载时指定日志设备。有关详情请参考 mke2fs(8)
、mkfs.xfs(8)
和 mount(8)
man page。
7.1.2. 挂载选项
写入 barrier 是保证在永久存储中正确写入并排列文件系统元数据的内核机制,即使在存储设备会经常断电的情况也不例外。启用了写入 barrier 的文件系统还可以保证在断电时保存使用 fsync()
进行的所有数据传输。红帽企业版 Linux 默认在所有支持此功能的硬件上启用 barrier。
fsync()
的程序,或者延缓创建和删除大量小文件的速度。对于没有不稳定写入缓存的存储,或者罕见的文件系统不一致的情况以及断电后出现可以承受的数据丢失,可使用 nobarrier
挂载选项禁用 barrier。有关详情请参考《存储管理指南》。
以前在读取文件时,对那个文件的访问时间(atime
)必须在内节点元数据中更新,这样就造成额外的 I/O 写入操作。如果不需要准确的 atime
元数据,则请使用 noatime
选项挂载该文件系统以便消除这些元数据更新。但在大多数情况下,鉴于红帽企业版 Linux 6内核的默认相对 atime(或者 relatime
)行为,atime
不是一个大的消耗。relatime
行为只在原有 atime
比修改时间(mtime
)或者状态更改时间(ctime
)旧时更新 atime
)。
注意
noatime
选项还可以启用 nodiratime
行为。但不需要同时设置 noatime
和 nodiratime
。
预读可通过预先附加数据并将其载入页面缓存以便提前在内存中而不是磁盘中可用,籍此提高文件访问速度。有些负载,比如那些涉及连续 I/O 大量流操作的负载可得益于高的预读值。
blockdev
命令查看并编辑预读值。要查看某个块设备的当前预读值,请运行:
# blockdev -getra device
# blockdev -setra N device
blockdev
命令选择的值重启后不会保留。我们建议创建一个运行等级 init.d
脚本在引导时设定这个值。
7.1.3. 文件系统维护
批丢弃和在线丢弃操作是根据文件系统的功能,可丢弃那些文件系统没有使用的块。这些操作在固态硬盘和精简配置存储中很有帮助。
fstrim
命令运行。这个命令忽略文件系统中所有与该用户标准匹配到未使用块。在还没企业版 Linux 6.2 以及之后 OS 到 XFS 和 ext4 文件系统中支持这两种操作类型,条件是文件系统到基础块设备支持物理忽略操作。只要 /sys/block/device/queue/discard_max_bytes
不为零就支持物理忽略操作。
-o discard
选项指定(可以是在 /etc/fstab
中或者使用 mount
命令),并实时运行而无需任何用户互动。在线忽略操作只忽略那些从已使用转换到可用状态的块。红帽企业版 Linux 6.2 以及之后到版本中的 ext4 文件系统以及还没企业版 Linux 6.4 以及之后版本中的 XFS 文件系统支持在线忽略操作。
7.1.4. 应用程序注意事项
ext4、XFS 和 GFS2 文件系统支持使用 fallocate(2)
glibc 调用有效预分配空间。在由于写入模式造成到大量碎片的文件中可导致读取性能极差。预写入可将磁盘空间标记为已分配给某个文件而无需在那个空间中写入任何数据。最将实际数据写入预写入到块中钱,读取操作将返回 0。
7.2. 文件系统性能侧写
latency-performance
- 用于典型延迟性能调整的服务器侧写。它可禁用 tuned 和 ktune 节能机制。
cpuspeed
模块改为performance
。每个设备的 I/O 提升程序改为deadline
。cpu_dma_latency
参数使用数值0
(最小延迟)注册管理电源服务质量以便尽可能减小延迟。 throughput-performance
- 用于典型吞吐性能调整的服务器侧写。如果系统没有企业级存储则建议使用这个侧写。它与
latency-performance
相同,只是:- 将
kernel.sched_min_granularity_ns
(调度程序最小优先占用时间间隔)设定为10
毫秒, - 将
kernel.sched_wakeup_granularity_ns
(调度程序唤醒间隔时间)设定为15
毫秒。 - 将
vm.dirty_ratio
(虚拟机脏数据比例)设定为 40%,并 - 启用够名超大页面。
enterprise-storage
- 建议最企业级服务器配置中使用这个侧写,其中包括电池备份控制程序缓存保护以及管理磁盘缓存。它与
吞吐量性能
类似,只是:- 将
readahead
值设定为4x
,同时 - 不使用
barrier=0
重新挂载的 root/boot 文件系统。
man tuned-adm
),或者《电源管理指南》,网址为 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。
7.3. 文件系统
7.3.1. Ext4 文件系统
注意
对于超大文件系统,mkfs.ext4
进程要花很长时间初始化文件系统中到所有内节点表。可使用 -E lazy_itable_init=1
选项延迟这个进程。如果使用这个选项,内核进程将在挂载文件系统后继续初始化该文件它。可使用 mount
命令的 -o init_itable=n
选项控制发生初始化到比例,其中执行这个后台初始化的时间约为 1/n。n
的默认值为 10
。
因为在重命名、截取或者重新写入某个现有文件后,有些应用程序不总是可以正确执行 fsync()
,在重命名和截取操作后,ext4 默认自动同步文件。这个行为与原有到 ext3 文件系统行为大致相同。但 fsync()
操作可能会很耗时,因此如果不需要这个自动行为,请在 mount
命令后使用 -o noauto_da_alloc
选项禁用它。这意味着该程序必须明确使用 fsync()
以保证数据一致。
默认情况下,日志注释 I/O 比普通 I/O 的优先权稍高。这个优先权可使用 mount
命令的 journal_ioprio=n
选项控制。默认值为 3
。有效值范围为 0-7,其中 0 时最高优先权 I/O。
mkfs
和调节选项详情请参考 mkfs.ext4(8)
和 mount(8)
man page,同时 kernel-doc 软件包的 Documentation/filesystems/ext4.txt
文件也有它到信息。
7.3.2. XFS 文件系统
mkfs
时的各种 b-tree 宽度,这样就可以改变不同子系统的伸缩特性。
7.3.2.1. XFS 到基本调节
mkfs.xfs
命令可自动使用正确到条单位和宽度自行配置以便与硬件对应。如果使用硬件 RAID 就需要手动进行配置。
inode64
挂载选项,除非是使用 NFS 和传统 32 位 NFS 客户端导出到文件系统需要对该文件系统到访问。
logbsize
选项。默认值为 MAX
(32 KB,日志条单位),同时最大值为 256 KB。建议最有大量修改的文件系统中使用 256 KB。
7.3.2.2. XFS 的高级调节
XFS 引入文件系统可以拥有的文件数随机限制。通常这个限制会高到根本无法达到的高度。如果您知道默认限制无法满足未来的需要,您可以使用 mkfs.xfs
命令增加可使用的内节点文件系统空间的百分比。如果您在创建文件系统后达到文件限制(通常在尝试创建文件或者目录时出现 ENOSPC 错误信息,即使有可用空间),您可以使用 xfs_growfs
命令调整该限制。
文件系统的目录块是固定的,且无法更改,除非最初使用 mkfs
格式化。最小目录块时文件系统块大小,默认为 MAX
(4 KB,文件系统块大小)。通常没有理由减少目录块大小。
与其他文件系统不同,XFS 可以最非共享对象中同时执行很多种类的分配和取消分配操作。扩展的分配或者取消分配可同时进行,即可在不同的分配组中同时进行。同样,内节点的分配和取消分配也可以同时进行,即同时进行的操作影响不同的分配组。
如果内节点中有可用空间,则 XFS 可以直接在内节点中保存小属性。如果该属性符合该内节点的要求,那么可以最不需要额外 I/O 检索独立属性块的情况下检索并修改它。内嵌属性和外部属性之间的性能差异可以简单归结为外部属性的数量级要低。
日志的大小时决定可持续元数据修改等级的主要因素。日志设备是循环使用的,因此最可以覆盖 tail 命令的结果钱,必须将日志中的所有修改写入磁盘的实际位置中。这可能会涉及大量寻求写入所有脏元数据的操作。默认配置会让日志大小与文件系统总体大小成比例,因此在大多数情况下不需要调整日志大小。
mkfs
命令可自动为 MD 或者 DM 设备完成此功能,但如果是硬件 RAID 则需要手动指定。设定这个功能目前可以避免在磁盘写入修改时所有可能的由于未同步 I/O 以及后续读取-修改-写入操作造成的日志 I/O。
logbsize
)的大小可增加写入日志的更改速度。默认日志缓存大小为 MAX
(32 KB,日志条单元),且最高可达 256 KB。通常该数值越大性能越快。但如果是在 fsync 负载较重的环境中,小日志缓存比使用大条单元的大缓存速度明显快很多。
delaylog
挂载选项也可以改进不变的元数据修改性能,方法是减少日志更改次数。它通过在将其写入日志前整合每个内存更改:频繁修改的元数据是阶段性写入日志,而不是每次修改时都写入。这个选项增加了跟踪脏元数据的内存用量,同时也增加了崩溃发生时可能损失的操作量,但可以将元数据修改速度和延展性提高一个等级。使用这个选项不会在使用 fsync
, fdatasync
或者 sync
时减少数据或者元数据完整性,从而保证可以将数据和元数据写入磁盘。
7.4. 集群
7.4.1. 全局文件系统 2
- 在可能的情况下使用
fallocate
预分配文件和目录以便优化分配过程并避免锁定资源页。 - 尽量减小多节点间共享的文件系统区域以便尽量减小跨节点缓存失效并提高性能。例如:如果多个节点挂载同一文件系统,但访问不同的子目录,则您可以通过将一个子目录移动到独立的文件系统中而获得更好的性能。
- 选择可选资源组大小和数量。这要依赖传统文件大小以及系统中的可用空间,并可能在多个节点同时尝试使用同一资源组时产生影响。资源组过多可延缓块分配,尽管已定位分配空间,而资源组过少也可在取消分配时造成锁竞争。通常最好是测试多种配置以便确定您负载的最佳方案。
- 根据集群节点的预期 I/O 模式和文件系统的性能要求选择存储硬件。
- 在可以减少查询时间的地方使用固态存储。
- 为您的负载创建适当大小的文件系统,并保证该文件系统不会超过容量的 80%。较小的文件系统的备份时间会根据比例缩短,且需要较少时间和内存用于文件系统检查,但如果相对负载过小,则很有可能生成高比例的碎片。
- 为频繁使用元数据的负载设定较大的日志,或者或者记录到日志中的数据正在使用中。虽然这样会使用更多内存,但它可以提高性能,因为在写入前有必要提供更多可用日志空间以便存储数据。
- 请保证 GFS2 节点中的时钟同步以避免联网程序问题。我们建议您使用 NTP(网络时间协议)。
- 除非文件或者目录访问次数对您的程序操作至关重要,请使用
noatime
和nodiratime
挂载选项。注意
红帽强烈推荐您在 GFS2 中使用noatime
选项。 - 如果您需要使用配额,请尝试减少配额同步传送的频率,或者使用模糊配额同步以便防止常规配额文件更新中的性能问题。
注意
模糊配额计算可允许用户和组稍微超过其配额限制。要尽量减少此类问题,GFS2 会在用户或者组接近其配额限制时动态减少同步周期。
第 8 章 联网
8.1. 网络性能改进
接收数据包操控(RPS)
rx
队列使其接收在几个 CPU 之间发布的 softirq
负载。这样可以帮助防止单一 NIC 硬件队列中的网络流量瓶颈。
/sys/class/net/ethX/queues/rx-N/rps_cpus
中指定目标 CPU 名称,使用 NIC 的对映设备名称(例如 eth1
, eth2
)替换 ethX,使用指定的 NIC 接受队列替换 rx-N
。这样可让在该文件中指定的 CPU 处理 ethX
中 rx-N
队列中的数据。指定 CPU 时,请注意该队列的缓存亲和力 [4]。
接收流程操控
/proc/sys/net/core/rps_sock_flow_entries
- 这个参数控制内核可以操控的任意指定 CPU 可控制的最多栈/流程数。这是一个系统参数,有限共享。
/sys/class/net/ethX/queues/rx-N/rps_flow_cnt
- 这个参数控制可操控某个 NIC(
ethX
)中指定接受队列(rx-N
)的最大栈/流程数。注:所有 NIC 中这个参数的各个队列值之和应等于或者小于/proc/sys/net/core/rps_sock_flow_entries
。
TCP-thin 流的 getsockopt 支持
getsockopt
调用改进为支持两个附加选项:
- TCP_THIN_DUPACK
- 这个布尔值在 thin stream 的一个 duupACK 后启用动态重新传输。
- TCP_THIN_LINEAR_TIMEOUTS
- 这个布尔值为 thin stream 线性超时启用动态起动。
file:///usr/share/doc/kernel-doc-version/Documentation/networking/ip-sysctl.txt
。有关 thin-stream 的详情请参考 file:///usr/share/doc/kernel-doc-version/Documentation/networking/tcp-thin.txt
。
传输代理服务器(TProxy)支持
file:///usr/share/doc/kernel-doc-version/Documentation/networking/tproxy.txt
。
8.2. 优化的网络设置
- netstat
- 这是一个命令行程序可以输出网络连接、路由表、接口统计、伪连接以及多播成员。它可在
/proc/net/
文件系统中查询关于联网子系统的信息。这些文件包括:/proc/net/dev
(设备信息)/proc/net/tcp
(TCP 插槽信息)/proc/net/unix
(Unix 域插槽信息)
有关netstat
及其在/proc/net/
中的参考文件的详情请参考netstat
man page:man netstat
- dropwatch
- 监控内核丢失的数据包的监视器工具。有关详情请参考 A monitoring utility that monitors packets dropped by the kernel. For more information, refer to the
dropwatch
man page:man dropwatch
- ip
- 管理和监控路由、设备、策略路由及通道的工具。有关详情请参考
ip
man page:man ip
- ethtool
- 显示和更改 NIC 设置的工具。有关详情请参考
ethtool
man page:man ethtool
- /proc/net/snmp
- 显示 IP、ICMP、TCP 以及 UDP 根据
snmp
代理管理信息所需 ASCII 数据的文件。它还显示实时 UDP-lite 统计数据。
/proc/net/snmp
中增加 UDP 输入错误表示当网络栈尝试将新帧排入程序插槽时,一个或者多个插槽接受队列已满。
插槽接收缓存大小
sk_stream_wait_memory.stp
认为该插槽队列的排放速度过慢,那么您可以增大该程序插槽队列深度。要做到这一点,请增大插槽接收缓存,方法是配置以下值之一:
- rmem_default
- 控制插槽使用的接收缓存默认大小的内核参数。要配置此参数,请运行以下命令:
sysctl -w net.core.rmem_default=N
使用所需缓存大小以字节为单位替换N
。要确定这个内核参数值请查看/proc/sys/net/core/rmem_default
。请记住rmem_default
值不得大于rmem_max
);如果需要请增大rmem_max
值。 - SO_RCVBUF
- 控制插槽接收缓存最大值的插槽选项,单位为字节。有关
SO_RCVBUF
的详情请参考其 man page:man 7 socket
。要配置SO_RCVBUF
,请使用setsockopt
工具,您可以使用getsockopt
查询当前SO_RCVBUF
值。有关这两个工具的详情请参考setsockopt
man page:man setsockopt
。
8.3. 数据包接收概述
图 8.1. 网络接收路径图表
- 硬件接收:网卡(NIC)接收传送的帧。根据其驱动程序配置,NIC 可将帧传送到内部硬件缓冲内存或者指定的环缓存。
- Hard IRQ:NIC 通过中断 CPU 插入网络帧。这样可让 NIC 驱动程序意识到该中断并调度 soft IRQ 操作。
- Soft IRQ:这个阶段采用实际接收进程,并在
softirq
环境中运行。就是说这个阶段会预先清空所有在指定 CPU 中运行的程序,但仍允许插入 hard IRQ。在这个环境中(与 hard IRQ 在同一 CPU 中运行,以便尽量减少锁定消耗),该内核会删除 NIC 硬件缓存以及它通过网络栈的进程中的帧。从那里开始,可将帧转发、忽略或者传递给目标侦听插槽。传递给插槽后,该帧就会被附加到拥有该插槽的程序中。这个过程会以互动方式进行直到 NIC 硬件缓存超出帧外,或者直到达到设备加权(dev_weight
)。有关设备加权的详情请参考 第 8.4.1 节 “NIC 硬件缓冲”。 - 程序接收:程序接受帧并使用标准 POSIX 调用(
read
,recv
,recvfrom
)从任意拥有的插槽中退出队列。此时从网络中接收到的数据不再存在于网络栈中。
CPU/缓存亲和性
8.4. 解决常见队列/帧丢失问题
8.4.1. NIC 硬件缓冲
softirq
排干,通过中断肯定 NIC。要询问这个队列的状态,请使用以下命令:
ethtool -S ethX
ethX
。这样会显示在 ethX
中已丢失的帧数。丢帧经常是因为该队列超过保存那些帧的缓冲空间所致。
- 输入流量
- 您可以通过放缓下行输入流量放置队列超限运转。方法是过滤、减少联合多播组数、降低广播流量等等。
- 队列长度
- 另外,您也可以增加队列长度。这包括在指定队列中将缓冲数增加到该驱动程序最多可以承担的数量。方法是编辑
ethX
的rx
/tx
环参数,命令为:ethtool --set-ring ethX
在前面所说的命令中附加恰当的rx
/tx
值。详情请参考man ethtool
。 - 设备加权
- 您还可以增加排空队列的速度。方法是相应调整 NIC 的设备加权。这个属性指的是
softirq
上下文必须产生 CPU 并重新调度其本身前 NIC 可以接收的最多帧数。它由/proc/sys/net/core/dev_weight
变量控制。
8.4.2. 插槽队列
softirq
上下文的网络栈填充。然后程序通过调用清空其对应插槽的队列以便进行 read
、recvfrom
等等。
netstat
程序。Recv-Q
列显示队列大小。一般来说对插槽队列中的超限运转的处理与对 NIC 硬件缓冲超限运转的处理相同(例如:第 8.4.1 节 “NIC 硬件缓冲”):
- 输入流量
- 第一个方法是延缓输入流量,方法为填充队列配置速度。具体步骤可以是过滤帧或者抢先丢掉它们。您还可以通过降低 NIC 的设备加权[6]延缓输入流量。
- 队列深度
- 程序调用频率
- 尽可能优化程序以便更频繁地执行调用。这包括修改或者重新配置网络程序以便执行更频繁的 POSIX 调用(比如
recv
、read
)。反过来,这也可以让程序更快地排空队列。
8.5. 多播注意事项
softirq
上下文中进行。
softirq
上下文的执行时间。在多播组中添加侦听程序意味着内核必须为那个组接收的每个帧生成额外的副本。
softirq
上下文执行时间导致在网卡和插槽多列中掉帧。增加 softirq
运行时会导致降低程序在高负载系统中运行的机会,那样的话多播帧丢失的比例会随着侦听高容量多部组程序是的增加而增大。
附录 A. 修订记录
修订历史 | |||||
---|---|---|---|---|---|
修订 4.0-22.2.400 | 2013-10-31 | Rüdiger Landmann | |||
| |||||
修订 4.0-22.2 | Mon July 1 2013 | Wei Lliu | |||
| |||||
修订 4.0-22.1 | Thu Apr 18 2013 | Chester Cheng | |||
| |||||
修订 4.0-22 | Fri Feb 15 2013 | Laura Bailey | |||
| |||||
修订 4.0-19 | Wed Jan 16 2013 | Laura Bailey | |||
| |||||
修订 4.0-18 | Tue Nov 27 2012 | Laura Bailey | |||
| |||||
修订 4.0-17 | Mon Nov 19 2012 | Laura Bailey | |||
| |||||
修订 4.0-16 | Thu Nov 08 2012 | Laura Bailey | |||
| |||||
修订 4.0-15 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
修订 4.0-13 | Wed Oct 17 2012 | Laura Bailey | |||
| |||||
修订 4.0-12 | Tue Oct 16 2012 | Laura Bailey | |||
| |||||
修订 4.0-9 | Tue Oct 9 2012 | Laura Bailey | |||
| |||||
修订 4.0-6 | Thu Oct 4 2012 | Laura Bailey | |||
| |||||
修订 4.0-3 | Tue Sep 18 2012 | Laura Bailey | |||
| |||||
修订 4.0-2 | Mon Sep 10 2012 | Laura Bailey | |||
| |||||
修订 3.0-15 | Thursday March 22 2012 | Laura Bailey | |||
| |||||
修订 3.0-10 | Friday March 02 2012 | Laura Bailey | |||
| |||||
修订 3.0-8 | Thursday February 02 2012 | Laura Bailey | |||
| |||||
修订 3.0-5 | Tuesday January 17 2012 | Laura Bailey | |||
| |||||
修订 3.0-3 | Wednesday January 11 2012 | Laura Bailey | |||
| |||||
修订 1.0-0 | Friday December 02 2011 | Laura Bailey | |||
|