0%

简介

随着处理器复杂度的增加、处理任务的多样化以及性能分析工具数据的难以管理,使得性能分析的难度日益增加。同时,在某些领域中,对于资源和时间的限制更加严格,进一步要求性能分析给出分析速度和结果准确性更优的方法。

这篇文章给出了一个自顶向下的分析方法(Top-Down Analysis),可以在乱序处理器上快速定位真正的性能瓶颈。该方法通过将性能数据结构化、分层展示,直观快速的展示性能瓶颈,并且已经被包括 VTune 在内的众多性能工具使用。

不同于其他性能分析方法,该方法的开销很低,只需要在传统的 PMU(Performance Monitor Unit) 中增加 8 个简单的性能事件。它没有对问题域的限制,可以全面的进行性能分析,并且可以找到超标量核心的性能问题。

阅读全文 »

本文全部内容都来自于 DECODEZ “Skylake 微架构剖析” 系列,地址 https://decodezp.github.io/2019/01/07/quickwords9-skylake-pipeline-1/

搬运仅仅为了留作笔记,详细内容请直接访问 DECODEZ 的博客网站 https://decodezp.github.io/

前言

了解 CPU 的微架构是基于其开发“硬核”软件的必需步骤。由于一些历史遗留问题,现存的技术资料往往存在一些概念混淆、重复命名甚至自相矛盾之处。本文一来梳理 Skylake 微架构(主要是流水线)的组成和特性,二来试图厘清一些含混的概念用以帮助后来者。

另外在介绍完微架构之后,会继续结合 Perf 中的 Performance Event 来对照说明互为印证。

需要强调的是,本文的重点是Skylake的流水线(pipeline)架构,core间的连接和架构方式不作重点说明。

阅读全文 »

简介

SSB(Star Schema Benchmark)是麻省州立大学波士顿校区的研究人员定义的基于现实商业应用的数据模型,业界公认用来模拟决策支持类应用,比较公正和中立。学术界和工业界普遍采用它来评价决策支持技术方面应用的性能。
SSBTPC(Transaction Processing Performance Council,事务处理性能委员会)发布的 TPC-H 标准改进而来。它将 TPC-H 的雪花模型改为星型模型,将基准查询由 TPC-H 的复杂 Ad-Hoc 查询改为了结构更固定的 OLAP 查询。

事务处理性能委员会( Transaction Processing Performance Council ),是由数10家会员公司创建的非盈利组织,总部设在美国。该组织对全世界开放,但迄今为止,绝大多数会员都是美、日、西欧的大公司。TPC的成员主要是计算机软硬件厂家,而非计算机用户,它的功能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量,并管理测试结果的发布。

引用自百度百科 TPC (事务处理性能委员会)

不使用 TPC-H 的原因是,想要提供更普适的功能覆盖(Functional Coverage)和选择覆盖(Selectivity Coverage):

  1. 功能覆盖(Functional Coverage):尽可能的选用跨多个表的查询,来贴近实际使用情况
  2. 选择覆盖(Selectivity Coverage):通过维度表的条件来过滤事实表,并使得过滤后的结果集相对较少

几个概念:

  1. SF(Scale Factor):生成测试数据集时传入的数据量规模因子,决定了各表最终生成的行数。
  2. FF(Filter Factor):每个 WHERE 过滤条件筛选出一部分行,被筛选出的行数占过滤前行数的比例叫做 FF。在过滤列彼此独立的条件下,表的FF为该表上各个过滤条件FF的乘积。
阅读全文 »

摘要

本文主要讨论在 OLAP 领域,面向列的存储和计算为什么会比面向行的存储和计算更快的问题。

在 OLAP 场景下,基准测试都会说面向列的存储和计算比面向行的存储和计算块一个数量级。而大家普遍理解面向列快的原因是

column-stores are more I/O efficient for read-only queries since they only have to read from disk (or from memory) those attributes accessed by a query.

对于只读查询,列存储的I/O效率更高,因为它们只需要从磁盘(或内存)中读取查询所需要的那些字段。

这种想法让大家认为即使是行存也可以通过一些优化手段,达到列存的性能,包括:

  1. 垂直分表(vertically partitioning)
  2. 全列索引(indexing every column)

这些优化手段可以在查询时,只查询部分列对应的数据,从而加快分析速度。

通过一系列实验不难发现,这些手段并不能让面向行存打到列存的性能,原因是列存除了存储优势外,在计算上还有以下几种优化手段:

  1. 压缩(Compression)
  2. 延迟物化(Late Materialization)
  3. 快迭代(Block Iteration)
  4. Invisible Join

前三种手段是目前面向列的系统中已有的优化手段,最后一种是本文新提出的一种策略,后面的章节会详细介绍。

阅读全文 »

本文是博主学习 MIT6.824 课程的学习笔记,其中会总结论文知识点并加入自己的理解,内容可能与论文原文有出入,想要了解细节的读者可以阅读论文原文或者学习 MIT6.824课程。

The Google File System

GFS MIT Video

简介

Google File System 简称 GFSGoogle 设计并实现的一个面向数据密集型应用的、可伸缩的分布式文件系统。

GFS 的设计基于以下使用场景:

  1. 运行在廉价的日用硬件上,组件失效是常态事件。因此,系统必须具有持久的监控、错误侦测、容错以及自动恢复的功能。
  2. 以存储大文件(100MB数GB)为主,同时要支持小文件,但是不需要针对小文件做优化。
  3. 支持两种读操作:大规模的流式读取(数百KB,或者一次读取 1MB 甚至更多)和小规模的随机读取(在任意位移上读取 几个KB)。
  4. 支持两种写操作:大规模的、顺序的对文件的追加和小规模的任意位置写入(不必高效)。
  5. 必须支持高效的多客户端同时并行追加数据到同一个文件的语义(Google 的场景下,GFS 中存储的文件通常用于 生产者-消费者 队列,或者其他多路文件合并操作)
  6. 大吞吐量优先于低延时
阅读全文 »

本文是博主学习 MIT6.824 课程的学习笔记,其中会总结论文知识点并加入自己的理解,内容可能与论文原文有出入,想要了解细节的读者可以阅读论文原文或者学习 MIT6.824课程。

MapReduce: Simplified Data Processing on Large Clusters

Introduction And MapReduce

简介

MapReduce 是一种编程模型,也是一个处理和生成超大数据集算法模型的相关实现。使用 MapReduce 架构的程序能够在大量的普通配置的计算机上实现并行化处理。

MapReduce 模型

MapReduce 编程模型的处理过程为:输入一个 key/value pair 集合,经过处理后,输出一个 key/value pair 集合作为结果。
MapReduce 允许用户使用两个函数 MapReduce 来表达上述计算。

  • Map 函数接受一个输入的 key/value pair 值,然后产生一个中间 key/value pair 值的集合。MapReduce 把所有 keyI 的中间值 value集合在一起后传递给 reduce 函数。
  • Reduce 函数接受一个中间 key 的值 I 和其value值的集合,由于 value 值可能由于太大无法放入内存中,故通常我们把 value 的迭代器传递给 Reduce 函数。

上述过程也可以抽象为下面的表达式

$$ map(k1, v1) -> list(k2, v2) $$

$$ reduce(k2, list(v2)) -> list(v2) $$

阅读全文 »

概述

方法引用的基础是 Lambda 表达式,它可以认为是 Lambda 表达式的语法糖,用来简化开发。

在我们使用Lambda表达式的时候,-> 右边部分是要执行的代码,即要完成的功能,可以把这部分称作 Lambda 体。有时候,当我们想要实现一个函数式接口的那个抽象方法,但是已经有类实现了我们想要的功能,这个时候我们就可以用方法引用来直接使用现有类的功能去实现。

阅读全文 »

定义

  1. Optional 的出现主要为了解决 NullPointerExcepton 的异常。

  2. Optional 是一个值的容器,用来存储一个 Object 或者 null

  3. 它是一个基于值的类(value-base class)

    基于值的类(value-base class) 需要满足以下几个条件:

    1. 必须为 final 和 不可变的(可以包含可变对象的引用);
    2. 必须实现 equalshashCodetoString 方法。并且这些方法必须仅根据当前实例的状态独自计算,而不是根据他的标识或者其他对象的状态、变量计算;
    3. 不使用身份敏感的操作,例如实例之间通过引用的 == 来判等、实例的 hashCode 已经实例内在的锁;
    4. 两个实例的相等,仅仅基于 equals() 方法,而不基于引用的相等(==);
    5. 没有可访问的构造方法(构造方法为私有),仅仅通过工厂方法来实例化对象,但是工厂方法不保证返回实例的一致性(即:第一次调用与第二次调用可能返回的实例是不同的);
    6. 如果使用 equals 方法判断两个实例是相同的,那么这两个实例之间可以随意替换。
阅读全文 »

视频教程笔记,视频地址见 深入理解 Java8+jdk8 源码级思想

Lambda 表达式

Lambda 表达式简介

介绍

Lambda 表达式可以认为是一种匿名函数(对 JAVA 而言,他是一个对象,此处暂且认为是一种匿名函数吧),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。

作用

  1. 在 JAVA8 之前,无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法。Lambda 表达式为 JAVA 添加了缺失的函数式编程的特性,使我们能把函数作为一等公民看待
  2. 在将函数作为一等公民的语言中,Lambda 表达式的类型是函数。但是在 JAVA 中 Lambda 表达式是对象,他们必须依附于一类特别的对象类型——函数式接口。
阅读全文 »

hexo 简介

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 由于Hexo最终会生成静态页面,所以在部署的时候我们只需要将静态页面上传到服务器即可。结合git我们就可以实现一键自动部署。下面将介绍如何配置。

阅读全文 »