- 博客(40)
- 收藏
- 关注
原创 MongoDB 执行计划 & 优化器简介 (上)
最近,由于工作需求去了解一下Query是如何在MongoDB内部进行处理,从而丢给存储引擎的。里面涉及了Query执行计划和优化器的相关代码,MongoDB整体思路设计的干净利落,有些地方深入挖一下其实还是能有些优化点的。本文会涉及一条Query被parse之后一路走到引擎之前,都做了那些事情,分析基于MongoDB v3.4.6代码。由于篇幅过长,文章分为上下两篇,分别介绍执行计划 & ...
2018-09-28 18:24:28
1436
原创 MongoDB WiredTiger 存储引擎cache_pool设计 (下) -- 实践篇
之前的文章《MongoDB WiredTiger 存储引擎cache_pool设计 (上) – 原理篇》和大家分享WiredTiger的整体架构和Cache Pool相关的设计,这篇来介绍下阿里云MongoDB线上出现的问题,及改进措施。
2017-02-17 14:07:52
3983
原创 MongoDB WiredTiger 存储引擎(1) cache_pool设计
0. 前言最近由于工作需要,阅读了WiredTiger部分代码,感觉有的地方还是很值得学习的,准备搞个系列文章,笔者不是精通WiredTiger的大神,国内对WiredTiger深入分析的人不多,只是想在这里跟大家一起讨论一起学习。笔者在Gitlab上建了一个WiredTiger代码注释版本,基于v2.8.1,如有问题大家可以在Gitlab留言,issue!1. MongoDB 多引擎体系 – Wi
2017-01-20 20:54:27
3656
原创 Nesty 高性能轻量级Http Restful Server
Nesty 轻量级Http Restful Server,通过Netty NIO非阻塞实现IO的高并发和异步,非侵入式编程。支持类SpringMVC的HTTP注解,可以平滑前移,开发成本低
2016-04-06 15:32:36
8970
1
原创 分布式系统设计系列 -- 基本原理及高可用策略
分布式系统设计系列之 -- 基本原理及高可用策略篇这篇文章主要介绍一些入门的概念和原理,后面带来一些高可用、数据分布的实践方法!
2014-07-03 21:16:47
37606
2
原创 分布式系统设计系列 -- 概要
在现在的“大数据”、“云平台”这些前沿技术的背景下,衍生了很多平台型技术点,Nosql、Hadoop、Storm等层出不穷。这些华丽的技术后面其实处处都离不开“分布式”这个虽然提出了很久,但是大数据、云计算带火了的技术。以致于开个玩笑说,如果不懂一些“分布式"下的技术和原理的,会有点不好意思说自己是后端开发 -- (玩笑而已!! ^_^)。
2014-07-03 19:22:50
3657
原创 Linux -- 内存控制之oom killer机制及代码分析
线上一些内存占用比较敏感的应用,在访问峰值的时候,偶尔会被kill掉,导致服务重启。发现是Linux的out-of-memory kiiler的机制触发的。
2014-04-18 15:04:29
40575
原创 Java -- ExecutorService线程池触发的Full GC问题排查
今天在线上Java代码里,处理了一个由ExecutorServicec线程池引发的问题,将处理过程和一些调试沉淀下来。分布式任务处理模块中,有一个Java daemon进程,通过队列接受Java代码描述的任务(jar),产生子进程(单独的JVM)class loader,处理定义的Java代码,并收集日志、处理结果等,子进程数量在百级。
2014-04-02 19:55:10
9133
转载 Linux -- Pagecache 文件缓存特性
今天看@褚霸的博客,看到了几篇关于pagecache、slab的几篇好文章,转一下!原创文章,转载请注明: 转载自系统技术非业余研究本文链接地址: Linux下谁在消耗我们的cacheLinux下对文件的访问和设备的访问通常会被cache起来加快访问速度,这个是系统的默认行为。 而cache需要耗费我们的内存,虽然这个内存最后可以通过echo 3>/proc
2013-09-30 13:05:54
10363
转载 MySQL性能优化的最佳20+条经验
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。1. 为
2013-07-31 16:07:50
1786
原创 Java -- Hotspot虚拟机调优与GC垃圾回收策略
(先扯扯Java,热热身) 论坛上,经常看到有些人讨论c、c++、java哪个更快,哪个更主流等的口水贴,吵的乐此不疲。其实个人感觉Java 1.6之后性能和开发效率都提高了不少,虽然不像直接编译成机器码的语言一样,但是Java特有的JVM动态优化器、JIT即时编译器对热点代码都提供了动态编译和即时优化,而且开源的库也比较多,开发效率也比较高。不过,Java在高性能IO、大内存使用上还是有些自
2013-07-16 18:49:12
8340
1
原创 分布式选主 -- 利用Mysql ACID和Lease协议实现选主和高可用
在实际生产开发中,遇到一些多节点共存,需要选主,并且要实现HA自动容错的场景,思考了写方法拿出来和大家分享一下。Lease协议,Mysql ACID高可用选主方案设计适用场景Java语言实现描述进一步优化 系统中有很多应用场景要类似主从架构,主服务器(Master)对外提供服务,从服务器(Salve)热备份,不提供服务但随时活着,如果Master出现宕机或者网络问题,Sl
2013-05-23 18:13:00
10413
2
转载 Java如何实现多态性,基于itable, vtable源码分析
在Java实现中我们常使用多态性,在java里主要是通过itable, vtable来实现准确的跳转。Vtable: 虚拟函数表该类所有函数自有函数(除了static, final)和 父类的函数虚拟表。结构:vtableEntry | vtableEntry |vtableEntry...是以vtableEntry 结构体的数组顺序结构,在每个entry
2013-05-03 12:36:25
2443
原创 Java -- common基础类库Google Guava和Guice
很久没更新文章了,最近忙于系统上线,同时拾起来一年多没写过的Java,做一些平台化,系统组件的开发。之后准备通过拜读一下HBase的代码来提升自己对Java的认识。以前写c/c++时,可选的Base库并不是特别多,boost、libev、libaio取之可数。最近用到了写Java的基础框架的库(SSH之类的就不说了),比如MyBaties、DBCP、Guice、Guava等。准备拿出些比较经典的和
2013-03-21 15:35:48
8034
原创 C/C++ -- 编程中的内存屏障(Memory Barriers) (2)
在前面的文章里,主要介绍了一下内存屏障的基本认识,和基本原理。本文针对之前的思路继续聊一聊该如何处理相应的问题,以及一些多线程程序编程的技巧。 1. Volatile关键字 2. Linux pthread线程锁 3. Linux gcc 4.2之后的__sync_fetch_and_add 4. 双Buffer实现Lock fr
2012-11-29 12:47:53
7666
3
原创 C/C++ -- Lib库文件nm调试之符号表
本文主要介绍了一下在Linux下开发c/c++时候,不可避免的会开发或者生成.o .a .so这种中间库状态的文件(可能是自己写了一个lib让别人调用,或者提供.c/.cpp文件嵌入别人的Makefile工程)。如何查看这些库文件的一些基本信息。有时候大家编译程序时候(确切的说是链接器链接的时候)很多错误例如"undefine reference",之类的常见错误,原因就是因为没有找到.o .a
2012-11-23 13:02:33
9820
原创 C/C++ -- 编程中的内存屏障(Memory Barriers) (1)
明天就要transfor去做检索引擎了,今天闲下来了,更新一下博客哈。之前 @高V 同学对本人之前《代码技巧及优化(c/c++)》的文章第六条,有关cache命中和cpu流水优化比较感兴趣,也提出了一些他的看法,今天,我就细化的说一下某些编程的点 -- 内存屏障,以及内存屏障对代码的影响。 OK,首先来说一下什么是"内存屏障",可以先看一下官方式的说法 http://www.ker
2012-11-21 14:45:19
14676
原创 UtilBox(ub)基础组件 -- ConfigureLoader文件配置读取模块
好久没更新博客了哈,今天抽空把之前写了一部分的东西拿出来继续分享。 linux的getopt()和getopt_long()大家都用过,读取命令行参数,比如./test -h 127.0.0.1 -c 100 --port 8080类似这样的。好多脚本语言python,shell这样获取比较简单直接sh就可以了(比如echo "./server --start --port 8080
2012-11-13 17:45:53
2207
原创 大数据过滤及判断算法 -- Bitmap / Bloomfilter
今天,有个同学向我咨询大数据的一些面试题,其中一类比较有代表性比如判断是否在集合内,比如10个url,判断一个url是否在集合内,还比如有个1~100万个连续无序数字,随机取出里面的N个,求这N个数字等等。这类问题都需要一个大的数据集合,而且每个数据单元都很小,比如一个int 。很大程度上,这类问题可以用Bitmap或者Bloomfilter来做,基本思想就是开辟一块大内存,然后利用一个byte里
2012-09-24 15:48:01
17938
原创 UtilBox(ub)基础组件 -- 并发任务队列Taskqueue/TaskDispatcher (一)
Task dispatcher, 任务分发队列,也可以叫做Taskqueue。之前好多同学看到这篇文章内容是“.....”,我是想做一个标记,想写这篇文章,但是没填内容,看的同学还挺多的,以为我是标题党,这里首先表示一下歉意。下次不会了哈。 1. Taskqueue模型简介 2. Taskqueue的用处和优势 3. Taskqueue
2012-09-04 17:46:57
2941
原创 UtilBox(ub)基础组件 -- EasyCurl 发送http请求(2)
EasyCurl简单封装了一下libcurl调用,对外的提供抽象化的接口,下面就把源码分享出来,此源码和接口还带进一步完善优化,尤其是一些curl_set_opt()的上层封装。大家可以自己写哈,最后写一个满足自己需求的Curl。 ubplus_curl.h : EasyCurl的类定义和接口,还有一些宏/** ================================
2012-08-19 15:40:27
2152
原创 UtilBox(ub)基础组件 -- EasyCurl 发送http请求(1)
昨天晚上锻炼身体,好久没激烈与动了,爽快!回到家,赶紧把之前写好的curl组件分享出来,EasyCurl其实就是对libcurl的一个封装,libcurl如果没用过的可以百度之。 curl其实很简单理解,socket大家都用过,其实http请求也是个socket短链接,只是通信的字段会按着HTTP字段来组包,而且都是明文的。比如在浏览器里输入www.baidu.com,就能开
2012-08-17 14:22:50
2391
原创 UtilBox(ub)基础组件 -- Log日志(2)
文章内容和代码为作者原创,转载请说明 ^_^ 之前的文章把Log的大体设计和框架展示出来了,还有根据时间和大小进行分割,目前实现还不支持direct_io模式。但是接口以留出,之后还会对Log进行一次升级,因为有的业务可能存在日志量很大的问题,所以提供一个ub_log_set_buffer(char* buf,size_t size)的函数,来使用用户的buffer,这样可以类似
2012-08-17 13:34:53
2052
原创 UtilBox基础组件
最近写了一些构建c、c++用的基础组件库,比如基础的log日志、通用数据结构、内部缓存等应用或者工具,拿出来分享(之后还会有java和php的),随想了一个UtilBox的名字(简称ub)。这些基础组件都是平时写程序都会用到的,为了可以复用,就剥离出来成lib了,方便以后统一使用。如果大家有什么觉得基础组件平时用的很多,在互联网公司也有应用,也可以写出来分享哈。
2012-08-04 13:34:04
1463
原创 UtilBox(ub)基础组件 -- Log日志(1)
文章内容和代码为作者原创,转载请说明 ^_^ 这篇文章主要介绍一下log组件,平时大家调试程序和记录程序异常,这是最常用的。比如调试小程序的正确性,有些同学就在代码里放一堆的printf,可是这样带来的后果就是想去掉这写debug用的printf很麻烦(这个可以用宏来代替,比如类似ASSERT,通过开关来控制)。还有,如果程序写成了daemon,放到后台,printf的作用就没了。所
2012-08-04 13:32:03
2240
1
原创 内存使用技巧及内存池实现(二)
本文所有内容包括源码均是作者原创,出于尊重,如果转载请表明出处 ^_^ 上一章节,提到了内存池的使用。其实内存池的作用看名字也能猜到,"池"意味着资源是同一管理和创建释放的,就像数据库的连接池、系统的线程池。主要就是为了避免创建、销毁资源的代价。c标准的malloc/free会造成大量的内存碎片以至于影响效率,所以“内存池”的技术某种程度上避免了这种消耗和影响。
2012-05-08 18:04:35
3506
2
原创 内存使用技巧及内存池实现(一)
本文只是展示了一些基本的内存管理技巧,处于篇幅没有更深入的讲解,有兴趣可回复一起探讨^_^ 在当前的软件开发环境下,主要分为两大类:客户端和服务端。软件部署在客户端的情况逐渐被Web应用和服务端的网络应用所替代(游戏客户端例外),并且随着硬件的不断升级和成本的降低,各种计算资源和存储资源被程序随意使用,基本不用考虑一个进程多占了几个Byte,多消耗了CPU几个毫秒。不过,某些场合
2012-05-07 22:10:07
5126
1
原创 C/C++ -- 代码技巧及优化
本人总结了一些平时编程的小技巧和非算法类的优化,希望各位一起讨论,也分享自己的技巧 1、inline/define适量的代码冗余 : "代码冗余"是一件很令人讨厌的事情,如果你在两个地方看到了同样的代码,第一反应就应该是"重构"他们,不过类似define这种代码"本地替换"的适当冗余,可以加速代码执行,省去了函数调用的事件,让CPU顺序执行。所以适当的define和i
2012-05-03 00:14:09
6834
2
转载 Android -- 应用自动检测更新代码
由于Android项目开源所致,市面上出现了N多安卓软件市场。为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量。因此我们有必要给我们的Android应用增加自动更新的功能。既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件,存放软件的版本信息:
2012-05-02 17:20:57
4644
2
原创 Android -- Log日志调试(android.utl.log类)
Android调试要通过模拟器运行,或者直接USB远程连接到一部手机调试。即使在不关闭模拟进行调试时候,也要经过编译、apk打包、上传apk、运行apk的过程,时间也不短,所以应该在程序固定一次运行中,产生更多我们需要关注的信息,来更清楚的了解程序的运行和逻辑,以便减少上述较长的过程(以前开发用过最土的做法,为了check某个变量的值,使用Toast.makeText()然后show出来,很麻烦)
2012-04-29 14:57:09
7747
原创 Android 手势的识别和控制 GestureDetecor
为了加强鼠标响应事件,Android提供了GestureDetector手势识别类。通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具体包括以下几种: boolean onDoubleTap(MotionEvent e)
2012-04-29 13:50:27
2982
转载 Linux内核--网络栈数据包的传递过程
本文转自 : http://blog.youkuaiyun.com/yming0221/article/details/7492423上一篇博文中我们从宏观上分析了Linux内核中网络栈的初始化过程,这里我们再从宏观上分析一下一个数据包在各网络层的传递的过程。我们知道网络的OSI模型和TCP/IP模型层次结构如下:上文中我们看到了网络栈的层次结构:我
2012-04-25 22:10:48
1972
原创 UtilBox(ub)基础组件 -- epoll_server网络事件模型
今天事情比较少,突然在在网上看到了一篇关于网络同步异步IO的帖子,正好想起了前几天分析过的Redis的代码。Redis的代码很精练也很轻巧,基本没有第三方以来的库(最新版本中加入了jemalloc,但已集成在了redis的src里,所以依旧可以直接make),并实现一套轻量型的非阻塞半异步框架-aeEvent(很少有大型互联网后台应用采用全异步框架,一是逻辑和IO都是异步的这样即时性较低,二是编程
2012-04-25 21:45:04
2292
原创 Cloud App -- Baidu App Engine爬虫应用开发
今天试用了一下百度云平台(http://yun.baidu.com/)的云环境Baidu App Engine(以下简称BAE),整体感觉还不错(毕竟是互联网巨头的产品啊)。整体使用类似Google的GAE和Sina的SAE,但是也做了依托搜索平台和海量数据过滤检索的特性。 本人使用其中的Mysql-分布式数据库服务,FetchUrl-Url抓取服务,Taskqueue-分布式队
2012-04-22 09:53:03
3518
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人