自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

可乐爱上咖啡

致力于高性能服务器和小众语言的研究-个人笔记杂货摊

  • 博客(38)
  • 收藏
  • 关注

原创 欢迎访问我的新个人网站,博客也搬家了。

个人网站: http://www.bigendian123.com/

2013-10-01 11:00:38 5189 1

原创 Nginx SPDY patch实现

前不久Nginx官方放出了SPDY的patch,到目前为止都还未合并进nginx源码,主要还是由于此patch还远不成熟,代码和功能都还不足够完善。个人感觉spdy patch合并进nginx源码还有些时日。本文是基于目前的patch,初窥一下nginx官方是如何在实现spdy。上图是nginx处理一个请求的大致流程,这里只是绘制了简单的模型,实际过程还是相当的复杂的。图中

2012-07-14 16:51:53 8151 1

原创 Google SPDY介绍

本文主要是参考Google SPDY项目主页的一些文档总结而来,目的整体上介绍SPDY协议的定义为主。后续,我将写一系列的文章分析SPDY的一些项目(如:Nginx),SPDY的性能测试以及如何部署SPDY到实际生产应用。一、HTTP协议存在的一些主要问题1、一个连接一个请求。浏览器和web server之间都是以短连接方式交互,一个连接只服务一次请求,对于一个需要加载多个资源的页面来

2012-07-09 12:13:52 11495 3

转载 The C10k problem —— 高性能服务器开发必读

保存链接于此,方便自己查看the c10k problem

2012-06-02 00:14:02 5846

原创 Nginx定时器的实现及定时事件的使用

nginx提供一套高效的定时器实现,除了nginx核心能够使用定时器以外,我们在进行模块开发的时候也可以使用定时器来完成一些定时执行的任务。nginx定时器实现的核心是使用一棵红黑树来存储各个定时事件,每次循环的时候就从这棵树里找出超时的事件,然后一一触发,完成定时任务操作。下面简单的描述一下nginx在实现定时器时的几个关键点。本文是基于linux的epoll来描述的定时器实现。定时

2012-06-01 21:29:32 27434

原创 GBK和UTF-8的粗暴判断

最近遇到一些url中携带没有encode掉的汉字,并且这样的url有的是utf-8编码,有的又是gbk编码。最终这些url被记录下来的时候,必然就有一类url是乱码了。有人说,汉语博大精深,可恰恰也是这些博大精深的东西时不时的让我们伤透脑筋。我认为这种url编码的情况,最专业的手法应该是url上有一个参数用来说明编码。现在既然没有人告诉我这个url是什么编码,那么我也得尽力判断,然后转换编码。

2012-05-26 13:21:17 8410 2

原创 bash基础编程总结

bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了。),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bash编程,因为它将给你的工作带来足够的幸福感。本文将总结一些我自己平时使用的bash基本编程知识,和大家分享,也便于自己查询。变量1、bash的变量名是区分大小写的,并且变量名首字符不能

2012-05-09 19:48:14 10593

原创 小玩TinyCC (aka tcc)

tcc是一个轻量级的C语言编译器,根据官方介绍,完全支持ANSI C,甚至可以用它来编译linux内核。tcc最显著的特点就是编译速度快,产生的可执行程序小,并且能够像脚本一样执行C代码。可惜的是作者现在貌似不再开发tcc了,目前最新版本是0.9.25。         tcc的使用方法和gcc基本相同,连默认产生的可执行程序的名字都叫a.out。写个hello world,比较下gcc和

2012-03-11 19:25:37 8082

原创 Go语言学习笔记4——struct

原计划这篇是写函数的,翻来覆去的研究函数,也没找到什么感悟,于是就写struct吧。这可是个好家伙阿,一个非玩具的C系统中,绝对是struct的天下,可Go更是青出于蓝胜于蓝。        struct在Go中基本总是和type一起出现,Go的type关键字相似于C中的typedef,给一个变量定义个别名。先欣赏一段struct的代码:package mainimport "

2012-03-04 19:50:57 9794

原创 Go语言学习笔记3——控制语句

有人说,程序是这个世界上最简单的东西,因为你只需要知道if、for、switch就足够了。事实上,程序也是由判断和循环两种语句组成。程序员更喜欢和机器打交道,而不是和人打交道,是因为程序的世界里更简单,更单纯,没有复杂的关系,是1不会为0、是真也不会为假,一切的一切都是那么真实,不虚幻。此刻,我坚信技术宅们比谁都了解这个世界,比谁都看得更清楚,所以他们将自己宅起来,出淤泥而不染吧。

2012-03-02 21:13:52 4293

原创 Go语言学习笔记2——数组和Slice

在任何一门语言里,数组应该都是非常基础的类型了,使用率当然也应该是很高的。go不但提供了数组,而且还在数组这个类型之上加了一层包装,这个包装也就是slice。        go的数组变量(也就是数组名)是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言; C语言主要还是类型系统太弱了,因此很多的数据最终都退化为指针的方式来访问。

2012-02-29 22:18:01 20416 1

原创 Go语言学习笔记1——认识

go是一门编译型语言,而不是基于虚拟机的解释型语言,不谈编译和解释的性能问题,只是主观情感上觉得编译而产生的可执行程序与操作系统之间浑然天成。就好比戴套与不戴套的问题。go除了编译型和C语言神似以外,还有着很多的共同点,都说go就是c的加强版,因此我觉得go应该会受到很多c语言程序员的青睐,至少我是没hold住了。python是我认为和c一样简洁优雅的语言,可惜我实在不喜欢动态类型,坏处就不多说了

2012-02-28 14:17:59 4709 1

转载 gcc参数详解

感谢 fence的分享,原文链接:http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html转载过来,便于自己查看。gcc and g++分别是gnu的c & c++编译器  gcc/g++在执行编译工作的时候,总共需要4步  1.预处理,生成.i的文件[预处理器cpp]  2.将预处理后的文件不

2011-12-15 12:00:24 3227

原创 web.py性能测试

一直从事后台系统的开发工作,对web、甚至前端技术一无所知;为了响应leader提出的多面手号召,决定一探前端技术。由于个人对python是情有独钟,毅然决定从python web开发下手。在众多的python web框架中,我看上了简单、轻量的web.py,没有特别喜欢的原因,

2011-07-22 22:12:36 10994 2

原创 奇怪的流量差

最近在开发一个消息中间件,使用了hbase作为存储引擎。今天在进行性能测试的时候发现一个极其诡异的现象:client向我们server拿数据的时候,server网卡的进出流量极其不均,进来的流量居然跑满了网卡,出去才30M左右(server进来的流量是从hbase scan数据,出去的流量是server将从hbase scan的数据发送给client)。按道理来说,进出的流量应该是1:1的才对,

2011-06-24 23:56:00 3747

原创 第一个Nginx filter模块

以前一直写的都是nginx的handler模块,包括线上服务器都是handler模块,还没有真正写过filter模块,这里就张贴一个filter模块的骨架,方便自己以后查阅。这个入门级的filter只是简单的在响应body尾添加上字符串“Nginx”。 #include #include #include static ngx_int_tngx_http_test_filt

2011-06-12 15:15:00 7559 1

原创 如何从一个nginx的http请求中获取server端地址?

如果你正在从事nginx的模块开发,可能需要获取服务器端的ip地址。我在改进淘宝日志服务器的nginx模块时,就碰到需要从request中读取到接收这个请求的网卡ip。一开始,我试图如下方式直接从请求中获取地址:struct sockaddr_in *sin = NULL;/*type of r is ngx_http_request_t* */sin = (struct sockad

2011-06-12 14:25:00 9449 2

原创 nginx配置文件解析过程之神图

<br />所谓神图就是只有自己才能看懂的图,哈哈。此图描述的是nginx配置文件解析过程生成的内存模型图,所有的配置数据,模块handler等信息都是存储在这个图中的。<br /> <br /><br /> <br /> 

2011-04-24 12:58:00 6525 4

原创 thrift小试牛刀

在Apache上http://thrift.apache.org/,thrift如是简单的介绍了自己:Thrift is a software framework for scalable cross-language services development. It combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C+

2011-01-25 13:13:00 4832

原创 2010年度总结-在淘宝的半年日子

2010是自己人生当中的又一个非常重要的转折点——我离开了美丽的象牙塔,踏上了工作岗位。6月底,我离开了生活了4年的大学,登上了飞往杭州的航班。那一刻,我才明白:“4年后的今天我居然只带走了回忆,除此再无别的;如果大学可以重来,我也许会做出另外一种选择;好像每个踏出校园的同学,都有和我一样的感触”。时间不会倒流,与其回头懊悔,不如昂首眺望。

2011-01-02 16:40:00 8305 21

原创 Nginx源码分析-内存池

转载申明:本文可以任意转载,但需注明原文地址,谢谢!Nginx的内存池实现得很精巧,代码也很简洁。总的来说,所有的内存池基本都一个宗旨:申请大块内存,避免“细水长流”。一、创建一个内存池nginx内存池主要有下面两个结构来维护,他们分别维护了内存池的头部和数据部。此处数据部就是供用户分配小块内存的地方。

2010-12-24 21:57:00 5411 2

原创 Nginx源码分析-4个重要结构之间的关系

Nginx源码之中有着很多很多的结构,当然每一个结构都是非常重要的,本文将分析其中的4个结构之间的关系。这4个结构分别是:listening、connection、event以及request。

2010-12-19 15:43:00 3606 3

原创 Nginx源码分析-Epoll模块

Linux平台上,Nginx使用epoll完成事件驱动,实现高并发;本文将不对epoll本身进行介绍(网上一堆一堆的文章介绍epoll的原理及使用方法,甚至源码分析等),仅看一下Nginx是如何使用epoll的。

2010-12-11 19:01:00 8298

原创 Nginx源码分析-connections数组

本文的标题让我纠结了好久,不知道是connections数组合适,还是connections链表更合适;Nginx在此或多或少的注入了二者的特点,先不管是叫数组还是叫链表吧,只要能够弄明白这个connections是怎么回事就大功告成。Nginx的每个worker进程都使用一个相同的connections数组来维护每个连接。当有一个新的连接建立时,Nginx需要从这个数组取出一个slot来存放这个连接;相反,有一个连接断开时,也需要将相应的slot归还给connections数组。本文就来看一下这个conn

2010-11-28 19:22:00 4489 2

原创 Nginx源码分析-事件循环

事件循环这个概念貌似在windows编程中提得更多,Linux程序却很少提及这个概念。本文所提及的事件循环其实就是worker cycle,由于此处将关注的不再是worker进程,而是worker进程在循环过程中关于事件处理的环节,因此就盗用了事件循环这个概念。在具体看代码前,先看一下这个“循环”的概貌:

2010-11-21 22:02:00 5699 2

原创 Nginx源码分析-事件驱动的初始化

Nginx的高性能应该算是事件驱动的功劳。Nginx事件处理的相关代码位于src/event目录中,事件驱动是Nginx的核心,所以代码量相对也比较大。事件驱动初始化的过程主要由下图中的三步组成。

2010-11-21 22:00:00 5380

原创 Nginx源码分析-master和worker进程间的通信

前面单独分析了master进程和worker的工作情况,本文就大概看一下master进程和worker进程之间是如何使用channel来完成通信的。这部分实现的源码主要分布于src/os/unix/channel.h和channel.c两个文件中。实现极其简单,没有什么复杂的逻辑。下面,我绘制了一个简单的master进程和worker进程间的关系,图中的箭头符号指出数据是由master进程传给worker进程,而没有从worker到master;这是因为channel不是一个普通的数据传输管道,在Nginx

2010-11-17 14:08:00 11086 1

原创 Nginx源码分析-进程管理之worker进程

上一篇博文分析了master进程,本文着手分析一下worker进程的情况。首先找到worker进程的入口地方——ngx_worker_process_cycle。这个函数不光是worker进程的入口函数,同时也是worker进程循环工作的主体函数,看函数名含有一个cycle嘛。进入这个cycle函数,第一件事就是调用ngx_worker_process_init(cycle, 1);对worker进程进行初始化操作。先看看这个worker进程的初始化过程。

2010-11-16 22:29:00 5606 4

原创 Nginx源码分析-进程管理之master进程

Nginx虽然有着多种进程模型,但生产环境一般都是用master-worker模型来工作。本文着重分析Nginx的master进程做了哪些事情,它是如何管理好各个worker进程的。我们知道在main函数中完成了Nginx启动初始化过程,启动初始化过程中的一个重要环节就是解析配置文件,回调各个配置指令的回调函数,因此完成了各个模块的配置及相互关联。在所有的这些重要及不重要的初始化完成后,main函数就开始为我们打开进程的“大门”——调用ngx_master_process_cycle(cycle); 接下来

2010-11-11 09:44:00 7348 1

原创 Nginx源码分析-启动初始化过程(二)

在Nginx启动初始化过程(一)中提到main函数会调用ngx_init_cycle()初始化一个全局cycle变量,本文就来看看这个ngx_init_cycle()函数究竟做了哪些初始化工作。ngx_cycle_t结构类型被定义在src/core/ngx_cycle.h文件中,多达23个成员变量(nginx-0.7.67),初次目睹这个结构类型的时候,最让我震惊的是成员变量void ****conf_ctx,想必大家都知道我为何而震惊了吧,也许仅仅只是我见识太少吧,呵呵。由于ngx_init_cycle(

2010-11-07 17:26:00 5643 2

原创 Nginx源码分析-启动初始化过程(一)

Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处。Nginx的初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)展开。下面具体看一下main函数为Nginx的启动过程做了哪些初始化方面的事情。main函数做的第一件事情就是对参数选项进行处理,和普通的Linux程序如出一辙,如下:if (ngx_get_options(argc, argv) != NGX

2010-11-04 17:02:00 4850 3

原创 nginx源码分析-链表

nginx封装的list和我们在学习数据结构时的list略有点区别。nginx的list算是数组和链表的结合。其用以下两个结构来维护一个list。struct ngx_list_part_s { void *elts; ngx_uint_t nelts; ngx_list_part_t *next;};typedef struct { ngx_list_part_t *last; ngx_list_par

2010-07-22 21:54:00 3366

原创 Nginx源码分析-数组

俄罗斯大牛在nginx中给我们封装了非常好用的数组,在做nginx模块开发的时候,不必再使用原始的数组了。nginx使用以下结构来维护数组 struct ngx_array_s { void *elts; ngx_uint_t nelts; size_t size; ngx_uint_t nalloc; ngx_pool_t *pool;}; elts指向一块向系统申请的内存;在nginx中,这块内存是通过malloc

2010-07-19 20:52:00 6241 4

原创 闲着没事,山寨个记事本玩

2009-08-06 14:30:00 2262 3

原创 “引用”学习笔记

2009-06-03 21:50:00 1169

原创 python中设置字符编码

2009-06-01 21:43:00 6310

原创 第一个python CGI程序——hello,world

2009-06-01 17:33:00 3001 1

原创 正确放置inline函数

2009-06-01 17:25:00 1412

空空如也

空空如也

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

TA关注的人

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