技术标签: 性能测试
引言
综合来讲,这是一本介绍方法论的书,作者通过概念、模型、观测、实验手段来进行问题的剖析。另外本书的涉及范围之广,从内存、CPU、文件系统、存储硬件、网络等各个方面。并且本书通常以一个实例入手,深入的介绍系统原理,特别是在一些重点细节上,往往有超出一般的认识和方法。
本书函盖范围太广,更适合作为工具书时常翻阅,所以在阅读过程中也关注自己当前需要的方面。
系统性能是对整个系统的研究,包括了所有的硬件组件和整个软件栈。所有数据路径上和软硬件上所发生的事情都包括在内,因为这些都有可能影响性能。
性能领域包括了以下的事情:
设置性能目标和建立性能模型
基于软件或硬件原型进行性能特征归纳
对开发代码进行性能分析(软件整合之前)
执行软件非回归性测试(软件发布前或发布后)
针对软件发布版本的基准测试
目标环境中的概念验证测试
生产环境部署的配置优化
监控生产环境中运行的软件
特定问题的性能分析
术语容量规划 ( capacity planning
) 指的是一系列事前行动。在设计阶段,包括通过研究开发软件的资源占用情况,来得知原有设计在多大程度上能满足目标需求。在部署后,包括监控资源的使用情况,这样问题在出现之前就能被预测。 !
资源分析指标:IOPS,吞吐量,使用率,饱和度
工作负载指标:吞吐量和延时。
性能分析必须量化问题的重要程度,有一个指标非常合适,就是延时(latency)。
动态跟踪技术把所有的软件变得可以监控,而且能用在真实的生产环境中。这项技术利用内存中的 CPU 指令并在这些指令之上动态构建检测数据。这样能从任何运行的软件中都可以获得定制话的性能统计数据,从而提供了远超系统的自带统计所能给予的观测性。
DTrace 对用户态和内核态的软件都提供了静态跟踪和动态跟踪,并且数据是实时产生的
扰动(perturbation)是会影响结果的,扰动包括定时执行的系统活动、系统的其他用户以及其他的工作负载。现代环境的另一个困难是系统很可能由若干个网络化的组件组成,都用于处理输入工作负载,包括负载平衡、Web 服务器、数据库服务器、应用程序服务器,以及存储系统。
在取得数据之前就把事情理论化是一个严重的错误。不理智的人扭曲事实来适应理论,而不是改变理论来适应事实。
面对一个性能不佳且复杂的系统环境时,首先需要知道的挑战就是从什么地方开始分析、收集什么样的数据,以及如何分析这些数据。
通用的性能分析方法
性能观测工具可以按照系统级别和进程级别来分类,多数的工具要么基于计数器要么基于跟踪:
进程级别:
一般来说,上述这些工具是从 /proc
文件系统里读取统计信息的
跟踪收集每一个事件的数据以供分析。跟踪框架一般默认是不启用的,因为跟踪捕获数据会有 CPU 开销,另外还需要不小的存储空间来存放数据。
系统级别:
进程级别:
性能调整离工作所执行的地方越近越好:最好在应用程序里,包括 Web 服务器、应用服务器、负载均衡器、文件服务器,等等。
设立性能目标能为你的性能分析工作指明方向,并帮助你选择要做的事情。没有清晰的目标,性能分析容易沦为随机的『钓鱼探险』。 常见目标:
应用程序性能技术:选择 I/O 尺寸、缓存、缓冲区、轮训(epoll)、并发和并行、非阻塞 I/O、处理器绑定
编程语言相关:编译语言使用编译器优化、解释语言一般不是首选、虚拟机、垃圾回收
街灯讹方法(奇葩的命名)
在熟悉的工具或流程中试错,比较盲目
Ad Hoc核对清单法
保证所有人知道如何检查最糟糕的问题,覆盖全面,但必须保持清单及时更新
诊断循环
假设--仪器检验--数据--假设
USE方法
本书重点方法,对于所有资源,查看它的使用率、饱和度、错误
了解操作系统和它的内核对于系统性能分析是至关重要的。你会经常需要进行针对系统行为的开发和测试,如系统调用是如何执行的、CPU 是如何调度线程的、有限大小的内存是如何影响性能的,或者是文件系统是如何处理 I/O 的。
这部分的内容本书主要介绍了基本的概念,最好还是结合《深入理解计算机系统》来弄懂,不然真的很容易一知半解,列举如下:
内核:内核执行、时钟、内核态
栈:用户栈和内核栈
中断和中断线程
中断优先级
进程:进程创建、进程生命周期、进程环境
系统调用
虚拟内存
内存管理
调度器
文件系统:VFS、I/O 栈
缓存(括号内为例子):应用程序缓存、服务器缓存(Apache 缓存)、缓存服务器(Redis)、数据库缓存(MySQL 缓冲区高速缓存)、目录缓存(DNLC)、文件元数据缓存(inode 缓存)、操作系统缓冲区高速缓存(segvn)、文件系统主缓存(ZFS ARC)、文件系统次缓存(ZFS L2ARC)、设备缓存(ZFS vdev)、块缓存(缓冲区高速缓存)、磁盘控制器缓存(RAID 卡缓存)、存储阵列缓存、磁盘内置缓存
网络
设备驱动
多处理器:CPU 交叉调用
抢占
资源管理
观测性
内核维护了各种统计数据,称为计数器,用于对事件计数。通常计数器实现为无符号的整型数,发生事件时递增。
系统级别的计数器有:
vmstat: 虚拟内存和物理内存的统计,系统级别
mpstat: 每个 CPU 的使用情况
iostat: 每个磁盘 I/O 的使用情况,由块设备接口报告
netstat: 网络接口的统计,TCP/IP 栈的统计,以及每个连接的一些统计信息
sar: 各种各样的统计,能归档历史数据
ps: 进程状态,显示进程的各种统计信息,包括内存和 CPU 的使用
top: 按一个统计数据排序,显示排名高的进程
pmap: 将进程的内存段和使用统计一起列出
tcpdump: 网络包跟踪(libpcap lib)
blktrace: 块 I/O 跟踪
DTrace: 跟踪内核的内部活动和所有资源的使用情况,支持静态和动态的跟踪
SystemTap: 同上
perf: Linux 性能事件,跟踪静态和动态的指针
strace: 系统调用跟踪
gbd: 源码级别的调试器
延时
吞吐量
资源使用率
多少CPU可用?是核吗?是硬件线程?
CPU 架构是单还是多处理器?
CPU 缓存大小是多少?共享?
CPU 时钟频率是多少?是动态?甚于BIOS?
CPU 有其它特性?
CPU 勘误表上有硬件上的bug?
BIOS 版本有bug?
CPU 使用软件限制?
主存有多少?
配置允许应用程序使用的内存大小?
使用哪个分配器?
主存速度?
系统架构?NUMA? UMA?
NUMA 共享存储器物理上是分布在所有处理机的本地存储器上 UMA 均匀存储器存取
内存总线大小?
是否配置使用了大页面?
是否支持和配置过度提交?
使用了哪些内存可调参数?
软件强制内存限制?
当前挂载并使用的文件系统数量?
文件系统记录大小?
启用了访问时间戳?
是否有其它参数(压缩?加密?)
缓存大小?二级缓存?
存储设备数量?何配置?RAID?
哪种文件系统?版本?
启用I/O控制?
盘数量?类型?
磁盘固件版本?
多少个磁盘控制器?版本?接口类型?
是否为调速插槽?
配置了RAID?
是否启用多路径?
磁盘设备驱动?
启用I/O控制?
网络通信是由一组协议栈组成的,其中的每一层实现一个特定的目标:
一些网络通信和网络性能相关概念:网络和路由、协议、封装、包长度、延时(主机名解析延时、ping 延时、连接延时、首字节延时、往返时间、连接生命周期)、缓冲、连接积压队列、接口协商、使用率、本地连接。
对于日常监测来说,最常用的还是各种工具,如:
netstat -s: 查找高流量的重新传输和乱序数据包
netstat -i: 检查接口的错误计数器
ifconfig: 检查『错误』『丢弃』和『超限』
ip(8): 检查传输和接收的字节率
tcpdump/snoop: 尽管需要大量的 CPU 开销,短期使用可能就足以发现谁在使用网络并且定位可以消除的不必要操作
dtrace/stap/perf: 用来检查包括内核状态在内的应用程序与线路间选中的数据
这两章主要介绍相关底层概念,很多时候只是作为选择云服务提供商的依据(毕竟不能自己开发),省略。
方法
IOPS: 每秒发生的输入/输出操作的次数,是数据传输的一个度量方法。对于磁盘的读写,IOPS 指的是每秒读和写的次数
吞吐量: 评价工作执行的速率,尤其是在数据传输方面,这个术语用于描述数据传输速度。在某些情况下(如数据库),吞吐量指的是操作的速度(每秒操作数或每秒业务数)
响应事件: 一次操作完成的事件。包括用于等待和服务的事件,也包括用来返回结果的时间
延时: 描述操作里用来等待服务的事件。在某些情况下,它可以指的是整个操作时间,等同于响应时间
使用率: 对于服务所请求的资源,使用率描述在所给定的时间区间内资源的繁忙成都。对于存储资源来说,使用率指的就是所消耗的存储容量(例如,内存使用率)
饱和度: 指的是某一资源无法满足服务的排队工作量
瓶颈: 在系统性能力,瓶颈指的是限制系统性能的那个资源。分辨和移除系统瓶颈是系统性能的一项重要工作
工作负载: 系统的输入或者是对系统所施加的负载叫做工作负载。对于数据库来说,工作负载就是客户端发出的数据库请求和命令
缓存: 用于复制或者缓冲一定量数据的高速存储区域,目的是为了避免对较慢的存储层级的直接访问,从而提高性能。
操作系统
操作系统: 这里指的是安装在系统上的软件和文件,使得系统可以启动和运行程序。操作系统包括内核、管理工具,以及系统库
内核: 内核是管理系统的程序,包括设备(硬件)、内存和 CPU 调度。它运行在 CPU 的特权模式,允许直接访问硬件,称为内核态
进程: 是一个操作系统的抽象概念,是用来执行程序的环境。程序通常运行在用户模式,通过系统调用或陷阱来进入内核模式
线程: 可被调度的运行在 CPU 上的可执行上下文。内核有多个线程,一个进程有一个或多个线程
任务: 一个 Linux 的可运行实体,可以指一个进程(含有单个线程),或一个多线程的进程里的一个线程,或者内核线程
内核空间: 内核的内存地址空间
用户空间: 进程的内存地址空间
上下文切换: 内核程序切换 CPU 让其在不同的地址空间上做操作
系统调用: 一套定义明确的协议,为用户程序请求内核执行特权操作,包括设备 I/O
陷阱: 信号发送到内核,请求执行一段系统程序(特权操作)。陷阱类型包括系统调用、处理器异常以及中断
中断: 由物理设备发送给内核的信号,通常是请求 I/O 服务
软件资源
本书作者是著名的性能大师,他有一篇60秒分析性能的文章,其中有一个著名的性能checklist如下:
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数