自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 深入理解Python字符编码

基础知识在计算机诞生之初只需要英文字母和数据以及一些基本的标点符号就够用了,最初的版本就是用[0,128)这128个数字来表示不同的符号,所以就有了ASCII这样一套编码规范。但是后来随着计算机的普及,ASCII能表示的字符就不够了,很明显的是不支持非英文字母的语言文字,比如汉字等。所以之后就有了一个统一的、涵盖范围更广泛的字符编码规范,称之为Unicode(Q1),其中包含了多国语言,是一个国标准,目前最广泛使用的跨平台兼容的一个标准。现在编码标准有了,也就是有了数字(称之为码点,code point

2020-05-16 22:34:53 271

原创 排队理论分析

先上结论:当消费方队列足够长时,如果生产能力大于消费能力,那么在某一时刻消费方必定会对外表现出崩溃了的状况, 即所有请求都失败。假设有两个系统P(producer)和C(consumer),P是生产方,C是消费方,P-throughput(producer throughput)为P的生产能力,C-throughput为C的消费能力,C-workers(consumer work units)为...

2020-01-19 11:35:27 977

原创 IO的常识和相关优化

常识HDD的是机械盘,当跨磁道操作的时候需要机械式地寻道,平均延时很大,一般认为在10ms左右。而对于旋转延时,一般不需要太在意,因为转速都很大,相比寻道延时带来的延时比较小。Disk以sector为IO的基本单元。这意味着即使写某个sector的一个字节,也是写一个sector,sector大小一般是512B。而对于文件系统来说,目前ext4默认是4K为一个IO单元。Disk有一个默认的...

2020-01-19 11:26:37 495

原创 硬盘接口知识

一直以来都对硬盘接口方面的知识不是非常清晰,之前整理过一个小的表格,今天决定再重新仔细调研一番放出来供大家参考。一来由于网上相关的资料比较零散,非硬件玩家不是很好调研,放出来调研成果可以节省大家的宝贵时间;二来利人利己,自己记录的同时也能让大家来纠错和补缺。话不多说,上干货。名词解释ATA(Advanced Technology Attachment): 指令集、协议。【软件】PATA(...

2020-01-01 14:37:59 513

原创 深入理解Spanner事务

最近读了论文Spanner,发现其事务的实现还是蛮有意思的,设计上有一些不是很显而易见的地方,这里记录一下,希望能对更多的人有所帮助。下面先介绍一下其实现事务的基本依托和组件,之后再详细分析一下其事务的实现。引子目前数据库的数据模型基本上都是MVCC的模型,读不需要上锁,基于快照即可,写的话也不需要in-place地更改,对IO来讲也是很友好的,具有很好的性能。另一方面,对于数据库的串行化技术...

2019-12-30 14:06:27 1128 1

原创 TiDB悲观事务细节的深入思考

本文讨论一下关于TiDB在知乎发布的悲观事务设计的一些实现细节的思考,记录下来免得忘了,下面以QA的形式描述。Q1: 中提到“对于读请求,遇到这类悲观锁的时候,不用像乐观事务那样等待解锁,可以直接返回最新的数据即可(至于为什么,读者可以仔细想想)”,怎么理解?A1:先说一下具体的实现。一个直截了当的想法:悲观事务模型锁的性能必须好,否则在Percolator的基础之上再加一层锁,就3个RP...

2019-12-17 11:32:44 813 5

原创 Raft之WAL并行性

对于热点一直是难题,虽然有cache层面来缓解热点,但对于一致性要求高的场景还是需要持久化,较难处理热点问题,因为热点有着突发性并且分裂有着滞后性,也没办法通过超细粒度的partition分割做热点切分,一个是因为我们总要在时间和空间复杂度上有所控制(考虑meta体量),一个是有时候也较难预测。另外有些partition不太好切分,在逻辑上可能有着亲缘性,物理上就尽量要做到locality。Par...

2019-11-20 09:42:44 1013

原创 File system IO可靠性

怎么能写出可靠地数据持久化引擎?假如你是基于VFS来做,那么下面这几点posix规范下的问题点很重要。保证持久化的话,需要调用fsync。但也不是百分百OK,fsync只能保证数据到达了disk,由于disk有缓存,如果是write back(写缓存异步刷)而非write through(直写持久化)的策略,断电是不一定持久化了的。但企业硬盘特别是RAID卡一般都有备用保护电池。另外,也有指令...

2019-09-02 13:39:32 241

原创 服务更新的思考

分类从更新的对象角度看,涉及两个主要方面:一个是程序二进制可执行文件的更新,一个是程序执行时的配置文件的更新。从更新所造成的可用性影响上看,有冷和热两种两种方式冷更新:停服务,更新,恢复服务。从流程上看,是有一段时间服务处于不可用状态的,这对于游戏或者一些可用性要求较高的公有服务其实是不可接受的。热更新:服务正常运行,不需要停服务更新。是提升用户体验的一个非常有效的手段, 小...

2019-09-02 13:34:28 352

原创 深入理解SSI事务设计

有时间总结一下,先占个坑。

2019-08-18 19:33:09 424 1

原创 深入理解分布式事务Percolator(三)

实现篇本篇详尽地讲述一下分布式事务Percolator的具体实现,充分地考虑了工程问题。如果你是分布式的新手,相信在消化吸收之后会有一套自己对分布式事务以及分布式系统的注意点和设计有一个更深刻的认识。这里以我设计的表格存储事务为例。数据模型datalockwritekey{encoded_key}{start_ts}{encoded_key}{encoded_k......

2019-08-18 19:14:37 1255

原创 分布式事务分类和模型

分类刚性事务(如单数据库)完全遵循 ACID 规范,即数据库事务正确执行的四个基本要素:•原子性(Atomicity)•一致性(Consistency)•隔离性(Isolation)•持久性(Durability)柔性事务(如分布式事务)为了满足可用性、性能与降级服务的需要,降低一致性(Consistency)与隔离性(Isolation)的要求,遵循 BASE 理论:•基本业务可用...

2019-08-18 18:39:45 1070 1

原创 深入理解分布式事务Percolator(二)

思考篇本篇为入门分布式事务之后,再对Percolator的设计细节做一个深究,整体文档采用QA的方式来组织。下一篇再对实现做一个极致细节地思考,包括对paper中未提到的GC以及一些工程上需要考虑的点做说明。Q: Percolator的读一行数据的时候,如果该行数据有锁,是需要等待的,而不能直接把小于等于其start_ts的无锁数据返回。简单来看,直接返回小于start_ts的无锁的数据,......

2019-08-18 12:45:34 1172

原创 Raft之状态机并行性

一致性协议需要保证的两个特性1、 保证复制组状态机的一致性2、保证线性一致性对于上述两个性质的保证,paper中标准做法是:majority replicas的log是一样的,是leader-base的。对于所有commit的日志,都按序应用到状态机,这样做的话显然能满足上述特性1和2,因为按序应用,状态机之间一定一致(这就囊括了redo时的一致性,因为follower都等价于redo),另...

2019-07-28 11:33:31 1629

原创 深入理解分布式事务Percolator(一)

什么是分布式事务假如你是一个先了解过分布式一致性,后接触分布式事务的人,那估计很容易混淆这两个概念。因为本质上都是为了宏观数据上的一致性,那么既然有了分布式一致性协议,比如paxos/raft,为什么还要搞分布式事务呢?一般来讲,一致性协议保证的是某一数据实体的多副本之间的一致性;事务保证的是不同数据实体之间关系的一致性。下面举各自可能面对的场景的例子来说明一下:一致性协议有一个逻辑数据......

2019-03-15 15:19:45 7382 3

原创 初识TLA+(一)(TODO)

背景简介在学习Raft论文的时候,接触到了一个概念,那就是TLA+。看着一堆数学符号,说能从理论上证明Raft的正确性,对于做了IT几年的我掌握单元测试和集成测试的我,还是有一种莫名其妙的惊喜。要知道,当时我们在做分布式存储的数据层时采用的一致性模型是副本间强一致的一致性模型,没有应用任何分布式一致性算法。进而引出一个问题:在副本需要做迁移的时候,有着复杂的状态需要去设计和实现。迁移中、删除中、...

2018-12-11 11:45:49 3545 3

原创 分布式存储系统块4M(小) VS 64M(大)

4M(小块)的优势降低网络抖动、disk故障等情况对请求成功率的影响:逻辑块越大,整体完成的失败率越高,可用性越低。提高读取速度:同一文件可以被切割的更加细碎,分散到更多的物理机在读取的时候并发地做。降低了排队负载:请求排队时每个请求都不大,处理时长不长,降低了后续请求的排队时常。降低了range读取时做校验时的成本:可以以更小的粒度存储校验码,之后读取小粒度数据并做校验。提高了ran...

2018-10-19 10:52:45 635

原创 Raft优化

副本跨2个AZ这种情况下必定3副本中有两个副本在一个AZ,另一个副本在另一个AZ。那么我们可以在创建复制组的时候给复制组贴一个标签,2个副本的标签为可参与选主,另一个副本永远不可以发起选主。这样优化的好处是写的时候不会收到跨机房网络的影响。当然,在副本位置变更时需要更新标签。从读取论文中从副本是不可以读取的,主的话有发心跳确认主身份后读取和租约期内的读取两种方法。这里提出一种方法,可以做到保...

2018-10-19 10:50:03 1043 2

翻译 CONSENSUS:BRIDGING THEORY AND PRACTICE 总结(TODO)

目前为止本论文的核心内容都翻译完了,剩下的部分对于工程实现来讲意义不大,就不翻译了。在这里顺便说一下剩余章节有价值的内容,也再总结一下作为完结。...

2018-08-13 13:35:05 560

翻译 CONSENSUS:BRIDGING THEORY AND PRACTICE(第6章)

客户端交互集群发现请求的路由实现线性化语义更有效地处理只读请求使用时钟减少只读请求的消息讨论

2018-08-04 16:56:43 624 1

原创 CMake常用特性

debug/release 1、CMakeLists.txt中添加如下两行 set(CMAKE_CXX_FLAGS_DEBUG “$ENV{CXXFLAGS} -O0 -Wall -g -ggdb”) set(CMAKE_CXX_FLAGS_RELEASE “$ENV{CXXFLAGS} -O3 -Wall”) 2、生成Makefile的时候这样做 “ cmake -DCMAKE_BU...

2018-08-04 09:59:15 268

原创 文件删除/打开的一点知识

linux ext4一个文件有两个引用计数:打开的文件描述符引用计数和硬链接引用计数。当unlink一个软连接时,软连接当即被删除,文件还在。当unlink一个硬链接时,文件的硬链接引用计数减一。如果硬链接引用计数为0了,则文件系统中看不到这个文件了(无法再打开)。如果文件描述符引用计数不为0,则当前正打开的文件描述符依然有效,并且文件系统上的空间不会被回收直到文件描述符引用计数为0了...

2018-05-11 16:22:49 221

原创 GCC常用知识

–ThreadSanitizer检查data race Data Race是指多个线程在没有正确加锁的情况下,同时访问同一块数据,并且至少有一个线程是写操作,对数据的读取和修改产生了竞争,从而导致各种不可预计的问题。–内存预取 __builtin_prefetch 通过gcc指令让系统预取一部分主存内容到cpu cache中 http://stackoverf...

2018-05-11 16:18:50 310

转载 GCC ABI

https://wiki.gentoo.org/wiki/Upgrading_GCC/zh-cn#.E4.BB.8B.E7.BB.8D本文档将指导用户完成GCC的升级。 Contents [hide] 1 快速开始 1.1 介绍 1.2 Short version 2 GCC upgrading explained 2.1 介绍 2.2 libtool 和 fix_libt...

2018-05-11 16:17:43 1660

转载 mmap vs regular IO

https://www.quora.com/How-is-a-mmaped-file-I-O-different-from-a-regular-file-I-O-with-regard-to-the-kernelIn Linux, there’s something called a page cache (the one you say which is an in-memory radix...

2018-05-11 16:15:16 303

原创 disk性能测试

fio -ioengine=libaio -bs=32k -direct=1 -thread -rw=randread -size=10G -filename=fio_randread_test.txt -name=’MyTest’ -iodepth=4 -runtime=60fio -ioengine=libaio -bs=32k -direct=1 -thread -rw=randwri...

2018-05-11 16:14:09 1081

原创 tcp握手失败可能的原因

nf_conntrack会导致iptable跟踪表(它不仅仅为NAT映射服务)满,丢包。如果不需要iptable的功能,那么就去掉这个功能。 http://www.10tiao.com/html/488/201701/2247484116/1.html...

2018-05-11 16:11:34 6195

原创 nginx配置过程描述

ngx模块的类型 ngx有两种模块类型,一个ngx框架定义的核心级别的core module,一个是系列模块内的级别的模块类型。只有ngx的core module才会被ngx_core_module(nginx.c中的全局的core module)管理,ngx的core module同时也是系列module的配置解析初始控制模块,管理着系列module的根配置ctx的初始化。ngx的core ...

2018-05-11 16:09:15 234

原创 lib lib32 lib64等lib文件夹的说明

/lib 最基本的共享库和内核模块。 目的 -> 存放用于启动系统和执行root文件系统的命令的如/bin /sbin的二进制文件的共享库,或者存放32位,或者64位(file命令查看)。/lib、 /usr/lib、/usr/local/lib 目的 -> 就是为了区分32位和64位而设置的目录。这种情况下/lib有可能是其符号链接。/usr/lib、/usr/local...

2018-05-11 16:06:51 13864

原创 nginx处理一个连接的过程

过程拿rtmp系列模块举例说明,其他系列模块类似,大同小异,比如http,由此推到即可。解析端口 ngx_init_cycle函数发起cycle初始化,程序启动加载配置,解析到server块配置项(cmd的类型为block)的时候,其下会有直属的listen配置项,这个配置项由系列模块的core模块(ngx_rtmp_core_module)来解析。在解析rtmp块配置项的时候产生了rtm...

2018-05-11 16:05:01 1580

原创 epoll事件触发时机

LT mode EPOLLIN : 读缓冲区有数据,那么调用eoll_wait就会返回。 EPOLLOUT : EPOLLIN返回就会返回EPOLLOUT;或者写缓冲区可写。ET mode EPOLLIN : 读缓冲区由无数据到数据,那么调用epoll_wait就会返回。 EPOLLOUT : EPOLLIN返回并且此时缓冲区可写就会返回EPOLLOUT;或者写缓冲区由不可...

2018-05-11 16:03:04 1524

翻译 CONSENSUS:BRIDGING THEORY AND PRACTICE(第5章)

日志压缩

2018-05-01 19:53:35 811

翻译 CONSENSUS:BRIDGING THEORY AND PRACTICE(第4章)

第4章 集群成员变更截止到现在我们假定集群的配置(参加一致性算法的servers)是固定的。在实践中,偶尔是有必要更改配置的,例如当server故障或者改变复制组级别的时候需要做替换。这可以通过手动来做到,通过如下两个方法:可以通过停止集群,然后更新配置,再重新启动集群来做到配置的变更。然而在改变的过程中集群会处于不可用状态。可选择的,新的server可以沿用其要替换的server的网...

2018-04-20 14:03:29 1304

翻译 CONSENSUS:BRIDGING THEORY AND PRACTICE(第0~3章)

译者序本文是对Raft论文《CONSENSUS:BRIDGING THEORY AND PRACTICE》Raft相关内容的翻译。其中不包含前言介绍、算法证明、教学/学习方法以及不同一致性算法间的比较章节,只包含了Raft本身以及相关优化章节的部分。之前已经有人翻译了Raft小论文,可以参考https://github.com/maemual/raft-zh_cn ,本文第0章中的内容就是引用...

2018-04-14 18:10:13 3353

原创 全面了解linux TCP/IP协议栈

简要说明 自从熟悉了linux socket编程(主要做posix socket的TCP/IP)之后,就一直以来就想写一篇对TCP/IP有一个比较全面的涵盖用户空间、内核以及网卡的文章,以便帮助大家在遇到基于socket的TCP/IP问题或困惑时能进行有目的的、恰当的分析以便解决问题。只是一是本人上学时是个“不学无术”的不良少年。工作后自己也是不断学习中,还有比较忙(都是懒的借口吧,不然怎么还有时间

2017-09-03 19:17:03 26229 9

原创 page cache和buffer cache的关系

本篇作为kernel对内存的管理、page cache和buffer cache总结,会尽力描述出文件cache的一幅清晰画面。片尾还会介绍一下通过disk文件对齐来优化性能的方案。介绍  我们知道,硬盘的扇区大小为512bytes(至于为什么要这么设计,请参考Data alignment漫谈的背景介绍),而文件系统比如说ext4默认是以4k对齐,也就是说文件系统的一个inode对应了disk的8个

2017-04-22 09:59:52 4180 2

转载 page cache

上次我们考察了内核如何为一个用户进程管理虚拟内存,但是没有涉及文件及I/O。这次我们的讨论将涵盖非常重要且常被误解的文件与内存间关系的问题,以及它对系统性能的影响。提到文件,操作系统必须解决两个重要的问题。首先是硬盘驱动器的存取速度缓慢得令人头疼(相对于内存而言),尤其是磁盘的寻道性能。第二个是要满足’一次性加载文件内容到物理内存并在程序间共享’的需求。如果你使用进程浏览器翻看Windows进程,就

2017-04-22 09:41:06 2179

转载 内核是如何管理内存的

本片是转的站内人翻译的国外的博客。英文原链接为: http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/ 站内翻译连接为:http://blog.csdn.net/drshenlei/article/details/4350928在仔细审视了进程的虚拟地址布局之后,让我们把目光转向内核以及其管理用户内存的机

2017-04-22 09:34:27 597

原创 linux tcp三路握手详解

可能很多人都觉得自己懂tcp的三路握手,他知道那么三下子如下图。        但我更想问,你知道这些有个卵用。。。能排查出连接问题吗?可能你觉得用wireshark啊,tcpdump啊抓包能分析,但是你不了解协议栈怎么实现的,是很难做到良好的分析的。本文就告诉你,到底握手的过程中协议栈是怎么一步步处理的。 协议栈处理过程 假设server的半连接和连接队列都是空的,过程如下。 cli

2017-04-21 20:17:24 1030

原创 多收发对列的网卡的中断与cpu亲缘关系绑定

特此声明:转载需要说明且附上本人链接!  cpu通过硬中断获取硬件事件。每一个网卡的队列都会有一个中断号,当有数据流入的时候,会产生一个硬中断,linux的默认的策略是通过irqbalance这个服务分配网卡中断(考虑线上机器的系统都会是大于等于2.4 kernel)。但是这个irqbalance并不好,会有中断在核间流动(不可控)和有时分配不均的情况(irqbalance的策略可能不是很好),使得

2017-04-21 18:46:10 2205 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除