tcmalloc浅析

  最近学习了tcmalloc机制,它是go里面用到的内存分配机制。本文参考tcmalloc,加上一部分自己的理解。 tcmalloc VS ptmalloc(glibc 2.3 malloc)   对于小内存来说,tcmalloc提供线程级别的内存分配,这样就减少了线程之间的竞争,ptmalloc2也提供线程级别分配,但是它的内存被分配到某个线程后就不能重新分配给别的线程,这造成了较大的资源浪费。对于大内存来说,tcmalloc也采用了细粒度且高效的分配策略。   在2.8 GHz P4环境下,tcmalloc执行小内存malloc/free的时间大约为50ns,小于ptmalloc2的300ns。   另外在空间利用上,tcmalloc额外空间比较少,N个8字节的对象占用的总空间大概为8N*1.01,而pt…

Read more

go并发需要注意的问题

  用go写并发的确很方便,协程相比于线程轻量很多,关于协程与线程的区别,可以参考我的这篇博客:go中的协程与线程的区别。本文主要讲一下一些并发中应该注意的坑,学习go没多久,可能有认知不到位的地方,欢迎指正。 1. channel   go中通过channel进行消息通信,channel函数传参通过引用实现。go中有2种channel,分别是无缓存的channel(unbuffered channel)和有缓存的channel(buffered channel),前者cap为0,后者大于0。无缓存的channel主要用于同步:生产者写入channel然后阻塞,直到消费者读取后,生成者才从阻塞状态返回;有缓存队列适用于异步:在队列为满的情况下(len < cap),生产者将消息塞入channel就返回。   由于go存在垃圾…

Read more

go中的协程与线程的区别

  对用户来说,协程与线程几乎没什么区别,但是实际上还是有一些区别的。   说明:本文对协程和goroutine,OS线程和内核线程都是一个概念,未加区分。 1. 栈大小区别   我们知道,线程是有固定的栈的,基本都是2MB,当然,不同系统可能大小不太一样,但是的确都是固定分配的。这个栈用于保存局部变量,用于在函数切换时使用。但是对于goroutine这种轻量级的协程来说,一个大小固定的栈可能会导致资源浪费:比如一个协程里面只print了一个语句,那么栈基本没怎么用;当然,也有可能嵌套调用很深,那么可能也不够用。   所以go采用了动态扩张收缩的策略:初始化为2KB,最大可扩张到1GB。 2. goroutine没有id   每个线程都有一个id,这个在线程创建时就会返回,所以可以很方便的通…

Read more

golang net/rpc源码分析

  为什么需要rpc框架?一次rpc需要指定调用的方法,参数,接收返回值。如果没有rpc框架,裸写tcp,什么时候知道报文传递完毕的界限。最简单我们可以搞个私有协议,TLV格式指定:T(type)指定类型,L(length)指定长度,V(Value)指定值,但是这个也会带入一些问题,比如规范问题,不同服务提供不同协议,这不乱套了吗;另外还有效率问题,比如我要传递一个数组怎么传?基于以上几个问题,rpc框架出现了,rpc框架采用序列化操作将请求和返回在发送端进行序列化,然后在接收端进行解序列化达到目的,如下图所示,图片来自博客。 服务调用流程如下: client调用client stub,这是一次本地过程调用 client stub将参数打包成一个消息,然后发送这个消息。打包过程(序列化)也叫做 marshalling client所在的系统将消息发送给serve…

Read more

golang实现mapreduce单进程版本

  元旦放假的第一天,在家没事干,用golang实现了一下mapreduce的单进程版本,github地址。处理对大文件统计最高频的10个单词,因为功能比较简单,所以设计没有解耦合。   本文先对mapreduce大体概念进行介绍,然后结合代码介绍一下,如果接下来几天有空,我会实现一下分布式高可用的mapreduce版本(1月6日update:这个主要看需求,1.如果master挂了,当前执行的任务丢了就丢了,接下来下发的任务还能执行,那么这个很好实现,可以做多个Master,每次任务分发给一个master执行,北向搞一个负载均衡器就可以,或者弄一个注册中心;2.如果要高可用指的是已经执行的mapreduce任务在主master挂掉后仍然继续执行,那么多个master之间需要做数据同步,可以用Redis或者kafka做消息同步,但是有种过度设计的感觉…

Read more

go https example

  本文首先大概介绍一下https的协议原理(其实是TLS协议原理),然后给出构建https的go代码例子。 1.HTTPS协议   网上已经有很多资料介绍HTTPS协议了,我归纳一下,加深自己的记忆。   HTTPS是HTTP通过SSL/TLS加密的方式进行通讯,TLS是SSL的改进版本。TLS协议可以分为握手阶段和对话阶段,握手阶段采用非对称加密方式(密钥由第三方机构提供),对话阶段采用对称加密方式(密钥由握手阶段协商得出)。   握手阶段主要分为4个步骤(细分来说,可以有多个步骤,具体查看RFC文档): 1.1 Client Hello   客户端向服务器端发起hello请求,同时带入以下信息: 客户端支持的加密方式 客户端支持的SSL/TLS协议版本号 客户端生成的随机数1,该随机数…

Read more

小谈程序员面试

  最近我的一位技术不错的同学想换工作,然后跟我吐槽在面试中碰到了一些奇怪的面试官问了一些不着边际的题目,让我这位同学很是苦恼。其实我之前一直想说说面试,但是也一直比较懒。这次听完他的谈话,结合我的一些面试别人的经验和自己被面试的经验,今天分别来谈谈从面试官角度和被面试者出发,我对一次”良好“面试的看法吧。因为我是做后台开发的,所以讲的东西可能有点偏重于后台开发,但是我觉得面试方法来说是具有普适性的。 1. 从面试官角度出发 面试题目应该覆盖足够广的程度。比如我是做后台开发的,我认为一次合格的后台开发面试应该覆盖到:数据结构&算法、操作系统、网络知识、某一门求职者擅长的编程语言。以上4个我认为是必须需要考察的,另外还有一些比如数据库、分布式、Linux基本操作等相应知识也可以进行适当的考察。不能一次面试只面操作系统,这个就没办法进行系统而全面的考察。 面试考…

Read more

线段树小结

  线段树是一种比较强大的数据结构,主要用于在动态更新区间的情况下,保持查找和更新在O(log(n))级别的时间复杂度。虽然它不是一颗完全二叉树,但构造时按照完全二叉树进行构树,没有的话叶结点留空,数组按完全二叉树构造:对于父节点编号为x,其左右儿子结点分别为:2x和2x+1。如下图所示:   Management range表示该结点的『负责输入结点』的范围,1-3表示负责输入结点1,2和3,即:in[1],in[2]和in[3]。value值表示初始化值,刚开始构造时值为0,构造之后的值为子结点的『某种运算』结果:比如,对于『求区间最小值』,则value(4) = min(value(8), value(9)),value(1) = min(value(2), value(3))`,这个在图中未标出来。图中蓝色结点为输入的结点,虚线方向为数组的输…

Read more

算法题:遍历树中m个点最少需要经过多少个结点

  给定一棵树,从树中任意结点出发,遍历m个结点,最少需要结果多少个结点,结点可以重复走。   思路:找树中最长的链,也就是树的“直径”,假设为d,如果m小于等于d,则输出m就可以了;如果m大于d,则输出d+(m-d)*2,这是因为最长链上的分支路径需要走2遍(一来一回)。那么,直径也就是最长链怎么求?先从任意一个叶子节点x出发,找到最长的路径,假设路径结尾是y节点;再以y为根,找出最长的路径,这条路径就是树的最长路径。两次dfs可以搞定了。   代码: #include <iostream> #include <vector> using namespace std; vector<int> vis; vector<vector<int>> tree; pair&l…

Read more

父进程捕获SIGCHLD信号依旧产生僵死进程

  最近自己写的一段代码出现了很多僵死进程,简约版本代码如下: #include <stdio.h> #include <string> #include <unistd.h> #include <stdlib.h> #include <iostream> #include <sys/wait.h> #include <pthread.h> using namespace std; int cnt = 0; void sig_handler(int signo) { pid_t pid; int stat; pid = wait(&stat); cout << "cnt:" << ++cnt << ", pi…

Read more

Broadview功能简介

  Broadcom最近推出了他们的新产品broadview,提供telemetry的监控方式,将问题定位至芯片级别,其架构如下:   在交换机侧加入agent,提供对芯片级别的操作:包括信息采集以及报文注入等,北向提供REST接口提供信息交互,控制器侧提供操作的具体逻辑。其官网介绍的功能如下: Buffer statistics tracking Packet tracing and injection Black hole detection Performance metrics for BST Drop counters due to congestion Support for StrataXGS and StrataDNX silicon families Reference implementation for applications…

Read more

数据中心网络监控小结

  最近调研了一些关于数据中心网络监控的论文和解决方案,主要关于丢包和延时的定位排查,现在telemetry的技术比较火热,写点东西小结一下,越来越懒得写博客了,写的不是很详细,特别是后面几篇,也可能有理解不到位的地方,欢迎指正。 1. Pingmesh   Pingmesh是微软在2015年提出的,其架构模式在那之前已经在微软的数据中心运行了超过4年,采用商用交换机,每天收集10TB的延迟数据。它能够解决以下三个问题: 定位业务的延迟是否因为网络 提供并且跟踪当前网络服务水平(service level agreement ) 自动排除障碍   微软数据中心采用CLOS架构,如下图所示。拥有的规模如下:服务器规模在10万级别,交换机规模为万,服务器上联万兆。论文中阐述的一些统计和架构如下:时延统计采用端到端,中控系统为微软自己的…

Read more

OpenDaylight中DataStore Tree Notification示例

  DataStore有三种监听事件DataChangeListener、DataTreeChangeListener和DOMDataTreeChangeListener,他们具体的区别可以参考这篇博客,本文主要介绍一下DataTreeChangeListener。DataTreeChangeListener可以用来监听整棵树或者某个子树,子树结点的改变将引发由该子节点递归到根结点整个支路结点都发生改变,原理是version号的变化,具体可以参考我之前的博客。 实验 yang文件   包含多级container的yang文件定义如下: container threshold { description "Threshold configuration"; container temperature {…

Read more

memcpy, memmove和copy/copy_if/copy_n/copy_backward的区别

  在C++中有多种方式可以进行数据拷贝,但它们实现的方式略有不同。 memcpy   memcpy原型如下,其以字节为单位,可以用来拷贝非重合区域。也就是说如果拷贝的源、目的有重合部分的话,结果是undefined,意味着可能偶尔也是对的。但最好不要这么做,原则上memcpy是一种后向拷贝机制:从区间的最后一个元素开始进行拷贝,直到第一个元素。 void* memcpy( void* dest, const void* src, std::size_t count ); memmove   memmove可以支持重合区域的拷贝,其实现可以理解为memmove用另外一块buffer缓存src数据,然后往dst拷贝。但实际上并不是这样,代码在输入时会进行判断:如果src地址小于dst地址,进行后向拷贝;反之如果src地址大于ds…

Read more

OpenDaylight DataStore分析

  网上关于DataStore内部架构和实现细节太少了,大部分都是讲如何使用DataStore,而很少有分析从client开始读写到内存到硬盘的数据流,也没有相关性能分析之类的。由于不能满足『知其所以然』的需求,我只能自己看了。然而,官方的文档真的是杂而乱,在社区问了几个问题也没有反馈……无力吐槽了。以下是我吐血看文档和源码总结的,版本为Beylium,如果有不当之处,希望各位指出。   本文首先简单讲一下MD-SAL的大体架构,然后介绍DataStore内容,包括其内存db和硬盘db。内存db也就是所谓的In-Memory-DataStore主要存储两棵树:Operational Tree和 Config Tree。硬盘db对内存db序列化后写入硬盘,包括snapshot和journal两部分,用于重启后恢复内存db。 1.MD-SAL &emsp…

Read more

NeXt UI Tutorial Supplement

  NeXt is an awesome toolkit developed by Cisco. It is an HTML5/JavaScript based toolkit for network web application which can be used to draw network topology, e.g., data center, laboratory network experiment. It has been added in OpenDaylight community which is an open source community of SDN controller.   There are some tutorials that we can follow online like Next-Tutorials…

Read more

Python json格式化输出

  输出json格式时默认没有换行,不便于查看json结果,可以采用这样进行输出:json.dumps(ret, sort_keys = True, indent = 4, separators=(',', ': ')),进行缩进和换行,方便查看结果。 参考 http://stackoverflow.com/questions/16318543/cant-pretty-print-json-from-python…

Read more

Codeforces 374 Div 2解题报告

  codeforces越打越差,我都无力吐槽了,脑子真的赶不上当年了T_T。 A. One-dimensional Japanese Crossword   题意:挨个输出连续的B的个数。   解题:暴力即可。 B. Passwords   题意:给定一堆密码,Vanya 忘记密码,需要不断尝试,尝试的规则是:长度小的先试,长度一样的顺序不定。求Vanya 最长和最短的尝试次数,尝试k次失败后需要暂停5秒。   解题:暴力即可,注意边界情况的考虑。 C. Journey   题意:给定一个有向图,给定时间约束T,每条边有个时间长度,求在给定时间内经过点的最大值。   解题:简单的爆搜题,需要剪枝的是dist[x][node_nr] != -1 &am…

Read more

How to get return code and return data from Restangular

  Use response.status to get return code when failed and use response.plain() or Restangular.stripRestangular(response) to get return clean data without any Restangular methods. Pay attention that the .plain() attribution is supported after 1.4.0 version of Restangular. Here comes the example: Restangular.all(xxx).post(cmd).then(function(response) { //console.log(response.plain()…

Read more