随笔分类 -  深挖计算机基础

摘要:一、上节回顾 上一节,我带你学习了 tcpdump 和 Wireshark 的使用方法,并通过几个案例,带你用这两个工具实际分析了网络的收发过程。碰到网络性能问题,不要忘记可以用 tcpdump 和Wireshark 这两个大杀器,抓取实际传输的网络包,排查潜在的性能问题。 今天,我们一起来看另外一 阅读全文
posted @ 2019-09-17 19:01 活的潇洒80 阅读(1155) 评论(0) 推荐(0)
摘要:一、上节回顾 上一节,我们学习了 DNS 性能问题的分析和优化方法。简单回顾一下,DNS 可以提供域名和 IP 地址的映射关系,也是一种常用的全局负载均衡(GSLB)实现方法。 通常,需要暴露到公网的服务,都会绑定一个域名,既方便了人们记忆,也避免了后台服务 IP 地址的变更影响到用户。 不过要注意 阅读全文
posted @ 2019-09-17 16:54 活的潇洒80 阅读(1601) 评论(0) 推荐(0)
摘要:一、上节回顾 上一节,我带你一起学习了网络性能的评估方法。简单回顾一下,Linux 网络基于 TCP/IP协议栈构建,而在协议栈的不同层,我们所关注的网络性能也不尽相同。 在应用层,我们关注的是应用程序的并发连接数、每秒请求数、处理延迟、错误数等,可以使用 wrk、Jmeter 等工具,模拟用户的负 阅读全文
posted @ 2019-09-16 18:52 活的潇洒80 阅读(2007) 评论(0) 推荐(0)
摘要:一、上节总结回顾 上一节,我们回顾了经典的 C10K 和 C1000K 问题。简单回顾一下,C10K 是指如何单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 则是单机支持处理 100 万个请求(并发连接 100 万)的问题。 I/O 模型的优化,是解决 C10K 问题的最佳良 阅读全文
posted @ 2019-09-16 16:35 活的潇洒80 阅读(1754) 评论(0) 推荐(0)
摘要:一、原理篇总结回顾 如果你一讲一讲跟到现在,那首先要恭喜你,马上就看到胜利的曙光了。过去的50多讲里,我把计算机组成原理中的各个知识点,一点一点和你拆解了。对于其中的很多知识点,我也给了相应的代码示例和实际的应用案例。 不过呢,相信你和我一样,觉得只了解这样一个个零散的知识点和案例还不过瘾。那么从今 阅读全文
posted @ 2019-09-15 22:25 活的潇洒80 阅读(789) 评论(0) 推荐(0)
摘要:一、引子 上一讲,我们学习了一个精妙的想法,Disruptor通过缓存行填充,来利用好CPU的高速缓存。不知道你做完课后思考题之后,有没有体会到高速缓存在实践中带来的速度提升呢? 不过,利用CPU高速缓存,只是Disruptor“快”的一个因素,那今天我们就来看一看Disruptor快的另一个因素, 阅读全文
posted @ 2019-09-15 22:02 活的潇洒80 阅读(685) 评论(0) 推荐(0)
摘要:一、引子 坚持到底就是胜利,终于我们⼀起来到了专栏的最后一个主题。让我一起带你来看一看,CPU到底能有多快。在接下来的两讲里,我会带你一起来看一个开源项目Disruptor。看看我们怎么利用CPU和高速缓存的硬件特性,来设计一个对于性能有极限追求的系统。 不知道你还记不记得,在第37讲里,为了优化4 阅读全文
posted @ 2019-09-14 21:57 活的潇洒80 阅读(670) 评论(0) 推荐(0)
摘要:一、上节总结回顾 上一讲里,根据DMP系统的各个应用场景,我们从抽象的原理层面,选择了AeroSpike作为KV数据库,Kafka作为数据管道,Hadoop/Hive来作为数据仓库。 不过呢,肯定有不信邪的工程师会问,为什么MongoDB,甚至是MySQL这样的文档数据库或者传统的关系型数据库不适应 阅读全文
posted @ 2019-09-14 08:26 活的潇洒80 阅读(524) 评论(0) 推荐(0)
摘要:一、原理篇总结回顾 今天是原理篇的最后一篇。过去50讲,我们一起看了抽象概念上的计算机指令,看了这些指令怎么拆解成一个个简单的电路,以及CPU是怎么通过一个一个的电路组成的。我们还一起看了高速缓存、内存、SSD硬盘和机械硬盘,以及这些组件又是怎么通过总线和CPU连在一起相互通信的。 把计算机这一系列 阅读全文
posted @ 2019-09-11 09:11 活的潇洒80 阅读(605) 评论(0) 推荐(0)
摘要:一、引子 2012年的时候,我第一次在工作中,遇到一个因为硬件的不可靠性引发的Bug。正是因为这个Bug,让我开始逐步花很多的时间,去复习回顾整个计算机系统里面的底层知识。 当时,我正在MediaV带领一个20多人的团队,负责公司的广告数据和机器学习算法。其中有一部分工作,就是用Hadoop集群处理 阅读全文
posted @ 2019-09-10 19:56 活的潇洒80 阅读(713) 评论(0) 推荐(0)
摘要:一、上节回顾 前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解耦了网络协议的复杂性。 基于 TC 阅读全文
posted @ 2019-09-06 17:48 活的潇洒80 阅读(1946) 评论(0) 推荐(0)
摘要:一、上节回顾 上一节,我带你学习了 Linux 网络的基础原理。简单回顾一下,Linux 网络根据 TCP/IP模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成,这也是 Linux 网络栈最核心的构成部分。 应用程序通过套接字接口发送数据包时,先要在网络协议栈 阅读全文
posted @ 2019-09-06 14:48 活的潇洒80 阅读(1971) 评论(1) 推荐(0)
摘要:一、内存的分配和回收 1、管理内存的过程中,也很容易发生各种各样的“事故”, 对应用程序来说,动态内存的分配和回收,是既核心又复杂的一的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”, 比如,没正确回收分配后的内存,导致了泄漏。访问的是已分配内存边界外的地址,导致程序异常退出,等 阅读全文
posted @ 2019-09-03 12:00 活的潇洒80 阅读(2761) 评论(0) 推荐(1)
摘要:一、性能指标 二、文件系统I/O性能指标 1、存储空间的使用情况 文件系统向外展示的空间使用,而非磁盘空间的真是用量,因为文件系统的元数据也会占用磁盘空间 2、索引节点的使用情况 如果存储过多的小文件、就可能碰到索引节点容量已满的问题 3、缓存使用情况 如果存储过多的小文件、就可能碰到索引节点容量已 阅读全文
posted @ 2019-09-02 17:08 活的潇洒80 阅读(878) 评论(0) 推荐(0)
摘要:一、引子 讲完校验码之后,你现在应该知道,无论是奇偶校验码,还是CRC这样的循环校验码,都只能告诉我们一个事情,就是你的数据出错了。所以,校验码也被称为检错码(Error Detecting Code)。 不管是校验码,还是检错码,在硬件出错的时候,只能告诉你“我错了”。但是,下一个问题,“错哪儿了 阅读全文
posted @ 2019-09-01 17:47 活的潇洒80 阅读(1224) 评论(0) 推荐(0)
摘要:一、引子 上一讲里呢,我进一步为你讲解了CPU里的“黑科技”,分别是超标量(Superscalar)技术和超长指令字(VLIW)技术。 超标量(Superscalar)技术能够让取指令以及指令译码也并行进行;在编译的过程,超长指令字(VLIW)技术可以搞定指令先后的依赖关系,使得一次可以取一个指令包 阅读全文
posted @ 2019-09-01 13:05 活的潇洒80 阅读(1390) 评论(0) 推荐(0)
摘要:一、引子 到今天为止,专栏已经过半了。过去的20多讲里,我给你讲的内容,很多都是围绕着怎么提升CPU的性能这个问题展开的。我们先回顾一下第4讲,不知道你是否还记得这个公式: 这个公式里,有一个叫CPI的指标。我们知道,CPI的倒数,又叫作IPC(Instruction Per Clock),也就是一 阅读全文
posted @ 2019-09-01 08:21 活的潇洒80 阅读(1828) 评论(0) 推荐(0)
摘要:一、引子 1、解决不同指令之间的数据依赖问题。 上一讲,我为你讲解了结构冒险和数据冒险,以及应对这两种冒险的两个解决方案。一种方案是增加资源,通过添加指令缓存和数据缓存,让我们对于指令和数据的访问可以同时进行。这个办法帮助CPU解决了取指令和访问数据之间的资源冲突。另一种方案是直接进行等待。通过插入 阅读全文
posted @ 2019-08-31 21:39 活的潇洒80 阅读(1817) 评论(0) 推荐(1)
摘要:一、引子 1、取指令(IF)和指令译码(ID)的阶段,是不需要停顿的 过去三讲,我主要为你介绍了结构冒险和数据冒险,以及增加资源、流水线停顿、操作数前推、乱序执行,这些解决各种“冒险”的技术方案。 在结构冒险和数据冒险中,你会发现,所有的流水线停顿操作都要从 指令执行阶段开始。流水线的前两个阶段,也 阅读全文
posted @ 2019-08-31 11:23 活的潇洒80 阅读(1328) 评论(0) 推荐(0)
摘要:一 、引子 过去两讲,我为你讲解了通过增加资源、停顿等待以及主动转发数据的方式,来解决结构冒险和数据冒险问题。对于结构冒险,由于限制来自于同一时钟周期不同的指令,要访问相同的硬件资源,解决方案是增加资源。对于数据冒险,由于限制来自于数据之间的各种依赖,我们可以提前把数据转发到下一个指令。 但是即便综 阅读全文
posted @ 2019-08-30 18:58 活的潇洒80 阅读(954) 评论(0) 推荐(0)