存档

作者存档

Libev轻网络库 源码浅析

2014年3月31日 3 条评论 30873次阅读    

忍不住先吐槽一下,Libev里面的宏真T*D难看而且很多不必要的宏,好吧,其实他是为了性能。
估计介绍Libev的文章挺多的,这里只是个人记录一下,随便写点东西,libev代码还算简洁,虽然宏多了点,还有各种预定义变量等,今天花了几个小时下载了代码看看,简单记录一下。
之前没有用过libev,一般直接裸写的epoll,总结的话,libev的功能是: 支持将SOCKET,管道, 信号,以及定时器统一为通用的变成逻辑,给开发人员提供了一个简单高效的异步网络编程库。
阅读全文...

Share

网络服务器由于文件连接数不够而导致listen sock总是可读CPU跑满

2014年3月30日 没有评论 7252次阅读    

前几天碰到碰到一个线上redis CPU跑满的情况,基本无法处理正常请求了,刚开始以为是其他地方的问题,后来grep "Max open files" /proc/`pidof redis-server`/ -r  排查原来是启动redis的时候。ulimit -n 只有1024,从而无法接受新连接。

晚高峰时段段时间突发的大量请求导致某个时候redis连接数超过1024,从而listen sock 持续可读并且accept失败,从而CPU跑满,进而导致更严重的雪崩。 阅读全文...

Share
分类: TCP/IP 标签: , ,

2014年好多事情要做。

2014年2月16日 2 条评论 4956次阅读    

 

今年好多事情需要去做。

希望今年不会把自己给费了。

嗯嗯,谨记,不要把自己给荒废了,再像去年那么干,就得完蛋,死定了!

Share
分类: 生活杂感 标签:

匆忙中回首,又是一年回家路

2014年1月26日 1 条评论 5236次阅读    

不知不觉又在北京飘了一年,寻找了一年,摸索了一年。
待会就拖着行李踏上回家的火车了,难免回想起这一年的路程。不多,2件事:1.离开百度;2.去了唱吧;
离开百度是因为心里迫切的想做一些让自己心动的事情,所以去了唱吧;结果还好,算是没选错路,只是路上,还得努力。

阅读全文...

Share
分类: 生活杂感 标签:

用户怎么会这么想呢,简直不可能,怎么会这样呢,没道理啊

2013年12月12日 2 条评论 7424次阅读    

 

脑子突然进水了,闪现了些连自己也听起来没道理的想法:

有些时候我们认为Ridiculous的事情很可能是因为我们这个level的人不懂,不懂用户,不懂另一批人的思维,比如我不懂我弟弟一样。


毕竟我们生活在不同的圈子,不同的学历,必然有不同的思维和价值观。但是··· 阅读全文...

Share

librtmp实时消息传输协议(RTMP)库代码浅析

2013年11月30日 5 条评论 415262次阅读    

没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据。

代码在这里:git clone git://git.ffmpeg.org/rtmpdump

先看一段通过librtmp.so库下载RTMP源发布的数据的例子,从rtmpdump中抽取出来。使用的大体流程如下:

  1. RTMP_Init主要就初始化了一下RTMP*rtmp变量的成员。
  2. RTMP_SetupURL 函数将rtmp源地址的端口,app,等url参数进行解析,设置到rtmp变量中。比如这样的地址: rtmp://host[:port]/path swfUrl=url tcUrl=url 。
  3. RTMP_SetBufferMS 函数设置一下缓冲大小;
  4. RTMP_Connect函数完成了连接的建立,一级RTMP协议层的应用握手,待会介绍。
  5. RTMP_ConnectStream总的来说,完成了一个流的创建,以及打开,触发服务端发送数据过来,返回后,服务端应该就开始发送数据了。
  6. Download 其实是RTMP_Read函数的封装,后者读取服务端的数据返回。

阅读全文...

Share
分类: C/C++, RTMP, TCP/IP 标签: ,

当,你的用户让你头疼了怎么办?

2013年11月24日 没有评论 5233次阅读    

这是标题党,

下面是鸡汤,请忽略。

  1. 怜惜他们吧;每一个用户都是你的亲人。
  2. 不要随便放弃;我们存在的意义在于解决问题,而不是一刀切回避问题;
  3. 勤于反思;其实很多事情都是由自己而起的。
  4. 站的高,看得远,摔的也重。权利越大,影响越大,千万不要随意挥霍自己的回车键和鼠标。
  5. 一定要坚持原则,坚持原则。
  6. think bigger, make difference
Share
分类: IT行业, 创业, 生活杂感 标签:

使用Coan来净化众多的预编译指令,简化C/C++代码

2013年11月4日 没有评论 30412次阅读    

看开源代码的同学经常有个影响阅读的问题是许多的预编译指令,导致阅读很不顺畅。比如nginx代码中包含关于defined(WIN32) 的代码分支等。
找了很久没有找到能够净化,自动移除不需要的代码的工具,后来朋友介绍了Coan这个工具,(翻墙才能访问)。使用后妈妈再也不担心我的代码了!强烈推荐!不过好像隐约感觉,GCC预编译器应该就有这个功能,可能是某个参数指定。
比如我的需求是为了净化如下代码: 阅读全文...

Share
分类: C/C++, 软件工程 标签:

Mosquitto pub/sub服务实现代码浅析-主体框架

2013年11月4日 17 条评论 24271次阅读    

Mosquitto是一个IBM 开源pub/sub订阅发布协议MQTT的一个单机版实现(目前也只有单机版),MQTT主打轻便,比较适用于移动设备等上面,花费流量少,解析代价低。相对于XMPP等来说,简单许多。

MQTT采用二进制协议,而不是XMPP的XML协议,所以一般消息甚至只需要花费2个字节的大小就可以交换信息了,对于移动开发比较有优势。

IBM虽然开源了其MQTT消息协议,但是却没有开源其RSMB服务端程序,不过还好目前有比较稳定的实现可用,本文的Mosquitto是其中比较活跃的实现之一,具体在这里有目前的实现列表可供选择。

趁着大脑还没有进入睡眠状态记录一下刚才看代码学到的东西。我下载的版本是1.2.2版,在这里可以找到下载链接阅读全文...

Share

MQTT消息推送协议应用数据包超时是否需要重发?

2013年11月3日 2 条评论 16104次阅读    

今天在看MQTT协议文档,到处关于QoS(Quality of Service)的介绍,文档说如果没有收到对方的PUBREL等确认包,超时后server需要'delivery retry", 一开始觉得理所当然的,重发嘛,丢包,正常。

然后就看到消息重发(Message delivery retry)这一章:

4.2. Message delivery retry

Although TCP normally guarantees delivery of packets, there are certain scenarios where an MQTT message may not be received. In the case of MQTT messages that expect a response (QoS >0 PUBLISH, PUBREL, SUBSCRIBE, UNSUBSCRIBE), if the response is not received within a certain time period, the sender may retry delivery. The sender should set the DUP flag on the message.

阅读全文...

Share
分类: mosquitto, MQTT, TCP/IP 标签: ,

使用贝叶斯统计进行垃圾邮件过滤

2013年10月17日 3 条评论 7378次阅读    

占个坑,贝叶斯进行垃圾邮件过滤方法简单,效果也挺明显的。基本能满足一般需求。具体算法不多说,google即可。

贝叶斯在线上使用的准确性其实严重依靠人工的调整的,需要进行巧妙的调整才能极大的提高降低误判率。

下面贴个代码,从其他地方考过来改吧改吧的。 阅读全文...

Share
分类: C/C++, 算法 标签: ,

Redis 2.8版部分同步功能源码浅析-Replication Partial Resynchronization

2013年10月7日 没有评论 10990次阅读    

前面的2篇文章分别介绍了Redis主从同步源码浅析-Master端 以及 Redis主从同步源码浅析-Slave端 相关的代码实现,从中我们可以看出redis主从同步的一个最大的缺点,也是阻碍大数据应用的地方便是其每次连接端开都需要重连master进行全量数据的重新同步,这个代价是可想而知的。

长连接断开在线上环境中出现得很频繁,如果需要重新同步所有RDB文件,几十G的文件,从建立RDB快照,发送文件内容到slave,然后slave执行命令一一加载进内存中,这个时间开销估计也得好几个小时,更别说树形结构的master->slave->slave, 对网卡的压力,对服务器的压力都是很恐怖的。从这方面来说,动辄几个小时甚至一天的修复时间,没人敢用Redis主从同步在生产环境中使用。

但是福音来了:即将(2013年第三季度)发布的2.8版本会解决这个问题,通过:Replication partial resynchronization 的方式,也就是部分重新同步,这里就说部分同步吧,注意不是常规情况下的新写入指令同步。 阅读全文...

Share
分类: Redis 标签: , ,

Redis主从同步源码浅析-Slave端

2013年10月6日 没有评论 15417次阅读    

前一篇文章写了下redis主从同步的server端代码,这里补一下slave端的。

简单来讲,看了master端就知道slave端的代码大概流程了:

  1. 中断跟本slave的下一级slave的连接,强迫其重连SYNC;
  2. 给master发送PING确认其状态是否OK;
  3. 发送SYNC要求master做RDB快照(2.8版本以上会有PSYNC的指令,也就是部分同步,下回介绍。);
  4. 接收RDB文件大小;
  5. 接收RDB文件;
  6. emptyDb()清空当前数据库,rdbLoad()重新加载新的RDB文件;
  7. 按需startAppendOnly,然后接收master过来的累积和实时更新数据;

下面分别介绍这些步骤。 阅读全文...

Share
分类: Redis 标签: , ,

Redis主从同步源码浅析-Master端

2013年10月5日 没有评论 13446次阅读    

关于Redis的主从同步的基本介绍这里有:Replication, 不多介绍了。本文只涉及到主库的代码,从库的相关代码改天补上。

这里主要介绍redis 2.6.13版本代码,目前2.8新增了一些功能,比如增量同步功能等,不过到目前2013-10-05还没有正式上线。总结一下几点跟下面相关的:

  1. 同步采用类似mysql的操作日志重放方式,将写操作分发到从库重放。
  2. 每次从库启动必须从主库重新同步一份全量RDB数据文件,因此不能随便停止从库;
  3. 数据同步采用异步将写操作指令发送给从库的方式进行。

总体来说,redis的同步原理是:slave启动时下载所有数据快照,下载快照过程中产生的新写操作日志会不断累积记录起来,发送完快照后就发送这部分增量日志,日志在slave端进行重放。下面分步讲。 阅读全文...

Share
分类: Redis 标签: , ,

spawn-fcgi 代码介绍

2013年10月3日 没有评论 13010次阅读    

spawn-fcgi是一个小程序,作用是管理fast-cgi进程,功能和php-fpm类似,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了,本文介绍的是这个版本“spawn-fcgi-1.6.3”。不过从发布新版本到目前已经4年了,代码一直没有变动,需求少,基本满足了。另外php有php-fpm后,码农们再也不担心跑不起FCGI了。

很久之前看的spawn-fcgi的代码,当时因为需要改一下里面的环境变量。今天翻代码看到了就顺手记录一下,就当沉淀.备忘吧。 阅读全文...

Share
分类: C/C++, Nginx, PHP 标签: ,

Nginx断点续传功能代码浅析-Range模块

2013年10月3日 1 条评论 21339次阅读    

HTTP 的Content-Range支持对于一般的网页处理没啥重要的作用,但是对于大文件的下载,CDN回源,点续传功能的作用是非常重要的。

Content-Range允许一次只下载一个文件的一部分,后面再分批次下载文件的其他部分,或者并发下载,提高下载速度,这样如果在下载一个文件的过程中,网络断开了,恢复后不需要重新下载。

nginx 对Content-Range的支持包括header处理和body处理,分别用来解析客户端发送过来的Range header 和裁剪返回给客户端的请求数据Body。其实现分别由2个filter过滤模块完成,分别是ngx_http_range_header_filter_module和ngx_http_range_body_filter_module。下面分别介绍。 阅读全文...

Share
分类: Nginx 标签: ,

关于如何对待用户和需求的一点小感想

2013年8月28日 没有评论 5716次阅读    

随便记录一点杂感,比如如何对待用户,需求等,很杂乱的思维。 阅读全文...

Share

Redis主体事件循环流程介绍

2013年8月25日 没有评论 8981次阅读    

回顾一下之前看的redis代码,脑子内存比较小,一会就忘了,所以备忘一下。
redis主体流程比较简单,init,listen, accept, read, write,基本就是这几步。下面简单介绍一下,当做备忘。 阅读全文...

Share
分类: C/C++, Redis, TCP/IP 标签: ,

Solr搜索引擎使用介绍-构建一个简单的搜索服务

2013年8月11日 1 条评论 12639次阅读    

最近接触到开源搜索引擎Solr,碰了不少坑,在这里备忘一下,了解有限,仅供个人学习···

关于服务搭建等就不多说了,网上一大堆,这里记录一下一些容易出问题的地方等。

我用的是solr-4.3.1.tgz,貌似现在已经是4.4版本了,下载地址这里有,在使用Solr的时候一定注意版本问题,由于他是基于Lurance的,所以难免不断的跟着Lurance改动代码,也就导致某些模块上下不兼容。

solr有本专门介绍的书:《Solr 1.4 Enterprise Search Server》下面记录一些使用的小方法。 阅读全文...

Share
分类: Search 标签: , , ,

mysql数据热备份工具xtrabackup使用介绍

2013年8月10日 没有评论 7774次阅读    

最近需要用XtraBackup进行mysql数据备份,Gaojie同学推荐的工具,效果还不错,推荐。

详细的介绍请移步上面的链接去官网查看,官网介绍的很清楚了,这里只是就一些容易总结和容易犯的错误等。如果确定数据库的表全部是myisam的表,那就可以简单用“mysql数据热备份脚本-MYISAM表”里的方法做文件备份了,简单的东西总是"更简单可依赖"。

XtraBackup包含2个主要的部分:C程序xtrabackup, perl包装代码innobackupex  , 实际上后者调用了前者,提供一些包装的功能。因为xtrabackup只支持Innodb表,所以innobackupex  额外提供备份myisam表的能力。下面会说一下其原理
阅读全文...

Share