大师之作,功力深厚
这篇书评可能有关键情节透露
1.brendan gregg 将是我能记住的有限的几个国外技术大师之一。 2.如何分析一个系统,本书给出了很多方法。 3.还包含很多工具,特别是dtrace、iostat、sar、netstat等各种*stat命令。 4.从系统各个维度,cpu、内存、磁盘、网络io等方面利用工具和方法进行了针对性的分析。所以本书结构非常清晰。 5.不过这本书是2015年的,在2016年之后,容器技术大火,这本书涉及其实不多。而且容器下很多工具都失效了,且展示的是容器的数据还是宿主机的数据呢?这个不一定。还好2022年已经出版了第二版,应该会弥补这些遗憾吧?所以第一版看的人就会很少了。
————————————————————————————————————————————
《性能之巅:洞悉系统、企业与云计算》
作者:Brendan Gregg(布兰登·格雷格)
1.5 性能是充满挑战的
bug 的出现总是伴随着错误信息,错误信息通常容易解读,进而你就明白错误为什么会出现了
1.5.2 系统是复杂的
性能常常是主观性的
1.5.3 可能有多个问题并存
!一般情况下,成熟的软件,即便是那些被认为拥有高性能的软件,也会有不少已知的但仍未被修复的性能问题
真正的任务不是寻找问题,而是辨别问题或者说是辨别哪些问题是最重要的
1.6 延时
高延时会令人沮丧,客户可能会选择到别处开展业务
1.7 动态跟踪
动态跟踪则像是手电筒,你可以指哪儿亮哪儿
1.9.1 缓慢的磁盘
在/proc 目录里检查磁盘错误数,
一个同事推测可能是文件系统碎片,碎片预计会在文件系统空间使用接近100%时出现
2.3.4 调整的影响
CPU 可以压缩数据来降低内存的使用
性能调整发生在越靠近工作执行的地方效果最显著
2.3.8 扩展性
在一定阶段,可以观察到扩展性是线性变化的
过了这一点后,吞吐量曲线随着资源争夺加剧偏离了线性扩展,内聚性导致完成的工作变少而且吞吐量也减小了。
2.3.11 使用率
100%忙碌不意味着100%的容量使用
2.3.12 饱和度
多出的工作无法处理,开始排队
2.3.14 缓存
,profiling通常是按照特定的时间间隔对系统的状态进行采样,然后对这些样本进行研究
缓存的级数和大小的选择按CPU 芯片内可用空间为准以达到最优的性能
“最近最常使用算法”(MRU)指的是一种缓存保留策略,决定什么样的数据会保留在缓存里:最近使用次数最多的数据
缓存的热、冷和温
2.4.1 资源分析
资源分析以对系统资源的分析为起点,涉及的系统资源有:CPU、内存、磁盘、网卡、总线以及之间的互联
2.4.2 工作负载分析
操作系统的“统计”工具:vmstat(1)、iostat(1)、mpstat(1)
术语“延时”所表达的和响应时间是一个意思
重试,从而增加了延时
2.5.1 街灯讹方法
用户选择熟悉的观测工具来分析性能,这些工具可能是从互联网上找到的,或者是用户随意选择的,仅仅想看看会有什么结果出现
这儿的光是最亮的
2.5.3 责怪他人讹方法
不去研究性能问题,用这种方法的人把问题推到了别人身上,当证明根本不是别人的问题时
2.5.5 问题陈述法
如果你管理一个技术支持的专业团队,Ad Hoc 核对清单能有效保证所有人都知道如何检查最糟糕的问题,能覆盖到所有显而易见的问题
2.5.9 USE 方法
需要定制工具(如动态跟踪)才能发现的问题可能永远不能被识别并解决。
当多个工具有相同的功能时,情况更糟,你要花额外的时间来了解各个工具的优缺点
对 于所有的资源,查看它的使用率、饱和度和错误
错误需要调查,因为它们会损害性能,如果故障模式是可恢复的,错误可能难以立即察觉。这包括操作失败重试,还有冗余设备池中的设备故障
USE 方法会将分析引导到一定数量的关键指标上
零拷贝”就减轻了内存和总线的负载。
任何程度的饱和都是问题(非零
2.5.11 向下挖掘分析
这些程序还可能提供了每日或每月的用户使用报告,这也是值得关注的
执行这类任务的工具包括strace(1)、truss(1)、perf 和DTrace。
2.5.15 基础线统计
把当前的性能指标与之前的数值做比较,对分析问题常常有启发作用
2.5.16 静态性能调整
基础线统计包括大范围的系统观测并将数据进行保存以备将来参考
2.5.17 缓存调优
从应用程序到磁盘,应用程序和操作系统会部署多层的缓存来提高I/O 的性能
2.10.3 热图
这里散点图的解析度就有问题了,点和点重叠在一起难以分辨
高延时的异常值位于热图高处的块内,因为淡色表示I/O 较少(通常只有单个I/O)
第3章 操作系统
了解操作系统和它的内核对于系统性能分析是至关重要的。你会经常需要进行针对系统行为的开发和测试,如系统调用是如何执行的、CPU 是如何调度线程的、有限大小的内存是如何影响性能的,或者是文件系统是如何处理I/O 的,等等。这些行为需要你应用自己掌握的操作系统和内核知识
3.2.1 内核
。Linux 采用了动态tick,这样当系统空闲时,计数器例程(clock)不启动
jiffies 是Linux 的时间单元,与tick 类似
3.2.5 进程
。多线程让单一进程可以在多个CPU 上并发地执行
系统调用fork( )可以用写时拷贝(copy-on-write,COW)的策略来提高性能。这会添加原有地址空间的引用而非把所有内容都复制一遍
3.2.6 系统调用
mmap( ):这个系统调用通常用来把可执行文件和库以及内存映射文件映射到进程的地址空间。有时候会替代基于brk( )的malloc( )对进程的工作内存做分配,以减少系统调用的频率,提升性能(并不总是这样,内存映射管理会做一些权衡)
3.2.9 调度器
在Linux 里,术语swapping 用于指代paging。Linux 内核是不支持(老的)UNIX 风格的整体线程和进程的swapping 的
3.2.14 多处理器
基于块的偏移值可以随机访问,偏移值在块设备的头部以0 开始计数
3.2.15 抢占
CPU 可以通过CPU 交叉调用去请求其他CPU,或者所有CPU 去立即执行这类工作
抢占也可以使用交叉调用。
支持内核抢占让高优先级的用户级别的线程可以中断内核并执行
3.2.17 观测性
Linux 则是开发了控制组(control groups,cgroups)并将其整合进了2.6.24(2008年),还为此添加了各种控件,这些都记录在内核源码的Documentation/cgroups 中
3.3.1 UNIX
:Linux 一直在增加系统调用,Solaris 一直在减少系统调用。
3.3.2 基于Solaris
MPSS:多种页面尺寸支持让OS 可以使用处理器提供的不同尺寸的内存页,包括大页(或者巨型页),以提升内存操作的效率
4.1.2 跟踪
DTrace 和SystemTap 都是可编程环境,在它们之上可以构建系统级别的跟踪工具,在前面的列表中已经包括了一些
4.1.3 剖析
剖析工具,或者说剖析器(profiler),有时会稍微改变这一频率,避免采样与目标活动同一步调,因为这样可能会导致多算或少算。
4.3.1 静态和动态跟踪
DTrace 同时支持静态跟踪和动态跟踪
静态探针有文档完备且稳定的接口,动态探针提供所需的近乎无限的可观测性。
4.3.5 D 语言
D 语言与awk 类似,能用作单行命令也能写脚本(这一点与awk 一样)
4.3.12 文档和资源
介绍中,这本书是由Sun Microsystems 公司编写的,在网上可以免费获取
4.4 SystemTap
SystemTap 采用其他的内核框架做源:静态探针用tracepoints、动态探针用kprobes、用户级别的探针用uprobes。
4.4.1 探针
它们也会导致内核崩溃
4.4.4 示例
这回用SystemTap 来凸显DTrace 的局限性
4.4.5 开销
终极的区别是:SystemTap 可以直接访问统计数值,如s[k],而DTrace 的聚合变量的打印只能依靠自己或者用聚合函数来处理
4.4.6 文档和资源
Linux 性能事件(Linux Performance Events,LPE),简称为perf
4.6 观测工具的观测
perf 可以执行静态和动态跟踪(基于tracepoint、kprobe 和uprobe),还有profiling
5.2.5 并发和并行
Node.js 采用的就是这一方法。这种方法提供了并发性但可能用的是单个的线程或进程,最终会成为一个制约扩展性的瓶颈,因为它只利用了一颗CPU
线程自旋、等待也是对CPU 资源的浪费
读写锁:读/写锁通过允许多个读者或者只允许一个写者而没有读者
mutex 锁可以用库或内核实现成为自适应mutex 锁(adaptive mutex lock):这是自旋锁和mutex 锁的混合,如果锁持有者当前正运行在另一个CPU 上,线程会自旋,如果不是,线程会阻塞(或者自旋的时间阈值到了)
在2009年应用到了Linux 上,称为自适应自旋mutex(adaptive spinning mutex)[1]
哈希表里有四个项目,称为桶(bucket),每个桶都有自己的锁
5.2.6 非阻塞I/O
为了最大程度的并行,哈希表的桶的数目应该大于或等于CPU 的数目
把它作为2 的幂次方长度的锁列表的索引。这种简单的算法很迅速,数据结构能很快定位
往哈希锁里填充无用字节来解决的,这样在内存中缓存行里只会有一个锁存在
5.2.7 处理器绑定
,设计的本意就是让应用程序线程依附在同一颗CPU 上(CPU 亲和性,CPU affinity)
5.3 编程语言
编译是在运行之前将程序生成机器指令,保存在二进制可执行文件里
5.3.3 虚拟机
虚拟机一般是语言类型里最难观测的
性能分析通常靠的是语言虚拟机提供的工具集(一些虚拟机提供DTrace 探针)和第三方的工具
5.4 方法和分析
,Java虚拟机提供了许多可调参数来设置GC 类型、GC 的线程数、堆尺寸的最大值、目标堆的空闲率,等等。
5.4.1 线程状态分析
内核的schedstat 功能会跟踪可运行的线程,并将信息显示在/proc/*/schedstat 中
pidstat -d 可以判断一个进程是在执行磁盘I/O,还是睡眠
如果启用了延时核算和I/O 核算的特性,可以得到块I/O 所阻塞的时间,用iotop(1)也能观察到
如果应用程序困于睡眠状态很长时间(秒级别),你可以试试pstack(1)来调查原因
执行pstack(1)时可能会让目标有短暂停顿,所以应小心使用。
5.4.3 系统调用分析
strace(1)的一个特性在输出里可以看出来,它将系统调用的内容翻译成了可以阅读的形式。这对于判断ioctl()的使用尤其有用
运行时间增加了73 倍,吞吐率也有相同的下降
6.2 模型
单个处理器内共有四个核和八个硬件线程
6.3 概念
这种选择运行CPU 的方法被称为CPU 关联
请求CPU 降低频率以节约能耗。
6.3.2 指令
如果它们大部分时间是停滞等待内存访问,那更快的执行实际上并不能提高CPU 指令的执行效能或者负载吞吐量。
6.3.5 CPI,IPC
每指令周期数(CPI)是一个很重要的高级指标
每周期指令数(instructions per cycle,IPC),即CPI 的倒数
内核支持了优先级、抢占和分时共享。这些概念加起来让内核决定了什么线程的优先级更高,并保证它优先运行。
CPU 使用率通常被分成内核时间和用户时间两个指标
6.3.7 用户时间/内核时间
计算密集的应用程序几乎会把大量的时间用在用户态代码上,用户/内核时间之比接近99/1
一个进行网络I/O 的Web 服务器的用户/内核时间比大约为70/30。
6.3.11 多进程,多线程
线程B 运行的同时,一个高优先级线程,C,却被一个低优先级的线程B 阻塞了。这就是优先级反转
6.4.1 硬件
使用温度传感器作为单个核动态超频的输入(包括Intel 睿频加速技术)
CPU 缓存经常使用组关联方法,这是在全关联(开销过大)与直接映射(命中过低)中间找一个平衡点
对于多处理器架构,处理器通过共享系统总线或者专用互联连接起来
互联通常设计为高带宽,这样它们不会成为系统的瓶颈
6.4.2 软件
支撑CPU 的内核软件包括了调度器、调度器类和空闲线程
原来的UNIX 优先级范围(第6 版)把较小数字用在高优先级线程上,Linux 继承了这一点。
空闲线程是一个特例,以最低优先级运行
6.5 方法
NUMA 系统上的性能可以通过使内核感知NUMA 而得到极大提高,因为这样它可以做出更好的调度和内存分配决定。它可以自动检测并创建本地化的CPU 和内存资源组,并按照反映NUMA 架构的拓扑结构组织起来。这种结构可以预估任意的内存访问开销
想法:NUMA(Non-Uniform Memory Access)非均匀内存访问架构是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的
6.5.3 负载特征归纳
一个I/O 密集型的负载,大约每秒执行100K 次的系统调用,以及高频率的自愿上下文切换。
6.5.8 优先级调优
UNIX 一直都提供nice()系统调用,通过设置nice 值以调整进程优先级
6.6.1 uptime
最后三个数字是1、5 和15 分钟内的平均负载。通过比较这三个数字,你可以判断负载在15 分钟内(或者其他时间段)是在上升、下降,还是平稳
平均负载表示了对CPU 资源的需求,通过汇总正在运行的线程数(使用率)和正在排队等待运行的线程数(饱和度)计算得出
平均负载大于CPU 数量表示CPU 不足以服务线程,有些线程在等待。
一个有64 颗CPU 的系统的平均负载为128。这意味着平均每个CPU上有一个线程在运行,还有一个线程在等待
Linux 目前把在不可中断状态执行磁盘I/O 的任务也计入了平均负载
6.6.6 top
top(1)自身的CPU 用量有可能会变得很大
open()、read()、close()——以及当遍历/proc 里许多进程项目时它们的开销
由于top(1)对/proc 拍快照,它会错过一些寿命较短的进程,这些进程在拍快照之前已经退出
6.6.10 DTrace
过多的CPU 交叉调用会由于CPU 的消耗而降低性能
6.6.12 perf
这些取样计数以百分数输出,展示了CPU时间的去处
6.6.13 cpustat
cpustat(1M)为每个CPU 生成一行输出。这个输出可以加工(例如使用awk)得出CPI。
6.6.15 可视化
这条线索我们发现了一个锁问题,这个问题可导致整个数据库一次被阻塞数百毫秒。
如果我们通过折线图查看这份数据,一秒内CPU 使用率的下降可能会被当成负载的波动而被忽视,从而失去了调查的机会。
被称为“火焰图”的原因是它表示了CPU上什么跑得最火
6.8.1 编译器选项
nice(1)命令可以用来调整进程优先级。正nice 值调低优先级,而负值调高优先级,后者只能由超级用户设置。范围为-20~+19
使用renice(1)更改一个已经在运行进程的优先级。
6.8.4 进程绑定
这和进程绑定类似,可以提高性能,但还可以通过使得CPU 组独占——不允许其他进程使用——而进一步提高性能
6.8.6 资源控制
Linux 上的控制组(cgroups),通过进程或者进程组控制了资源用量。
CFS 调度器允许对每段时间内分配的CPU 微秒数周期
。CPU 带宽是一个相对较新的概念,于2012年加入(3.2 版)。
6.9 练习
禁用Intel 睿频,这样CPU 基准测试就会运行在一致的时钟频率上
第7章 内存
系统也有可能终止内存占用量最多的进程。
7.1 术语
虚拟内存不是真实的内存
。每个进程和内核都有对应的虚拟地址空间。
7.2.2 换页
与交换出整个程序不同,由于页的尺寸相对较小(如4KB),换页是精确管理和释放主存的手段
文件系统换页由读写位于内存中的映射文件页引发。对于使用文件内存映射(mmap())的应用程序和使用了页缓存的文件系统(必须使用,见第8章),这是正常的行为。这也被称作“好的”换页
如果文件系统页没有修改过(“干净的”),因为磁盘已经存在一份副本,页面换出仅仅释放这些内存以便立即重用
被称为匿名是由于它在操作系统中缺乏有名字的地址(例如,没有文件系统路径)
Linux 用交换(swapping)来命名这种类型的换页。
7.2.3 按需换页
匿名换页拖累性能,因此被称为“坏的”换页[
性能在没有匿名换页(或者交换)的情况下处于最佳状态
如果这个映射可以由内存中其他的页满足,就这被称作轻微缺页。它可能在进程内存增长过程中发生,从可用内存中映射一个新的页
需要访问存储设备的缺页,例如访问未缓存映射到内存的文件(未在图中显示),被称作严重缺页
如果需要磁盘读写,就是严重缺页,否则就是轻微缺页。
7.2.4 过度提交
Linux 中可以用可调参数配置过度提交
交换出一个进程,要求进程的所有私有数据必须被写入交换设备,包括线程结构和进程堆(匿名数据)
至于要将哪个进程交换回来,内核会考虑线程优先级、磁盘等待时间以及进程的大小
7.2.6 文件系统缓存占用
Linux 中交换这个术语特指换页到交换文件或者设备(匿名换页)。
。初级用户有时看到启动后可用内存减少到接近零,可能会感到苦恼,但这不会对应用程序造成影响,因为在应用程序需要的时候,内核应该能够很快从文件系统缓存中释放内存。
7.2.8 分配器
对内存的需求超过了主存的情况被称作主存饱和。
这时操作系统会使用换页、交换或者在Linux 中用OOM 终结者(后面的章节会介绍)来释放内存。以上任一操作都标志着主存饱和。
注意某些时候当前系统中可用的虚拟内存称为可用交换。
用户态库或者内核程序向程序员提供简单的内存使用接口(例如malloc()、free())。
分配器可以利用包括线程级别对象缓存在内的技术以提高性能,但是如果分配变碎并且损耗变高,它们也会损害性能
7.3 架构
因此32 位的地址空间放不下需要4GB 以上(通常这个数字还要小一点)的应用程序
当一个数据类型在更长的字长下有未使用的位时,可能会浪费一小部分内存
内存硬件包括主存、总线、CPU 缓存和MMU(内存管理单元)
由于每个比特仅由两个逻辑零件组成:一个电容和一个晶体管,DRAM能提供高容量的存储。其中的电容需要定期更新以保持其电荷
7.3.1 硬件
主内存的访问时间可以用CAS(列地址控制器)计量:从发送需要读取的地址(列)给一个内存模块,到数据可以被读取之间的时间
通过共享系统总线,每个CPU 访问所有内存都有均匀的访存延时。如果上面运行的是单个操作系统实例并可以在所有处理器上统一运行时,又称为对称多处理器架构(SMP)
非均匀访存模型(NUMA)系统,其中使用的一个CPU 互联是内存架构的一部分。在这种架构中,对主存的访问时间随着相对CPU 的位置不同而变化。
CPU 1通过CPU 2 以及CPU 互联(两跳)对DRAM B 发起I/O 操作,这被称为远程内存而访问延时更高。
共享系统总线:单个或多个处理器,通过一个共享的系统总线、一个内存桥控制器以及内存总线
术语双倍数据速率指在时钟信号的上升沿和下降沿都传输数据(也称作双泵)
系统架构可能支持并行使用多个内存总线来增加带宽。
,Intel Core i7 处理器支持最大四通道DDR3-1600,其最大内存带宽为51.2GB/s。
内存管理单元(MMU)负责虚拟到物理地址的转换
它按页做转换,而页内的偏移量则直接映射
Linux 支持超大页,为特别的大页尺寸,如2MB,留出部分物理内存。
7.3.2 软件
Linux提供一个调节方法:交换倾向,一个0~100 范围的参数(默认值为60)。这里较高的值更倾向于用换页释放内存,而较低的值倾向于回收页缓存(类似基于Solaris 系统的行为)
如果使用交换,这很可能会由于换页首先成为一个性能问题,同时这也是在线排错问题的机会
不存在交换的话,就不存在换页的宽限期。结果是应用程序遇到“Out of memory”错误,或者OOM 终结者结束这个应用程序
术语伙伴指找到相邻的空闲内存页以被同时分配
页扫描仅按需启动。通常平衡的系统不会经常做页扫描并且仅以短期爆发方式扫描
页面换出守护进程被称作kswapd(),它扫描非活动和活动内存的LRU(最近最少被使用)页列表以释放页面
7.3.3 进程地址空间
free()不会将内存还给操作系统,相反的,会保留它们以备将来分配
进程缩减内存的方法如下。
分配器会尽可能合并未使用的区域,因此大块的分配可使它们提高效率
内核slab 分配器管理特定大小的对象缓存,使它们能被快速地回收利用,并且避免页分配开销
Linux 内核SLUB 分配器基于slab 分配器并且为解决多个问题而设计,特别是slab 分配器的复杂性
7.4.1 工具法
OOM 终结者:仅对Linux 有效,这些事件可以在系统日志/var/log/messages,或者从dmesg(1)中找到。搜索“Out of memory”。
7.4.3 使用特征归纳
一个系统可能会报告只有10MB 的可用内存,但事实上它有10GB 的文件系统缓存在,需要时能立刻被应用程序回收利用
7.5.2 sar
这些信息涵盖了内存使用、页面换出守护进程活动和大页面的使用
7.5.5 ps
● %MEM:主存使用(物理内存、RSS)占总内存的百分比。● RSS:常驻集合大小(KB)。● VSZ:虚拟内存大小(KB)
7.5.11 其他工具
valgrind:一个包括memcheck 在内的性能分析套件,它是一个内存使用分析的封装程序,可用于发现泄漏。它能造成严重的系统开销,它的文档手册指出可能引起目标系统慢20 至30 倍
7.6 调优
最重要的内存调优是保证应用程序保留在主存中,并且避免换页和交换经常发生
内存调优:内核可调参数、配置大页面、分配器和资源控制
7.6.2 多个页面大小
更大的页面能通过提高TLB 缓存命中率(增加它的覆盖范围)来提升内存I/O 性能
7.6.4 资源控制
基础的资源控制,包括设置主存限制和虚拟内存限制,可以用ulimit(1)实现。
第8章 文件系统
文件系统性能比磁盘性能更为重要
8.3.3 随机与顺序I/O
一连串的文件系统逻辑I/O,按照每个I/O 的文件偏移量,可以分为随机I/O 与顺序I/O。
当文件系统未能达成这个目标时,文件的摆放变得杂乱无章,顺序的逻辑I/O 被分解成随机的物理I/O,这种情况我们称为碎片化
8.3.4 预取
文件系统一般允许对预取参数进行调优。
8.3.5 预读
它的原理是,当数据写入主存后,就认为写入已经结束并返回,之后再异步地把数据刷入磁盘
文件系统写入“脏”数据的过程称为刷新(flushing)
为了平衡系统对于速度和可靠性的需求,文件系统默认采用写回缓存策略,但同时也提供一个同步写的选项绕过这个机制,把数据直接写在磁盘上
8.3.13 操作并非不平等
即便应用程序只执行了一个字节的写操作,磁盘也承担了多次读(共128KB)和更多的写(超过128KB)操作
有些操作可能从文件系统缓存中返回,直逼主存的速度;而其他可能从磁盘返回,慢上好几个数量级
8.4.3 文件系统缓存
有三种缓存是文件系统里通用的:旧式缓冲区高速缓存、页缓存和DNLC
目录名查找缓存(DNLC,Directory Name Lookup Cache)记录了目录项到vnode 的映射关系
8.4.4 文件系统特性
目录项缓存(Dcache)记录了从目录项(struct dentry)到VFS inode 的映射关系
8.4.5 文件系统种类
fsck(文件系统检查,file system check)
ZFS 把文件系统、卷管器以及许多企业级特性整合在一起:池存储、日志、写时复制(COW)、自适应替换缓存(ARC)、大容量支持、变长块、动态条带、多预取流、快照、克隆、压缩、擦洗和128 位校验和
8.4.6 卷和池
逻辑卷管理器(Logical V olume M anager,LVM)
8.6.10 sar
● dentunusd:目录项缓存未用计数(可用项)。● file-nr:使用中的文件描述符个数。● inode-nr:使用中的inode 个数
9.3.10 饱和度
这就把CPU 空闲时间划分成无所事事的真正空闲时间,以及阻塞在磁盘I/O 上的时间。较高的每CPU I/O 等待时间表示磁盘可能是瓶颈所在,导致CPU 等待而空闲
9.4.1 磁盘类型
硬盘驱动器(hard disk drive,HDD)
由于这种写入的开销,闪存的读/写性能不对称:读得快写得慢
9.4.2 接口
后来的SCSI 版本使用更宽的数据总线和更多针脚的连接器,最多达80 针,带宽达到了数百兆。
并行SCSI 由于采用了共享总线,会因总线竞争而导致性能问题
并行ATA(又名IDE)接口标准进化成为了串行ATA 接口
SATA 在消费级桌面和笔记本电脑上大量使用
9.4.4 操作系统磁盘I/O 栈
NAS 通过现有网络暴露给系统,支持的网络协议有NFS、SMB/CIFS 或者iSCSI,通常由名为NAS 设备的专用系统提供
noop 是CPU 领域里空操作的称法
9.8 调优
Linux 中的ionice(1)命令可以设置一个进程的I/O 调度级别和优先级
第10章 网络
帧:一个物理网络级的报文,例如以太网帧
10GbE 是带宽10Gb/s的以太网。
10.3.4 包长度
包的长度通常受限于网络接口的最大传输单元(MTU)长度,许多以太网中它设置为1500B
会阻止有用的“不能分段”报文到达发送方,并且一旦包长度超过1500 将导致网络包被静默地丢弃。为避免这个问题,许多系统坚持使用默认的1500 MTU
10.3.7 连接积压队列
测量因积压队列导致的丢包是一种衡量网络连接饱和度的方法
10.3.10 本地连接
传输控制协议(TCP)是一个常用的用于建立可靠网络连接的互联网标准。TCP 由[RFC 793]以及之后的增补定义。
10.4.1 协议
Reno:三次重复确认触发器,即阻塞窗口减半、慢启动阈值减半、快速重传输和快速恢复。
Tahoe:三次重复确认触发器,即快速重传输、慢启动阈值减半、阻塞窗口设置为最大报文段长度(MSS)和慢启动状态
10.5.1 工具法
netstat -s:查找高流量的重新传输和乱序数据包
netstat -i:检查接口的错误计数器(特定的计数器依OS 版本而不同)
10.5.3 工作负载特征归纳
以下用于分析网络工作负载特征的基础属性,能共同提供网络性能需求的近似值。● 网络接口吞吐量:RX 和TX,B/s。● 网络接口IOPS:RX 和TX,帧每秒。● TCP 连接率:主动和被动,每秒连接数。
10.5.6 数据包嗅探
数据包嗅探(也称为数据包捕捉)从网络捕捉数据包,因而能以检查每一个数据包的方式检查协议报文头和数据
就CPU 和存储系统开销而言,它的代价高昂,对于观察性分析这可能是最后手段
10.5.7 TCP 分析
当一个服务器频繁地用相同的源和目的IP 地址连接另一个服务器的同一个目标端口时,最后一个行为可能成为一个可扩展性问题。每个连接唯一的区别要素是客户端的源端口——一个短暂的端口
Linux 内核试图快速地重利用或者回收连接(这通常管用)
10.5.8 挖掘分析
采用动态跟踪审查内核网络栈函数的执行
10.6.1 netstat
接收(RX-)和传输(TX-)
10.6.3 ifconfig
ifconfig(8)命令能手动设置网络接口。它也可以列出所有接口的当前配置。用它来检查系统、网络以及路由设置有助于静态性能调优
txqueuelen 是这个接口发送队列的长度。Man 手册介绍了这个数值的调优:
10.6.4 ip
Linux 的ip(8)命令能配置网络接口和路由,并且观测它们的状态和统计信息
10.6.7 ping
ping(8)命令发送ICMP echo 请求数据包测试网络连通性
10.6.9 pathchar
traceroute(8)命令发出一系列数据包实验性地探测到一个主机当前的路由。它的实现利用了递增每个数据包IP 协议的生存时间(TTL),从而导致网关顺序地发送ICMP 超时响应报文,向主机揭示自己的存在(如果防火墙没有拦截它们)
发送低优先级的数据包,它可能会显示出比其他应用程序协议更高的延时
pathchar 类似于traceroute(8),并且包括了每一跳间的带宽[4]。它的实现是利用了多次重复发送一系列不同长度的网络数据包然后统计分析它们
10.6.10 tcpdump
tcpdump(8)工具可以捕捉并检查网络数据包。它输出数据包信息到STDOUT,或者把数据包写入文件以供稍后的分析
过高的数据包速率导致了不能实时研究它们
每一行输出显示数据包时间(精度为毫秒)、它的源和目标IP 地址,以及TCP 报头值。研究它们能理解TCP 内部工作的细节,包括高级功能如何服务于你的工作负载
-n 选项用来禁用IP 地址解析为主机名。其他多种可用的选项包括打印冗长的细节(-v)、链路层报头(-e),以及十六进制地址转储(-x 或者-X)
10.6.11 snoop
把时间戳列改为显示数据包间的时间差(-ttt),或者自第一个数据包以来的时间(-ttttt)会更有帮助。
就CPU 成本和存储而言,捕捉数据包是昂贵的。在可能的情况下尽量短时间期使用tcpdump(8)以限制其对性能的影响
10.6.12 Wireshark
Wireshark 工具(过去称作Ethereal)提供了一个捕捉数据包和检查的图形化接口,并可以从tcpdump(8)或者snoop(1M)的转储文件中导入数据包[5]。有益的功能还包括识别网络接口以及与之相关的数据包,进而能分别研究它们,另外还能翻译数百种协议包头
10.6.16 其他工具
strace(1):跟踪套接字相关的系统调用并检查其使用的选项(注意strace(1)的系统开销较高)。● lsof(8):按进程ID 列出包括套接字细节在内的打开的文件。● ss(8):套接字统计信息。● nfsstat(8):NFS 服务器和客户机统计信息。
10.7 实验
iftop(8):按主机(嗅探)总结网络接口吞吐量。● /proc/net:包含许多网络统计信息文件。
对于Solaris,工具如下。● truss(1):跟踪套接字相关的系统调用并检查其使用的选项(注意truss(1)的系统开销较高)。● pfiles(1):按进程检查使用中的套接字,包括选项和套接字缓存大小。● routeadm(1M):检查路由和IP 转发的状态。● nfsstat(1M):NFS 服务器和客户机的统计信息。● kstat:提供更多源自网络栈和网络设备驱动(它们中的许多在源代码以外没有文档)的统计信息。
iperf 是一款测试最大TCP 和UDP 吞吐量的开源工具
10.8.1 Linux
所有协议类型读(rmem_max)和写(wmem_max)的最大套接字缓冲大小可以这样设置
数值的单位是字节。为支持全速率的10GbE 连接,这可能需要设置到16MB 或更高。
10.8.2 Solaris
安全时tcp_tw_reuse 可调参数能重利用一个TIME-WAIT 会话。这使得两个主机间有更高的连接率,例如Web 服务器和数据库服务器之间,而且不会达到16b 的TIME-WAIT 会话临时端口极限。
tcp_tw_recycle 是另一个重利用TIME-WAIT 会话的方法,尽管没有tcp_tw_reuse安全。
10.8.3 配置
● 以太网巨型帧:如果网络基础架构支持巨型帧,由默认的MTU 1 500 增加到9 000 左右能提高网络吞吐性能。● 链路聚合:多个网络接口能组合并聚合带宽成为一个接口。这需要交换机支持并且配置以便正常工作。● 套接字选项:应用程序能用setsockopt()调优缓冲区大小。增加它(直到之前介绍的系统极限)以提高网络吞吐性能
11.1.3 容量规划
一个DoS 攻击可能看着似负载的增加,但却引发了高成本的服务器实例增加
11.2 OS 虚拟化
一个邻居可能在运行微型基准测试以评估云供应商,特意把所有的资源耗光以检测极限
可观测的程度视虚拟化的类型而定:OS 虚拟化或硬件虚拟化
相比硬件虚拟化技术,一个关键区别是仅有一个内核在运行
它有如下优势:
● 由于客户应用程序能直接向宿主内核发起系统调用,客户应用程序I/O 仅有一些甚至没有性能开销。
● 分配给客户的内存能完全用于客户应用程序——而没有来自OS 虚拟层或者其他访客内核的额外内核负担。
● 只有一个统一的文件系统缓存——没有宿主和访客的双重缓存。
● 所有的客户进程都可由宿主观测到,这样可以调试牵涉到它们之间的相互作用(包括资源竞争)的性能问题。
● CPU 是真实的CPU,自适应互斥锁的假设仍然有效。
11.2.1 系统开销
而劣势为:
● 任何kernel panic 会影响到所有客户。
● 客户不能运行不同的内核版本。
11.2.2 资源控制
对于文件系统访问,可以设置分区挂载回环文件系统,它们本身挂载于宿主的文件系统
对于大部分时间CPU 闲置的系统,这允许其他访客利用CPU,特别为了服务那些瞬间剧增的需求
11.2.3 可观测性
mpstat(1M)也是全系统的:
11.3 硬件虚拟化
两种类型的虚拟机管理程序
虚拟机管理程序的管理可以由一个特权访客机实现
宿主OS 有管理虚拟机管理程序和启动新访客机的特权。这类虚拟机管理程序由宿主内核调度器调度
KVM 是2 型虚拟机管理程序,以一个内核模块执行
11.3.1 系统开销
操作系统与MMU 协作创建由虚拟内存到物理内存映射的页面,将它们缓存于TLB 以提高性能
由访客机虚拟到宿主物理的映射可以在TLB 缓存,因此后续的访问能以正常速度运行——不需要额外的翻译
现代的处理器支持MMU 虚拟化,因此存留于TLB 的映射能很快地仅在硬件中回收(页面遍历),而不需要调用虚拟机管理程序
支持的此种特性在Intel 中称为扩展页面表(EPT),而在AMD 中称为嵌套页面表(NPT)
12.1.3 基准测试之罪
快速核对清单,以及避免它们的方法。12.3 节将讨论如何执行基准测
来自京东读书 for iOS
导出于 2022-09-18 19:59:18