存档

作者存档

工作又一年了

2014年6月18日 1 条评论 1878次阅读    

正好一年前的今天,从百度到唱吧工作,时间过的好快。

一年来做的还有很多不令人满意的地方,可以提高的还很多,再次深深的鄙视自己的执行力。

······(不知道是不是变老了的原因,心里很多话写的时候都觉得没有必要了)

年轻真好,没有那么多羁绊,还有许多的可能

继续好好努力,为了那些不太确定的未来

Share

NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle

2014年5月29日 没有评论 14447次阅读    

最近一个长连接服务经常被反馈连接失败,刚开始怀疑是网络问题,也就没有细查。今天仔细抓包分析了一下,原来碰到了在开启tcp_tw_recycle和tcp_timestamps的机器上,当多个客户端使用同一个外网IP( NAT)时可能出现连接建立不成功的坑,具体表现为客户端发送了SYN 包给服务器,服务器也收到了,但就是不回复SYN+ACK 给客户端,从而导致客户端重传SYNC,直至一分钟左右才能成功。

阅读全文…

Share
分类: TCP/IP 标签:

小心TCP重连时连上了自己-TCP的回环连接

2014年5月17日 没有评论 3706次阅读    

刚才在测试一个服务器跟redis之间的连接自动重连机制时,碰到了个诡异的问题,epoll检测到了连接可用但程序总是不work,并且诡异的是redis被我停掉了,server竟然能够连接上来····
后来netstat -anp | grep 8379 查看了一下原来是server自己连接上了自己··· 阅读全文…

Share
分类: TCP/IP 标签: ,

北京如果

2014年4月28日 3 条评论 1489次阅读    

最近听到一首不错的歌曲,很喜欢, 北京如果阅读全文…

Share
分类: 生活杂感 标签:

Redis Scan迭代器遍历操作原理(二)–dictScan反向二进制迭代器

2014年4月19日 4 条评论 8356次阅读    

续上一篇文章 Redis Scan迭代器遍历操作原理(一)–基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分)。

关于这个算法的源头,来自于githup这里:Add SCAN command #579,长篇的讨论,确实难懂····建议看看这帖子,antirez 跟pietern 关于这个奇怪算法的讨论···

这个算法的作者是:Pieter Noordhuis,作者称其为:reverse binary iteration ,不知道我一对一翻译为“反向二进制迭代器”可不可以,不过any way ··作者自己也没有明确的证明其真假: 阅读全文…

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

Redis Scan迭代器遍历操作原理(一)–基础

2014年4月12日 3 条评论 12055次阅读    

Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了···

命令的官方介绍在这里, 中文版由huangz同学细心翻译了,作者Antirez的介绍在这里:Finally Redis collections are iterable (我又邪恶的想到了之前他那次机器down机的事故了···)。

具体的使用参考上面的链接即可,这里大概介绍一下Scan操作的实现原理。 阅读全文…

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

Redis从库备份和同步时小概率存在较严重数据错乱的Bug

2014年4月11日 没有评论 6882次阅读    

先说一下影响:在主从模式下的从redis如果开启了定期BGSAVE,并且在做SYNC的时候,可能存在数据错乱的问题,目前2.8.8最新稳定版也存在这个bug。

redis的BGSAVE和slaveof触发的同步操作是互不相关的(对于从库),所以就完全有可能同时在进行备份和同步。看一下下面的代码: 阅读全文…

Share
分类: Redis 标签:

Redis Slave进行数据备份BGSAVE时可能内存突发跑满

2014年4月10日 1 条评论 11288次阅读    

前几天突然线上的redis slave 把64G的内存给占用满了,本来机器上的数据正常只会占用55.5%左右35G的内存的。
查看进程情况,当时redis正好在做BGSAVE操作,所以有2个Redis进程存在,初步怀疑是因为这个原因,但是理论上redis的BGSAVE是fork出来的进程,他们刚开始是共用物理内存的(Redis源码学习-AOF数据持久化原理分析(0)),除非主进程有数据修改,其实就是利用了操作系统的COW机制,巧妙的对redis做了一个数据快照。但明显线上系统不可能短时间内触发大部分数据的修改,所以排除这个的原因。 阅读全文…

Share
分类: Redis, 系统架构 标签:

一次由于sbrk()无法压缩导致内存RSS虚高造成“内存泄露”的假象

2014年4月4日 没有评论 2168次阅读    

最近写的一个C网络服务器程序在高压力后top进程看内存的RSS总是等于最高值, 以为是内存泄露,到处查看代码没问题,用valgrind跟了一下也还是没有发现问题。

于是将malloc改为自己的函数记录了一下程序的malloc, free操作,从而算出还有多少大小内存没有释放,最后结果是一切正常,基本都释放了,但奇怪的是RSS却没有降下来。 阅读全文…

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

Libev轻网络库 源码浅析

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

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

Share

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

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

前几天碰到碰到一个线上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 条评论 1710次阅读    

 

今年好多事情需要去做。

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

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

Share
分类: 生活杂感 标签:

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

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

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

阅读全文…

Share
分类: 生活杂感 标签:

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

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

 

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

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


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

Share

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

2013年11月30日 1 条评论 27798次阅读    

没事碰到了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日 没有评论 1628次阅读    

这是标题党,

下面是鸡汤,请忽略。

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

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

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

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

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

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

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

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

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

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

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

Share

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

2013年11月3日 1 条评论 5179次阅读    

今天在看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 条评论 2754次阅读    

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

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

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

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