浅谈“伪共享”问题
非原创,转载于:https://www.liuyj.top/false_sharing.html
前言学习的过程中遇到了一个名词——伪共享,出于对知识的兴趣,上网查阅了一些博文,研究了伪共享的问题,写此文章总结记录。
要很好的理解伪共享问题,我们要先从CPU的缓存开始说起。
CPU缓存架构CPU 是计算机的心脏,所有运算和程序最终都要由它来执行。
主内存(RAM)是数据存放的地方,CPU 和主内存之间有好几级缓存,因为即使直接访问主内存也是非常慢的。
如果对一块数据做相同的运算多次,那么在执行运算的时候把它加载到离 CPU 很近的地方就有意义了,比如一个循环计数,你不想每次循环都跑到主内存去取这个数据来增长它吧。
再对缓存的概念做一些说明:
越靠近 CPU 的缓存越快也越小。所以 L1 缓存很小但很快,并且紧靠着在使用它的 CPU 内核。L2 大一些,也慢一些,并且仍然只能被一个单独的 CPU 核使用。L3 在现代多核机器中更普遍,仍然更大,更慢,并且被单个插槽上的所有 CPU 核共享。最后,主存保存着程序运行的所有数据,它更大,更慢,由全部插槽上的所有 CPU 核共享。
当 ...
雪花算法源码分析及实践
一、雪花算法简介雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,这种算法由Twitter创建并开源。
雪花算法由64位的二进制组成,刚好可以用一个Long类型存储,一共包含四个部分:
符号
时间戳
数据中心和机器ID
序列号
1 bit
41 bits
10 bits
12 bits
1位是符号位,没有被使用,始终是0
41位是时间戳,具体到毫秒,表示现在至1970年以来的毫秒数,最多可用69年
10位是数据中心和机器ID,10位最多可以表示1024台机器
12位是序列号,表示毫秒内生成的序列号,每毫秒最多可生成4096个ID
二、雪花算法源码(java)
雪花算法Java版本源码来自beyondfengyu的github:Snowflake
/**
* twitter的snowflake算法 -- java实现
*
* @author beyond
* @date 2016/11/26
*/
public class SnowFlake {
/**
* ...
张一鸣:牛逼的人找方法,傻逼的人找借口
转载说明内容来源:本文为公众号仟语仟寻(ID:huoqian2014)首发,转载自笔记侠(ID:Notesman)原文地址:张一鸣:牛逼的人找方法,傻逼的人找借口
伴随成长,我们会遇到很多问题,在不断思考,今天读到的这篇文章中许多观点引起了我的共鸣,更从中看到了一些值得去探索的方法。
商业思维编者按:这几天抽空把张一鸣所有的微博看了一遍,2010年的微博是他30岁左右时候发的,那时候他刚创业没多久,在微博上认真分享自己的思考和观点。到了2012年附近,开始做今日头条。从他的微博中,我试图找到他成功的钥匙,仅仅是这些只言片语,我都觉得对我的启发很大。一个有趣的故事是,早年张一鸣曾把马化腾的所有微博读了一遍;而今天,张一鸣的微博也被人仔细研读,试图摸索出他成就背后的思维逻辑。围观他的微博,结论就是张一鸣真的太厉害了,发现他说得最多的关键词:延迟满足感,自控,理性,反省,创新,学习。本文是从他微博中摘录的231句话,绝大多数都是他创业初期的思考,我们可以看下10年前的想创业的张一鸣在想什么,在思考什么,是怎么鞭策自己的。有点长,希望大家耐心看完,一定会有所收获的。
一、关于成长1.人 ...
分布式ID生成方案
一、问题背景由于MySQL的单表数据量超过了千万级别,需要根据日期对数据库进行水平分表,分表后需要保证每个分表Id的全局唯一性,原来单表使用自增保证Id的有序性和唯一性,分表后需要生成全局唯一的Id。
所以接下来讨论一下分布式Id的生成方案,以及各种方案的优缺点等。
二、分布式ID生成方案2.1 UUID
A universally unique identifier (UUID) is a 128-bit label used for information in computer systems. The term globally unique identifier (GUID) is also used通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息的一个128位标识符。
根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计。通用唯一识别码-维基百科
2.1.1 UUID定义UUID是由一个16进制下的32位数所构成,故 ...
MySQL索引合并优化
一、问题背景之前遇到过一个关于MySQL索引的面试题,问题如下:
一张数据库表t其中有3列为a、b、c,分别为每一个列单独建立一个二级索引,那么现在有一个查询条件select * from t where a=? and b=? and c=?请问上述SQL语句,MySQL存储引擎在执行查询的时候,哪些索引将会被使用到?
当时一顿分析,还谈到了MySQL基于成本估算的优化,认为MySQL优化器先基于a、b、c三个列的索引区分度,选择索引区分度较高的索引进行扫描,根据第一个索引的扫描结果,如果第一个索引的扫描结果集高于一个固定量级,则继续选择第二个索引进行扫描,依次判断是否需要使用第三个索引,如果第一个索引的扫描结果集小于一个固定量级,则直接根据第一个索引的扫描结果集进行回表查询到列记录,再根据未使用到的2列进行过滤。
最后得出的结果是:a、b、c 3个索引都可能被使用到,具体使用到哪些索引,取决于3个索引的区分度以及表的数据量。
正确答案上面的问题应该用索引合并优化的原理来分析,上述的SQL的where条件满足了索引合并优化中的Index Merge Intersection Ac ...
IntelliJ IDEA快捷键使用
工具用得好,下班下得早Ctrl + Alt + T使用if,if/else, while, do/while, for, try/catch, try/finally, try/catch/finally, synchronized, Runnalbe 包围代码块
Alt + Enter代码快速补全、包引入、临时变量生成等
Ctrl + Alt + M将代码块提取到一个方法
Ctrl + Shift + 上下方向键上下移动单行代码和代码块
Class.new + (Alt + Enter)Class.new创建一个Class类型的匿名对象,Alt + Enter将匿名对象赋值给一个新建的变量
instance.try根据instance实例对象快速生成try/catch代码块
Linux服务器重启后mysqld.service未创建/var/run/mysqld
一、问题背景开发环境的数据库服务器重启后,启动MySQl服务报错,错误如下:
[ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
[ERROR] Can't start server: can't create PID file: No such file or directory
之前看到上面错误日志都是手动创建/var/run/mysqld目录,然后将目录的属主修改为mysql用户,如下:
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
上面方式,每次服务器重启后都要重新执行,所以分析一下问题原因,探索一种永久的解决方案。
MySQL版本信息m ...
怎么用“福格行为模型”战胜拖延症?
说明:本文转载自 怎么用“福格行为模型”战胜拖延症?
去年年底,我们有一期节目是讨论新年该立一个什么样的flag才人间值得,当时我给你的提议是:立一个不光自己变好,也要让别人从中受益的flag。
老实说,设定这样一个目标并不难,难的是如何完成它。我看到一个说法很有意思,说当代人立flag的现状是“今年立的flag,就是完成去年承诺的、前年没做到的、大前年立下的flag”,你说说,这让人情何以堪啊。于是,有人干脆就不敢定目标了,怕打脸。
到底是什么阻碍我们完成这些目标呢?除了客观原因之外,我想最大的拦路虎就是拖延症了。我身边很多朋友都饱受拖延症的困扰,包括我自己。明明是重要的事,也制定了计划,却总是无法按时完成。更可怕的是,打脸多了,自我评价变低,还容易掉入负面情绪的旋涡。
要怎么打败拖延症呢?我最近在36氪的神译局栏目里看到一篇文章,很受启发。文章来自一个国外专门研究拖延症的网站,叫Deprocrastination,标题是《如何用福格行为模型治疗拖延症》(How to stop procrastinating by using the Fogg Behavior Model)。读 ...
RocketMQ中ConsumeFromWhere详解
一、ConsumeFromWhereRocketMQ的Consumer有一个consumeFromWhere属性,表示Consumer启动后将从哪个位置开始消费消息,该属性取值有以下情况:
/**
* Consuming point on consumer booting. There are three consuming points:
* CONSUME_FROM_LAST_OFFSET: consumer clients pick up where it stopped previously. If it were a newly booting up consumer client, according aging of the consumer group, there are two cases:
* if the consumer group is created so recently that the earliest message being subscribed has yet expired, which means the consumer grou ...
RocketMQ中的Consumer及ConsumerGroup详解
一、基本概念消息消费者(Consumer)负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从Broker服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。
消费者组(Consumer Group)同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。
集群消费(Clustering)集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。
广播消费(Broadcasting)广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息。
二、订阅关系一致订阅关系一致指的是同一个消费者Group ID下所有Consumer实例所订阅的Topic、Tag必须完全一致。如果订阅关系不一致,消息消费的逻辑就会混 ...