摘要:
一、上节回顾 专栏更新至今,咱们专栏最后一部分——综合案例模块也要告一段落了。很高兴看到你没有掉队,仍然在积极学习思考、实践操作,并热情地分享你在实际环境中,遇到过的各种性能问题的分析思路以及优化方法。 今天是性能优化答疑的第六期。照例,我从综合案例模块的留言中,摘出了一些典型问题,作为今天的答疑内 阅读全文
摘要:
一、上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤。先带你简单回顾一下。 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源。 从系统资源瓶颈的角度来说,USE 法是最为有效的方法,即从使用率、饱和度以及错误数这三个方面,来分析 CPU、内存、磁盘和文件系统 I/O、网 阅读全文
摘要:
一、上节回顾 上一节,我们一起学习了,应用程序监控的基本思路,先简单回顾一下。应用程序的监控,可以分为指标监控和日志监控两大块。 指标监控,主要是对一定时间段内的性能指标进行测量,然后再通过时间序列的方式,进行处理、存储和告警。 而日志监控,则可以提供更详细的上下文信息,通常通过 ELK 技术栈,来 阅读全文
摘要:
一、上节回顾 在前面的内容中,我为你介绍了很多性能分析的原理、思路以及相关的工具。不过,在实际的性能分析中,一个很常见的现象是,明明发生了性能瓶颈,但当你登录到服务器中想要排查的时候,却发现瓶颈已经消失了。或者说,性能问题总是时不时地发生,但却很难找出发生规律,也很难重现。 当面对这样的场景时,你可 阅读全文
摘要:
一、上节回顾 上一节,我带你一起梳理了常见的性能优化思路,先简单回顾一下。我们可以从系统和应用程序两个角度,来进行性能优化。 性能优化最好逐步完善,动态进行。不要追求一步到位,而要首先保证能满足当前的性能要求。 性能优化通常意味着复杂度的提升,也意味着可维护性的降低。 如果你发现单机的性能调优带来过 阅读全文
摘要:
一、上节回顾 上一节,我带你学习了,如何使用 USE 法来监控系统的性能,先简单回顾一下。 系统监控的核心是资源的使用情况,这既包括 CPU、内存、磁盘、文件系统、网络等硬件资源,也包括文件描述符数、连接数、连接跟踪数等软件资源。而要描述这些资源瓶颈,最简单有效的方法就是 USE 法。 USE 法把 阅读全文
摘要:
一、上节回顾 上一节,我带你一起学习了常见的动态追踪方法。所谓动态追踪,就是在系统或者应用程序正常运行的时候,通过内核中提供的探针,来动态追踪它们的行为,从而辅助排查出性能问题的瓶颈。 使用动态追踪,可以在不修改代码、不重启服务的情况下,动态了解应用程序或者内核的行为,这对排查线上问题、特别是不容易 阅读全文
摘要:
一、上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法。先简单回顾一下。 当碰到内核线程的资源使用异常时,很多常用的进程级性能工具,并不能直接用到内核线程上。这时,我们就可以使用内核自带的 perf 来观察它们的行为,找出热点 阅读全文
摘要:
一、上节回顾 上一期,我们一起梳理了,网络时不时丢包的分析定位和优化方法。先简单回顾一下。网络丢包,通常会带来严重的性能下降,特别是对 TCP 来说,丢包通常意味着网络拥塞和重传,进而会导致网络延迟增大以及吞吐量降低。 而分析丢包问题,还是用我们的老套路,从 Linux 网络收发的流程入手,结合 T 阅读全文
摘要:
一、上节回顾 上一节,我们梳理了,应用程序容器化后性能下降的分析方法。一起先简单回顾下。容器利用 Linux 内核提供的命名空间技术,将不同应用程序的运行隔离起来,并用统一的镜像,来管理应用程序的依赖环境。这为应用程序的管理和维护,带来了极大的便捷性,并进一步催生了微服务、云原生等新一代技术架构。 阅读全文
摘要:
一、上节回顾 上一节,我们一起学习了如何分析网络丢包的问题,特别是从链路层、网络层以及传输层等主要的协议栈中进行分析。 不过,通过前面这几层的分析,我们还是没有找出最终的性能瓶颈。看来,还是要继续深挖才可以。今天,我们就来继续分析这个未果的案例。 在开始下面的内容前,你可以先回忆一下上节课的内容,并 阅读全文
摘要:
一、上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU、内存、文件系统和磁盘 I/O、以及网络的性能分析和优化。相信你已经掌握了这些基础模块的基本分析、定位思路,并熟悉了相关的优化方法。 接下来,我们将进入最后一个重要模块—— 综合实战篇。这部分实战内容,也将是我们对前面所学知识的 阅读全文
摘要:
一、上节总结 专栏更新至今,四大基础模块的第三个模块——文件系统和磁盘 I/O 篇,我们就已经学完了。很开心你还没有掉队,仍然在积极学习思考和实践操作,并且热情地留言与讨论。 今天是性能优化的第四期。照例,我从 I/O 模块的留言中摘出了一些典型问题,作为今天的答疑内容,集中回复。同样的,为了便于你 阅读全文
摘要:
一、上节回顾 上一节,我们学习了碰到分布式拒绝服务(DDoS)的缓解方法。简单回顾一下,DDoS利用大量的伪造请求,导致目标服务要耗费大量资源,来处理这些无效请求,进而无法正常响应正常用户的请求。 由于 DDoS 的分布式、大流量、难追踪等特点,目前确实还没有方法,能够完全防御DDoS 带来的问题, 阅读全文
摘要:
一、上节回顾 上一节,我们探究了网络延迟增大问题的分析方法,并通过一个案例,掌握了如何用hping3、tcpdump、Wireshark、strace 等工具,来排查和定位问题的根源。 简单回顾一下,网络延迟是最核心的网络性能指标。由于网络传输、网络包处理等各种因素的影响,网络延迟不可避免。但过大的 阅读全文
摘要:
一、上节回顾 专栏更新至今,四大基础模块的最后一个模块——网络篇,我们就已经学完了。很开心你还没有掉队,仍然在积极学习思考和实践操作,热情地留言和互动。还有不少同学分享了在实际生产环境中,碰到各种性能问题的分析思路和优化方法,这里也谢谢你们。 今天是性能优化答疑的第五期。照例,我从网络模块的留言中, 阅读全文
摘要:
一、上节回顾 上一节,我们学了网络性能优化的几个思路,我先带你简单复习一下。 在优化网络的性能时,你可以结合 Linux 系统的网络协议栈和网络收发流程,然后从应用程序、套接字、传输层、网络层再到链路层等每个层次,进行逐层优化。上一期我们主要学习了应用程序和套接字的优化思路,比如: 在应用程序中,主 阅读全文
摘要:
一、上节回顾 上一节,我们了解了 NAT(网络地址转换)的原理,学会了如何排查 NAT 带来的性能问题,最后还总结了 NAT 性能优化的基本思路。我先带你简单回顾一下。 NAT 基于 Linux 内核的连接跟踪机制,实现了 IP 地址及端口号重写的功能,主要被用来解决公网 IP 地址短缺的问题。 在 阅读全文
摘要:
一、上节回顾 上一节,我带你学习了 tcpdump 和 Wireshark 的使用方法,并通过几个案例,带你用这两个工具实际分析了网络的收发过程。碰到网络性能问题,不要忘记可以用 tcpdump 和Wireshark 这两个大杀器,抓取实际传输的网络包,排查潜在的性能问题。 今天,我们一起来看另外一 阅读全文
摘要:
一、上节回顾 上一节,我们学习了 DNS 性能问题的分析和优化方法。简单回顾一下,DNS 可以提供域名和 IP 地址的映射关系,也是一种常用的全局负载均衡(GSLB)实现方法。 通常,需要暴露到公网的服务,都会绑定一个域名,既方便了人们记忆,也避免了后台服务 IP 地址的变更影响到用户。 不过要注意 阅读全文
摘要:
一、上节回顾 上一节,我带你一起学习了网络性能的评估方法。简单回顾一下,Linux 网络基于 TCP/IP协议栈构建,而在协议栈的不同层,我们所关注的网络性能也不尽相同。 在应用层,我们关注的是应用程序的并发连接数、每秒请求数、处理延迟、错误数等,可以使用 wrk、Jmeter 等工具,模拟用户的负 阅读全文
摘要:
一、上节总结回顾 上一节,我们回顾了经典的 C10K 和 C1000K 问题。简单回顾一下,C10K 是指如何单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 则是单机支持处理 100 万个请求(并发连接 100 万)的问题。 I/O 模型的优化,是解决 C10K 问题的最佳良 阅读全文
摘要:
一、原理篇总结回顾 如果你一讲一讲跟到现在,那首先要恭喜你,马上就看到胜利的曙光了。过去的50多讲里,我把计算机组成原理中的各个知识点,一点一点和你拆解了。对于其中的很多知识点,我也给了相应的代码示例和实际的应用案例。 不过呢,相信你和我一样,觉得只了解这样一个个零散的知识点和案例还不过瘾。那么从今 阅读全文
摘要:
一、引子 上一讲,我们学习了一个精妙的想法,Disruptor通过缓存行填充,来利用好CPU的高速缓存。不知道你做完课后思考题之后,有没有体会到高速缓存在实践中带来的速度提升呢? 不过,利用CPU高速缓存,只是Disruptor“快”的一个因素,那今天我们就来看一看Disruptor快的另一个因素, 阅读全文
摘要:
一、引子 坚持到底就是胜利,终于我们⼀起来到了专栏的最后一个主题。让我一起带你来看一看,CPU到底能有多快。在接下来的两讲里,我会带你一起来看一个开源项目Disruptor。看看我们怎么利用CPU和高速缓存的硬件特性,来设计一个对于性能有极限追求的系统。 不知道你还记不记得,在第37讲里,为了优化4 阅读全文
摘要:
一、上节总结回顾 上一讲里,根据DMP系统的各个应用场景,我们从抽象的原理层面,选择了AeroSpike作为KV数据库,Kafka作为数据管道,Hadoop/Hive来作为数据仓库。 不过呢,肯定有不信邪的工程师会问,为什么MongoDB,甚至是MySQL这样的文档数据库或者传统的关系型数据库不适应 阅读全文
摘要:
一、原理篇总结回顾 今天是原理篇的最后一篇。过去50讲,我们一起看了抽象概念上的计算机指令,看了这些指令怎么拆解成一个个简单的电路,以及CPU是怎么通过一个一个的电路组成的。我们还一起看了高速缓存、内存、SSD硬盘和机械硬盘,以及这些组件又是怎么通过总线和CPU连在一起相互通信的。 把计算机这一系列 阅读全文
摘要:
一、引子 2012年的时候,我第一次在工作中,遇到一个因为硬件的不可靠性引发的Bug。正是因为这个Bug,让我开始逐步花很多的时间,去复习回顾整个计算机系统里面的底层知识。 当时,我正在MediaV带领一个20多人的团队,负责公司的广告数据和机器学习算法。其中有一部分工作,就是用Hadoop集群处理 阅读全文
摘要:
一、上节回顾 前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解耦了网络协议的复杂性。 基于 TC 阅读全文
摘要:
一、上节回顾 上一节,我带你学习了 Linux 网络的基础原理。简单回顾一下,Linux 网络根据 TCP/IP模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成,这也是 Linux 网络栈最核心的构成部分。 应用程序通过套接字接口发送数据包时,先要在网络协议栈 阅读全文
摘要:
一、内存的分配和回收 1、管理内存的过程中,也很容易发生各种各样的“事故”, 对应用程序来说,动态内存的分配和回收,是既核心又复杂的一的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”, 比如,没正确回收分配后的内存,导致了泄漏。访问的是已分配内存边界外的地址,导致程序异常退出,等 阅读全文
摘要:
一、性能指标 二、文件系统I/O性能指标 1、存储空间的使用情况 文件系统向外展示的空间使用,而非磁盘空间的真是用量,因为文件系统的元数据也会占用磁盘空间 2、索引节点的使用情况 如果存储过多的小文件、就可能碰到索引节点容量已满的问题 3、缓存使用情况 如果存储过多的小文件、就可能碰到索引节点容量已 阅读全文
摘要:
一、引子 讲完校验码之后,你现在应该知道,无论是奇偶校验码,还是CRC这样的循环校验码,都只能告诉我们一个事情,就是你的数据出错了。所以,校验码也被称为检错码(Error Detecting Code)。 不管是校验码,还是检错码,在硬件出错的时候,只能告诉你“我错了”。但是,下一个问题,“错哪儿了 阅读全文
摘要:
一、引子 上一讲里呢,我进一步为你讲解了CPU里的“黑科技”,分别是超标量(Superscalar)技术和超长指令字(VLIW)技术。 超标量(Superscalar)技术能够让取指令以及指令译码也并行进行;在编译的过程,超长指令字(VLIW)技术可以搞定指令先后的依赖关系,使得一次可以取一个指令包 阅读全文
摘要:
一、引子 到今天为止,专栏已经过半了。过去的20多讲里,我给你讲的内容,很多都是围绕着怎么提升CPU的性能这个问题展开的。我们先回顾一下第4讲,不知道你是否还记得这个公式: 这个公式里,有一个叫CPI的指标。我们知道,CPI的倒数,又叫作IPC(Instruction Per Clock),也就是一 阅读全文
摘要:
一、引子 1、解决不同指令之间的数据依赖问题。 上一讲,我为你讲解了结构冒险和数据冒险,以及应对这两种冒险的两个解决方案。一种方案是增加资源,通过添加指令缓存和数据缓存,让我们对于指令和数据的访问可以同时进行。这个办法帮助CPU解决了取指令和访问数据之间的资源冲突。另一种方案是直接进行等待。通过插入 阅读全文
摘要:
一、引子 1、取指令(IF)和指令译码(ID)的阶段,是不需要停顿的 过去三讲,我主要为你介绍了结构冒险和数据冒险,以及增加资源、流水线停顿、操作数前推、乱序执行,这些解决各种“冒险”的技术方案。 在结构冒险和数据冒险中,你会发现,所有的流水线停顿操作都要从 指令执行阶段开始。流水线的前两个阶段,也 阅读全文
摘要:
一 、引子 过去两讲,我为你讲解了通过增加资源、停顿等待以及主动转发数据的方式,来解决结构冒险和数据冒险问题。对于结构冒险,由于限制来自于同一时钟周期不同的指令,要访问相同的硬件资源,解决方案是增加资源。对于数据冒险,由于限制来自于数据之间的各种依赖,我们可以提前把数据转发到下一个指令。 但是即便综 阅读全文
摘要:
一、引子 1、流水线设计需要解决的三大冒险 过去两讲,我为你讲解了流水线设计CPU所需要的基本概念。接下来,我们一起来看看,要想通过流水线设计来提升CPU的吞吐率,我们需要冒哪些风险。 任何一本讲解CPU的流水线设计的教科书,都会提到流水线设计需要解决的三大冒险,分别是 结构冒险(Structura 阅读全文
摘要:
一、引子 1、现代桌面CPU的最后一场大战 上一讲,我给你初步介绍了CPU的流水线技术。乍看起来,流水线技术是一个提升性能的灵丹妙药。它通过把一条指令的操作切分成更细的多个步骤,可以避免CPU“浪费”。每一个细分的流水线步骤都很简单,所以我们的单个时钟周期的时间就可以设得更短。这也变相地让CPU的主 阅读全文