- 博客(48)
- 资源 (4)
- 收藏
- 关注
原创 Paper Reading - Large-scale cluster management at Google with Borg
0. Abstract It achieves high utilization by combining admission control, efficient task-packing, over-commitment, and machine sharing with process-level performance isolation最重要的三点:装箱与调度算法,资源的抢占/rec
2017-04-01 10:53:10
686
原创 Paper Reading - In Search of an Understandable Consensus Algorithm(Raft)
0 Abstract In order to enhance understandability, Raft separates the key elements of consensus, such as leader election, log replication, and safety, and it enforces a stronger degree of coherency to
2017-04-01 10:51:44
1069
原创 Raft简单实现小结
上一周花了大部分时间重新拾起了之前落下的MIT6.824 2016的分布式课程,实现和调试了下Raft协议,虽然Raft协议相对其他容错分布式一致性协议如Paxos/Multi-Paxos/VR/Zab等来说更容易理解,但是在实现和调试过程中也遇到不少细节问题。虽然论文中有伪代码似的协议描述,但是要把每一小部分逻辑组合起来放到正确的位置还是需要不少思考和踩坑的,这篇文章对此做一个小结。Raft实现这
2017-03-20 20:51:07
3700
原创 Protobuf和GRPC(一)
数据交互协议和RPC框架对于分布式系统来说是必不可少的组件,这个系列主要用来分析Protobuf和GRPC的主要实现原理,本文主要介绍Protobuf生成代码的主要流程以及Protobuf与GRPC之间的交互方式。简要描述Protobuf Protobuf主要由三大部分构成: Core: 包括核心的数据结构比如Message和Service等等 Compiler: proto文件的To
2017-03-05 20:32:11
3950
1
原创 Runc容器生命周期
容器的生命周期涉及到内部的程序实现和面向用户的命令行界面,runc内部容器状态转换操作、runc命令的参数定义的操作、docker client定义的容器操作是不同的,比如对于docker client的create来说, 语义和runc就完全不同,这一篇文章分析runc的容器生命周期的抽象、内部实现以及状态转换图。理解了runc的容器状态转换再对比理解docker client提供的容器操作命令
2016-11-30 17:17:43
821
原创 Python主进程hang住的两个原因
最近使用Python遇到两个非常不好定位的问题,表现都是Python主进程hang住。最终定位出一个是subprocess模块的问题,一个是threading.Timer线程的问题。subprocess模块不当使用的问题Python的subprocess比较强大,基本上能替换os.system、os.popen、commands.getstatusoutput的功能,但是在使用的过程中需要注意参数s
2016-10-16 17:08:06
4634
原创 Docker
本文主要介绍Docker的一些基本概念、Docker的源码分析、Docker的一些issue、Docker周边生态等等。基本概念Basicsdocker大体包括三大部分,runtime(container)、image(graphdriver)、registry,runtime提供环境的隔离与资源的隔离和限制,image提供layer、image、rootfs的管理、registry负责镜像存储与分
2016-10-08 17:23:16
2144
原创 Linux内核-抢占
主要介绍内核抢占的相关概念和具体实现,以及抢占对内核调度和内核竞态和同步的一些影响。1. 基本概念用户抢占和内核抢占 用户抢占发生点 当从系统调用或者中断上下文返回用户态的时候,会检查need_resched标志,如果被设置则会重新选择用户态task执行内核抢占发生点 当从中断上下文返回内核态的时候,检查need_resched标识以及__preemp_count计数,如果标识被设置,并且
2016-06-18 14:28:56
3763
原创 Linux内核-容器之namespace
1. 介绍简单玩了下Linux kernel为容器技术提供的基础设施之一namespace(另一个是cgroups),包括uts/user/pid/mnt/ipc/net六个(3.13.0的内核). 这东西主要用来做资源的隔离,我感觉本质上是全局资源的映射,映射之间独立了自然隔离了。主要涉及到的东西是:clonesetnsunshare/proc/pid/ns, /proc/pid/uid_
2016-06-10 20:12:26
8113
1
原创 数论之同余
基本性质后面两个贼有用a≡b(modm)⟺a=k∗m+ba \equiv b \pmod m \iff a = k*m + ba≡b(modm)∧c≡d(modm)⟹a+c≡b+d(modm)∧a∗c≡b∗d(modm)a \equiv b \pmod m \wedge c\equiv d \pmod m \implies a+c \equiv b+d \pmod m \wedge a*c\
2016-06-04 09:02:46
817
原创 Redis源码分析
简介Redis的eventloop实现也是比较平常的,主要关注文件描述符和timer相关事件,而且timer只是简单用一个单链表(O(n)遍历寻找最近触发的时间)实现。流程主要在initServer(server.c)中初始化整个eventloop相关的数据结构与回调// 注册系统timer事件if (aeCreateTimeEvent(server.el, 1, serverCron, NU
2016-05-29 22:20:51
661
原创 Linux下的时间
时钟硬件时钟RTC(real time clock),记录wall clock time,硬件对应到/dev/rtc设备文件,读取设备文件可得到硬件时间读取方式 通过ioctl #include <linux/rtc.h> int ioctl(fd, RTC_request, param); hwclock命令通常内核在boot以及从低电量中恢复时,会读取RTC更新system ti
2016-05-16 18:13:22
434
原创 Linux下调试与性能分析工具的总结
(此文主要用来记录一些调试,性能测试与分析等工具的用法,备忘)GDB常用调试命令和调试技巧命令status info => 查看程序本身相关信息 args => 打印参数breakpoints => 断点信息files => 进程的地址空间详细内容sharedlibrary => 加载的共享库frame => 栈帧line => 当前所在行locals => 当前栈帧中的变量re
2016-05-03 18:53:34
3276
原创 Linux内核-协议栈-主要函数调用栈
本文主要记录Linux协议栈相关的主要系统调用的一些主要的函数调用栈,备忘。目前添加socket/connect1.sys_socketbsd socket layer=> sys_create net/socket.c=> socket_create net/socket.c=> __socket_create net/socket.c=> sock_alloc net/socket.cine
2016-03-26 23:29:43
1013
原创 Distributed Systems-选主与同步
在上一篇文章中讨论了leader选举对于基本Paxos算法在实际工程应用中的必要性,这一篇文章首先结合raft的选举算法谈谈leader选举的实质和常用方法,然后结合raft算法选举后的日志恢复以及《Paxos Made Simple》里lamport勾勒的multi-paxos的日志恢复来详细分析一下选主后要做的两件重要事情以及俩算法在这块的差异。1.raft的选主算法以及选主算法的实质前面一篇文
2016-03-10 21:28:43
766
原创 Distributed Systems-leader based分布式一致性协议
上一篇文章推导了基本Paxos算法,并引出了在实际使用中其存在的问题,然后说明了leader-based分布式一致算法的优势。这篇文章分析一下选主的本质,选出一个主对整个算法的影响,以及采用选主会存在的问题以及基本Paxos协议是怎么样保证这些问题不会影响一致性的。1.为什么选主至于为什么选主?个人认为有如下原因:避免并发决议导致的livelock和新丢失的问题可以采用一定方法在选主时(raft
2016-03-10 09:41:02
741
原创 Distributed Systems-一致性协议背景介绍及Paxos算法的推导
Paxos算法无疑是分布式系统理论中的经典,由于很多论文、博客都没有详细分析算法的背景以及实际中应用会产生的非常多的细节问题,所以导致很难理解,或者说很难完整理解,实现和测试则是更繁杂。本文主要基于自己的理解,以一种前因后果的较逻辑也较明白(非形式化)的方式来重新推导一遍Paxos算法,这里主要指basic paxos,而不是其他变形比如multi-paxos以及其他leader-based的分布式
2016-03-08 19:09:51
1290
原创 KMP简单证明
KMP第一遍不是特别容易理解,所以就琢磨着给出一个证明,来加深理解,所以就想出了下面这么个不是很正规和形式化的证明。关于KMP算法的流程可以搜索相关文章,比如这篇挺不错的。前提假设:目标文本串T的长度为n,模式串P的长度为m,A为所谓的next数组,i为在模式串的第i个位置匹配失败。需要证明的问题:对于形如A B X1 X2… A B Y1 Y2… A B的模式串,为什么可以将模式串直接移到最后一
2016-03-03 17:45:28
1139
1
原创 Distributed Systems-再谈2PC和3PC
之前的一篇文章感觉分析得不太完整,所以再记录点东西。故障组合情况对于多个节点且每个节点有多个可能状态参与的分布式系统来说,假设在有限的某个时间点上发生故障的概率为0,对于coordinator(proposer/master/leader等),在发送接收的一轮交互中,可能在发送消息前(t < t1),发送部分消息(t1 < t < t2),发送所有消息后并且接收消息前(t2 < t < t3),接收
2016-01-22 16:24:14
774
原创 Distributed Systems-2PC和3PC
这篇文章主要讨论下解决分布式一致性问题的两种算法:两阶段提交(2PC)和三阶段提交(3PC)。之前感觉2PC和3PC的流程挺简单的,但是真正仔细去分析过后,才发现很多的细节。而这些细节对理解Paxos,Raft,Viewstamp Replication,Atomic Broadcast等其他更复杂的一致性算法有很大的作用。所以才在此记录一下这些细节,尤其是从工程实现的角度来思考。具体的术语,像co
2016-01-21 20:35:31
1158
2
原创 Distributed Systems-Paxos
本文主要提炼了《Paxos Make Simple》中的一些主要观点,然后加上自己的理解,使用通俗的语言尝试做一些解释。关于Paxos算法背景和一致性相关问题可以参见原论文算法涉及的主要对象action 对一条记录(某个变量)的一次操作(这一点只是本人便于后面理解加上的) 这里选用操作这个词,而不是值,因为一个在对某个变量达成某个值的共识前可能已经经过多个更新操作,所以为了区别,使用操作作为每
2015-12-18 15:15:11
525
原创 Distributed Systems-Basics
This post is a simple outline about some basic(really basic) ideas behind distributed systems and I will add more (detail) stuff sometimes according to my narrow understanding. Why distributed?a singl
2015-12-02 10:41:32
686
原创 Linux内核-协议栈-从BSD Socket接口层到传输层1
本文接上一篇Linux内核协议栈-初始化流程分析,在上一篇中主要分析了了Linux内核协议栈涉及到的关键初始化函数,在这一篇文章中将分析协议栈的BSD socket和到传输层的流程。采取的方式是分析socket相关的主要系统调用。针对不同的系统调用,其到达的协议层深度可能不同,有的基本只到sock层就够了,但是有些可能需要会涉及到比如tcp的具体细节和更底层的细节。本文基本追溯到传输层的开始,再深入
2015-10-31 12:57:33
1115
原创 Linux内核-协议栈-初始化流程分析
本文主要针对Linux-3.19.3版本的内核简单分析内核协议栈初始化涉及到的主要步骤和关键函数,不针对协议的解析以及数据包的处理流程做具体分析,后续有机会再详细分析(主要是作者目前这块才涉及…)1.准备Linux内核协议栈本身构建在虚拟文件系统之上,所以对Linux VFS不太了解的可以参考内核源码根目录下Documentation/filesystems/vfs.txt,另外,socket接口
2015-10-31 10:35:16
2197
原创 Linux内核-文件系统-页高速缓存
Linux内核的VFS是非常经典的抽象,不仅抽象出了flesystem,super_block,inode,dentry,file等结构,而且还提供了像页高速缓存层的通用接口,当然,你可以自己选择是否使用或者自己定制使用方式。本文主要根据自己阅读Linux Kernel 3.19.3系统调用read相关的源码来追踪页高速缓存在整个流程中的痕迹,以常规文件的页高速缓存为例,了解页高速缓存的实现过程,不
2015-10-20 18:51:45
2021
原创 Linux内核-内存管理-内存访问与缺页中断
简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存的引入与缺页中断的具体处理流程。先介绍了用户态进程的执行流程,然后对比了内核线程,引入高端内存的概念,最后分析了缺页中断的流程。用户进程 fork之后的用户态进程已经建立好了所需的数据结构,比如task struct,thread info,mm struct等,将编译链接好的可执行
2015-10-16 18:12:12
1442
原创 Linux内核-编译与启动流程
(额…觉得Linux编译链接过程和启动过程还是有那么点作用的哈,要理清楚细节非常多…趟了不少源码…记此备忘)编译流程1.编译除arch/x86/boot目录外的其他目录,生成各模块的built_in.o,将静态编译进内核的模块链接成ELF格式的文件vmlinux大约100M,置于源码根目录之下2.通过objcopy将源码根目录下的vmlinux去掉符号等信息置于arch/x86/boot/com
2015-09-20 23:27:58
653
原创 Linux下ELF文件格式
(in English for practice^_^)In this article,I will talk about the ELF files for Linux,and their diffs as to comprehend the linking process in a diff view angle.There are many articles talking about tha
2015-09-13 21:57:33
807
原创 Linux内核-文件系统-挂载流程分析
1.根文件系统的挂载mount_root[init/do_mounts.c] create_dev(“/dev/root”, ROOT_DEV) ==> how to do this sys_unlink(“/dev/root”)sys_mknod(“/dev/root”,…)mount_block_root(“/dev/root”, flags) get_fs_names -> c
2015-09-13 21:31:09
1265
原创 PHP7源码笔记一
1.builtin types基本定义在Zend/zend_types.h和Zend/zend.h中 主要的几种:原始类型:zend_bool,zend_uchar,zend_intptr_t.. 封装的用户直接接触的类型 zend_string,zend_array(HashTable),zend_object,zend_resource,zend_function..内部使用: zv
2015-09-12 19:31:48
930
原创 机器学习简单笔记
Machine Learning Simple Notes(一些很基础的notes…)BasicsMachine LearningModel(模型) + Evaluation(评估标准) + Optimization(优化算法) + Validation(验证)Using datasets D to learn specific model G from model space(hypothes
2015-09-12 18:27:16
827
原创 SpringMVC4+Hibernate4学习笔记
(一)配置详解鉴于目前资料大多数都是基于spring3的配置,本人在最初搭建的时候遇到很多问题,由此记录下来仅供参考/* 2014-09-04 by feilengcui008@gmail.com */使用的jar文件springframework4.0.6(为了方便整个先导入)hibernate4.3.6 /required/*下所有jar 以及 /optiona
2015-09-12 15:33:19
1127
原创 一道自动机的小题
题目描述:0和1构成的二进制数,求被3除的余数 改变题目:0和1构成的十进制数,求被3除的余数 (对于改变的题目,可以求1的个数,再%3就行了,这里只是用来和二进制情况做个对比) 题解:假设二进制数表示如下 An−1An−1An−3...A0A_{n-1}A_{n-1}A_{n-3}...A_{0}写成十进制为 S=An−1∗2n−1+An−2∗2n−2...+A0S=A_{n-1}*
2015-05-26 23:29:34
710
原创 支持向量机(SVM)笔记
SVM1.概述SVM全称Support_Vector_Machine,即支持向量机,是机器学习中的一种监督学习分类算法,一般用于二分类问题。对于线性可分的二分类问题,SVM可以直接求解,对于非线性可分问题,其也可以通过核函数将低维映射到高维空间从而转变为线性可分。对于多分类问题,SVM经过适当的转换,也能加以解决。相对于传统的分类算法如logistic回归,k近邻法,决策树,感知机,高斯判别分析法(
2015-05-24 20:05:18
719
原创 Lambda与闭包
写本文的目的是通过javascript/c++11/java8/python/scala等几种语言对lambda和闭包的支持的对比,探讨下lambda和闭包的区别与联系,以及作用域的trick。在阅读这篇文章前,首先熟悉以下几个概念(有些概念不会谈,只是和本文所谈的lambda和闭包对比理解),摘自维基百科:--Closure--In programming languages, closures
2015-05-18 14:35:47
1838
原创 Y Combinator
由于匿名函数(通常成为lambda函数但是跟lambda calculus不同)在递归时无法获得函数名,从而导致一些问题,而Y Combinator能很好地解决这个问题。利用不动点的原理,可以利用一般的函数来辅助得到匿名函数的递归形式,从而间接调用无法表达的真正的匿名函数。下面以一个阶乘的递归来说明。#Python版本,后面会加上C++版本#F(f) = fdef F(f,n): ret
2015-05-14 19:26:10
1068
原创 C++ RVO/NRVO以及move语义的影响
C++返回值优化和具名返回值优化是编译器的优化,在大多数情况下能提高性能,但是却难以受程序员控制。C++11中加入了move语义的支持,由此对RVO和NRVO会造成一定影响。下面以一段代码来说明。RVO和NRVO在分别在copy/move construct,copy/move assignment八种简单情况,测试条件是g++ 4.8.2和clang++ 3.4,默认优化。#include <io
2015-05-09 13:22:40
2034
原创 PHP扩展开发-执行流程与扩展结构
在开发扩展之前,最好了解下PHP内核的执行流程,PHP其实主要包括两个方面: SAPI Zend VM 内部扩展Zend VM是PHP的虚拟机,与JVM类似,都是各自语言的编译/执行的核心。它们都会把各自的代码先编译为一种中间代码,PHP的通常叫opcode,Java通常叫bytecode,不同的是PHP的opcode直接被Zend VM的执行单元调用对应的C函数执行,不会显示保留下
2015-03-13 12:43:33
755
原创 C/C++内存对齐
有时会在c/c++中看到这种形式#pragma pack(n)#pragma pack()前一句代表设置对齐的字节数为n,而不是编译器默认的对齐字节数(ubuntu 14.04 x86_64下为8),后一句代表恢复默认值,合理地使用内存对齐能减少程序占用的内存空间,使用不当也会降低存取效率从而降低程序性能。在分析内存对齐时,只需要采用以下的原则,这里以一段代码简单解释下#include <stdi
2015-03-09 15:40:10
704
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人