epoll机制在搜索引擎spider中的应用

本文将介绍epoll的概念,原理, 优点,及使用接口,同时结合作者在搜索引擎spider开发中epoll使用方式的代码向大家具体介绍epoll的使用方式。
P.S. 笔者08年曾有使用epoll编写未考虑压力控制的crawler,将国内著名票务网站(艺龙)压垮并在boss的带领下登门道歉的经历:) 足见epoll的强悍!
epoll是什么
按照man帮助中的说明,epoll是为了高性能处理处理文件句柄而改进的poll机制, 和其类似的功能是select调用。epoll提供相对简单的接口, 即能实现高效的数量巨大的文件句柄的操作和控制。 是select和poll的升级替代品。
select也可以管理调度数量众多的文件句柄,但一般select能够管理的文件句柄数为2048(受FD_SETSIZE定义大小的限制), 虽然可以通过修改linux内核代码调整,但因为其实现为轮询机制,所以在当文件句柄较多,而有事件的句柄较少的情况下select的性能会较低(当然,我个人觉得最大的问题,还是文件句柄数的限制), 当然,很多早期的搜索引擎spider,很多都是直接使用select,调度网络句柄,性能也还不错,比如larbin
而在操作系统实现中,epoll是通过callback回调函数来操作active的文件句柄,所以该调用不用像select或是poll一样需要线性扫描,所以epoll效率较高(当然,如果操作的文件句柄都是活跃的,那select/poll的性能类似),而且epoll能够管理的文件句柄数非常多,一般是系统能够管理的文件句柄的上限,况且epoll通过epoll_create,epoll_ctl,epoll_wait即能完成文件句柄的管理, 所以很多时候epoll系列的接口会成为管理大量文件句柄的机制的首选。
epoll的优点
其实上文已经提到了很多,综合起来,主要是以下两方面有点:
  1. 高效: 在大量文件句柄管理中,如果active的文件句柄较少,则效率较select/poll高
  2. 量大: 理论上能够管理操作系统最大文件句柄数的句柄
当然,在实际中,在一些benchmark中,如果绝大部分文件句柄/socket都active,则epoll的效率相较select/poll并没有什么优势,相反, 如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上
另外,能够管理的文件句柄数也不可能达到最大句柄上限,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。
epoll的使用
首先要介绍epoll相关的数据结构。
epoll用到的有函数都是在头文件sys/epoll.h中声明:
typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ };
结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,其中epoll_data 联合体用来保存触发事件的某个文件描述符相关的数据,例如一个client连接到服务器,服务器通过调用accept函数可以得到于这个client对应的socket文件描述符,可以把这文件描述符赋给epoll_data的fd字段以便后面的读写操作在这个文件描述符上进行。epoll_event 结构体的events字段是表示感兴趣的事件和被触发的事件可能的取值为:
EPOLLIN :表示对应的文件描述符可以读; EPOLLOUT:表示对应的文件描述符可以写; EPOLLPRI:表示对应的文件描述符有紧急的数据可读; EPOLLERR:表示对应的文件描述符发生错误; EPOLLHUP:表示对应的文件描述符被挂断; EPOLLET:表示对应的文件描述符有事件发生;
函数接口如下:
函数声明:int epoll_create(int size)
该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围 2、epoll_ctl函数
函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
参数: epfd:由 epoll_create 生成的epoll专用的文件描述符;
op:要进行的操作例如注册事件,可能的取值:
                EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修改、EPOLL_CTL_DEL 删除
fd:关联的文件描述符;
event:指向epoll_event的指针;
如果调用成功返回0,不成功返回-1
函数声明:epoll_wait
epoll的工作模式
epoll有两种工作模式,ET模式与LT模式。
LT是缺省的工作方式,并且同时支持block和no-block socket;在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表。 ET是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知。 ET(Edge Triggered)与LT(Level Triggered)的主要区别可以从下面的例子看出:
例子:1. 标示管道读者的文件句柄注册到epoll中;2. 管道写者向管道中写入2KB的数据;3. 调用epoll_wait可以获得管道读者为已就绪的文件句柄;4. 管道读者读取1KB的数据5. 一次epoll_wait调用完成
如果是ET模式,管道中剩余的1KB被挂起,再次调用epoll_wait,得不到管道读者的文件句柄,除非有新的数据写入管道。如果是LT模式,只要管道中有数据可读,每次调用epoll_wait都会触发。 另一点区别就是设为ET模式的文件句柄必须是非阻塞的。
搜索引擎spider中的使用示例
功能描述
此处的spider,是一个具体而微的应用,或者更应该定义为crawler,即定向快速抓取指定网站,例如我们已经获取到1KW个URL,需要再1天内江1KW的URL对应的网站,使用单机抓取下来。
更具体地,笔者当时的应用场景,是快速地检查指定URL list对应的网站是否能连通, 所以具体操作的时候,仅抓取网页的头部信息, 并返回其中的return status即可, 因为一开始没有spider设计的经验, 所以该crawler一开始没有考虑同一网站的压力控制, 而epoll过去强悍,导致QA线下测试该crawler时,就将国内著名票务网站压垮(据票务网站的同事说, 他们的服务器CPU过热自动重启,而刚完成重启,就。。。又挂了: ),也算是工作后的一个奇遇了。  当然, 这样的CASE在如今,能够很容易被检查出来是一场攻击而被直接封IP。
架构
因为是一个简化的spider,所以架构图和下图类似(精确的架构图涉及泄密不再贴出来):
性能考虑
假设20个线程,每个线程最多管理50个socket, 假设抓取超时时间为10秒(一般会比这个时间长),假设不考虑压力控制,则该crawler每天能够抓取 20 * 50 * 86400 / 10 = 8640,000个网页,单机。如需要更强悍的抓取能力, 考虑使用多机。
代码示例
因为代码较多,此处仅贴出涉及到epoll工作原理的代码部分。
 图: epoll_create,创建epoll的fd,其中_max_sock_num指定最大管理的socket数量
图: 将socket加入epoll机制: 创建非阻塞fd,并将非阻塞fd加入epoll管理(初始的fd不响应读消息)
图: 使用epoll_ctl设置fd的状态,请参见上图设置读消息机制理解
图: epoll_wait调用方式: 如果active的socket数量不为0,则分出错,断开,读,写状态进行对应处理。
更多实现参见该文附件代码: contm_connector.cpp, 该代码在实际项目中应用,因用到了自行开发的日志库等外部lib,故不能直接编译,但逻辑经过测试,所以参考性较强。
具体代码参见: http://pan.baidu.com/share/link?shareid=2373459832&uk=1493671608
更多内容参见:
epoll 使用说明: http://www.xmailserver.org/linux-patches/nio-improve.html
也可关注我的微博:  weibo.com/dustinsea
或是直接访问: http://semocean.com

管理者如何做好团队规划

之前看过一篇文章,讲述的是孙正义如何设定目标及如何达成目标, 具体的原话忘了, 大概的思路是: 先设想自己10年后想达成的状态和目标,之后再分析要达到这个目标, 在第8年的时候需要哪些资源, 需要达成怎样的状态, 之后不断倒推, 直到当前;当然, 这么牛叉的目标设定方法, 不是每个人都能掌控的。。。

以前也曾经听一个Google资深产品经理的讲座,介绍Google的产品设计理念时,也提到Google一开始会将产品设想得比较宏大, 之后从某一个小点入手推进该产品,直到将该产品越做越大, 直到影响几乎全人类。。。

进行团队规划时,也是如此。下边就来介绍下在团队中, 一般我们是怎么做团队规划的吧。

简单来说,团队规划,是不断回答完善以下一系列问题的过程,这些问题需要在工作推进的过程中定期review和调整:

  1. 希望你的团队成为怎样的团队
  2. 现在离理想状态还有多远
  3. 分几个阶段每个阶段如何做才可以做到
  4. 需要哪些资源才能做到这样的团队

希望你的团队成为怎样的团队

这个问题,解决的是目标问题, 我们经常说‘指哪打哪’, 这个问题就是回答‘指哪? 以及是否指对’  的问题。 这个过程相当于为团队明确定位, 例如需要明确团队的职责, 理想的团队梯队和组织架构, 团队的意识和价值体系, 理想的团队氛围, 团队能够对更大范围产生的影响和输出价值。

明确团队的职责和定位: 这个相当于是限定了团队所要做的工作的范围以及价值, 例如之前我们对位团队负责百度搜索变现流量的挖掘,以便提升公司搜索变现效率。 这就是团队的职责,符合该职责的工作, 都需要考虑是否去做。 在这样的目标设定下,首先可以选择一些当前认为重要的, 且可以做到的事去做,量力而行,逐步推进。 之后可以设定设定一些未来看起来有希望的能够做到的重点工作作为中期目标进行推进。在设定中期目标的时候,一定要抓住重点,例如以前我的老大就跟我说过: 抓住最重要的3件事,避免大而全。

团队一般还会有其他的一些目标,但这些目标一定是围绕着团队的职责来设定的,例如组织架构是为了更高效地完成团队的职责,而且好的组织架构可以用一张清晰的图就能表述清楚;团队的价值体系也是使用简单明了的话就能进行介绍; 最好还能够形成几句比较好记,琅琅上口的团队口号, 这样能够让团队,员工更有凝聚力, 这个很重要。 例如经常说百度的使命是:‘让人们更便捷地获取信息,找到所求’, 我们团队会经常类比, 说我们的职责是:‘让广告主更高效准确地覆盖适合他的流量’, 简单地一句话就能概括团队的职责。

如何确定团队职责和定位是正确的:这个可以从多个角度来验证,例如和自己的上级, 下级, 平级的同事讨论。这个非常重要,团队的职责很多时候只有得到老大的认可这是必须的,如果老大都不认可这样的定位, 那后续的工作几乎能难开展(或者从某种程度上也没必要开展: 毕竟谁出钱谁拍板!),也很协调到资源来做。 与下级讨论的主要目的有两方面, 一方面下级对团队也会有自己的看法, 可以让管理者从另外一个角度来看团队定位职责是否正确, 因为有些资深员工还是会有自己非常独到的看法,从技术的角度来对这个问题进行审视; 另外一个主要的作用,就是可以看下下级对团队职责定位的认可程度, 毕竟他们是这些职责定位的落实者, 他们具体做事,只有他们认可,后续的工作才能顺畅开展(当然即使某人不认可, 也可以通过多次沟通进行说服)

另外需要注意,这个阶段更主要的是确定近期目标, 例如半年或一年目标, 所以需要确定的事既要比较实际,又要有所拔高; 同时也需要往前看一两年, 心里边要有一个大致的谱: 一两年后,自己的团队会走到哪里。

现在离理想状态有多远

分析团队现状:在指定这些目标的时候, 非常重要的一点,就是需要分析团队的现状: 例如团队现在的梯队,组织架构, 氛围, 相当于我们设定目标的时候是从当前的实际情况去做拔高,这个非常重要,如果起点很低,而将目标设定的非常高,也不是说不能实现,但有可能会出现目标过高导致不可能实现(具体设多少,是个技术问题,有时像又是个艺术问题)

例如11年团队调整的时候, 当时关键词搜索推荐团队分为工程, 策略团队(当时的现状), 后来考虑到这种组织架构会导致策略调研和策略上线之间存在断层(分析‘现状’), 出于提高团队策略迭代速度的考虑, 后来就将工程团队和策略团队进行合并, 且重新制定开发流程, 即后续很多项目, 都是从策略调研, 开发, 到最终推上线小流量乃至全流量都是由唯一负责人负责, 这样就避免了原来策略团队策略调研完毕后, 工程开发同学还要向策略同学了解具体策略考虑的代价, 同时工程同学也不会再觉得自己就是个外包, 避免了那种帮别人实现算法的失落感。 当架构有非常大的调整时, 才会引入外部纯工程团队, 一起合作推进架构的重构。

规划时,排除干扰因素:在很多公司我们都会说: 拥抱变化, 或是说: 世界上唯一没变的, 就是变化。 的确很多时候我们在做规划的时候, 都是在一个动态发展的节点对未来进行预见,会有很多变数。 例如13年就碰到两次大的团队调整, 而且第二次调整时, 团队调整方案已经定下来了, 而且已经和团队成员沟通了团队调整方案后, 突然接到老大通知, 调整方案有变, 整个团队会很快被划到另外一个部门, 后来不得不重新进行规划。 在这样变化的环境中, 会有很多的干扰因素, 但规划的时候, 其实可以在一定程度上先排除这些干扰, 否则考虑太多这种干扰因素, 会导致规划无法进行。

分几个阶段达到理想状态每个阶段如何做才能做到

分几个阶段做: 每次做年度规划的时候, 都觉得第一季度的事是相对比较明确的,第二季度的也还基本可以预知,但第三,第四季度的就很难把握了, 而前面也提到, 指定规划后, 需要定期review和调整, 所以每个阶段,最好不要超过一个季度,否则可能出现有些方向走偏但没有意识到的情况。每个阶段进行review,之后根据当前的进度进行目标的调整。 如果有些目标的达成需要太长时间, 则可以将这个目标达成再进行分解,避免某个节点持续时间过长。

需要哪些资源才能达到这样的团队水平

设定了上述预见的远景外, 就可以分析, 要达到该远景,需要哪些资源了。

资源可以从几个维度去区分:自己团队需要那些人, 需要上级的哪些支持, 需要兄弟团队的哪些支持,需要更大环境的哪些支持。

例如, 我们在进行百度关键词搜索推荐引擎团队规划时,认为后续需要在机器学习上进行加强, 于是开始联系HR,让其帮忙招聘更多机器学习方面的同事,同时开始联系擅长机器学习的团队, 一方面希望从兄弟团队引入对我们的项目感兴趣的同学,另一方面也了解他们团队中的机器学习工具和技术。

再比如之前团队调整过程中, 觉得关键词搜索推荐应该加强与百度检索投放系统的联动,所以后来与老大讨论后, 将底层涉及基础技术的topic model 方向划到了关键词搜索推荐小组。 这就是需要上级支持的典型。

还有一个大原则, 就是上述的规划,并不是一经制定后就是一成不变的,我们经常说计划赶不上变化,那为什么还要做规划?   规划的更大的作用是能让我们能将这些事在现阶段想清楚, 就类似于说拿破仑虽然每次战争都不是按照作战计划进行, 但每次战前他都会制定周密的作战计划。 所以, 我们要对规划怀着开放的心态,做好调整的准备。

百度关键词工具介绍参见:http://support.baidu.com/product/fc/4.html?castk=24b18bi7062c720d0d596

也可关注我的微博:  weibo.com/dustinsea

或是直接访问: http://semocean.com

百度在 2013 年是衰落的吗?是有怎样的依据?

知乎上受邀回答问题:“百度在 2013 年是衰落的吗?是有怎样的依据?”
正好在做自己个人的年度总结及明年的规划, 那也顺便分析下公司今年的情况。
我的观点: 2013年百度各业务发展势头都还算不错,中规中矩, 没看出特别出彩, 但完全谈不上差,而且一些行动,给别人看到老大的决心
下边的一些数据都是想到的时候从网上搜(不同的评估维度, 甚至同一维度不同的咨询公司给出的数据均会有差别)的, 谨慎参考。
可以从以下几方面看出来: 战略的推进, 内部机制
战略的推进
百度一直的思路都是去做入口, 都想直接占有用户上网需求的入口,从第一时间控制用户的上网时间。 这点从百度一贯的战略重心就能够看出来: 搜索, app下载(app下载的入口), 微购, 去哪儿, 爱奇艺等都是这样, 而今年公司在这些方面投入都很多, 也有不错的成绩: 可能变现上没有直接对百度有多大贡献,但是从市场占有方面, 提升还是非常明显的。现有搜索业务,中间页, LBS, 无线等战略方向均顺畅地推进中, 国际化没啥动静
现有搜索业务
虽然现在搜索需求增长已经放缓, 但毕竟这个业务还是最大的变现业务。 就好比股市里边说的现金牛, 虽然后续增长速度可能已经没有那么快, 但最赚钱的还是这个业务; 而且现在百度也在从生产力上提升变现效率, 例如商业知心细分各个行业提升变现能力及用户体验。教育, 金融等细分行业也已经上线。而且从财报中可以看到, 活跃用户仍然是增长的, 具体可参见13年Q3财报:Baidu | Press Releases
中间页
中间页相当于是将用户的垂直需求细化与具体, 是某个方向或点的需求满足。 例如去哪儿是出行的需求满足, 爱奇艺, 百度视频是视频的需求满足,微购是购物(虽然现在推广一般,但好歹做了个东西正在推), 而这些垂直需求与大搜索的需求整合起来, 威力的确惊人。
出行需求:这个今年百度也有比较大的动作, 去哪网上市(具体市场占有率没太关注, 但今年过年回家,在三线城市定酒店用的就是去哪儿, 而且第二天续住时,前台告诉我在去哪儿上定比较便宜, 而且网上仅支持去哪儿网, 当时感觉到去哪儿的覆盖率的确挺高) 我现在过年回家, 或是出去旅游, 基本上都是从去哪儿订票(以前都是用酷讯;不排除个人对公司的支持, 不过在上边下订单的确让人很放心, 而且价格也比携程低), 从各个维度看, 在旅游方面, 去哪儿市场占有均领先(数据均是来自网络, 谨慎参考):10月去哪儿无线端市占率38.86% 携程27.75%
视频需求: 爱奇艺与PPS合并, 外加一个百度视频, 基本上也占据了视频需求的一大块,艾瑞:10月份爱奇艺移动视频三大数据稳居第一 虽然现在还在厮杀, 但依托百度搜索这个老爸(技术+砸钱的支持, 比如百度Q3财报中显示内容的投入增加主要是在爱奇艺上: 可以参见ir.baidu.com), 市场占有率应该只会扩大, 而且现在也在推软硬件结合, 在卖各种爱奇艺电视, 小度影棒。 个人感觉这个比较有钱途, 一年多前一个创维的同学告诉我他在做互联网智能电视, 就觉得这块后续会取代传统电视:后续随着互联网电视普及, 谁还会去7点钟看脑残新闻联播? (至少我不会), 先看啥直接电视上点播, 随心所欲而且高清!
这块虽然现在不赚钱, 但赚钱迟早的事, 而且赚的是现在投钱在电视广告上的那些预算。当然, 有两个前提: 1是在现在视频市场的厮杀中不出什么大错,最后还是行业老大剩下来(当然这一块竞争还是比较激烈的, 说个狗血的小细节,说是爱奇艺买断爸爸去哪儿二期的独家网上播放权, 但内容中却可能会播放乐视的广告, 足见各种狗血各种竞争激烈); 2是政府不出强硬政策干扰这块的自由竞争发展。
91的并购
号称中国互联网最大的并购, 也体现出来百度一贯的做入口的思路与决心, 而且也让投资人看到了百度利用现有资源(现金, 技术)去为未来铺路的决心。在这方面的市场占有率也一下子就飞跃上升:百度91称日均分发8000万 市场份额超40%_科技频道
知心, 或者说其他垂直行业需求
教育, 金融, 网上购物等垂直行业都在试水, 例如教育, 金融等知心; 微购则是想整合网上的电商, 作为购物的入口。 这些垂直行业今年没那么出彩, 但至少在尝试中。
之前我就用google地图, 觉得还挺好用, 后来试了百度地图不就, 就将google地图卸载了, 这个真不是托: 百度地图真的比google做的好。 而地图虽然是个小工具(咋一看), 但背后代表的确实巨大的LBS需求, 包括各种衣食住行。 感受最深的就是11年去同学家, 当时用的还是Google地图,坐公交中转等车时,看到远处的楼盘上溪林, 然后google地图了一下, 结果当时google上就显示了上溪林售楼处的电话, 我还真就打了个电话咨询, 虽然最后没买这个盘。 但当时就意识到LBS变现潜力的巨大。
各种移动产品及APP
百度连七八糟的应用一大堆, 很多都很烂, 记得有一次出了个百度云笔记, 我用的时候真心失望无力吐槽, 烂到极点, 完全没有自己特色, 抄一个还抄的那么烂, 用它是伤我自尊。 但也有一些还算比较成功(当然和腾讯比还是差一大截,但还是在各种尝试,建立搜索的护城河) 百度移动这一年:13款过亿产品的全面布局, 有些真心好用, 例如云盘(之前一直用酷盘, 现在转到了百度云, 而且老婆的事业单位, 都实用百度云管理他们的资料), 相册, 输入法等都还不错。 这些虽然和搜索无关, 但可以说是搜索主业务的外延, 或是护城河, 占据了这些需求满足, 用户对百度的需求依赖就会更重。
无线变现(看份额的增长就比较明显)
这块在上个季度的财报中就已经体现出来, 无线搜索份额已经超过10%(参见http://ir.baidu.com), 所以这块会增长比较迅速, 也是公司的重点。
国际化: 说了好几年了, 也不知道之前说的覆盖全球一般的地区人口的目标何时能实现, 感觉没啥动静(或者有动静自己没太关注), 希望别到‘家祭无忘告乃翁’的地步
当然, 也有一个现象让人觉得挺有危机感的, 就是微信, 每次同学聚会, 一堆人都在玩手机, 而且基本都是微信。 没到这个时候就会觉得腾讯的牛叉。 这个如何破?
当然上边很多领域, 与腾讯还是有很多差集的; 而且百度非常看中技术积累, PM再给力点的话, 仍然会前途无量。
人才的引进
个人感觉百度和上面同学提到的MSRA的性质还不太一样, 百度会成立研究院, 但这些研究院都会有直接在项目中的需求, 例如deep learning会直接在百度的产品中有应用
一方面百度会在这方面有较大的持续投入, 邀请业界的专家加入百度, 也会提供较为丰厚的待遇,具体是多少我不知道, 但从公司财报可以看出(在研发上77.5%的同比投入增长: a 77.5% increase from the corresponding period in 2012, primarily due to an increase in the number of research and development personnel 参见百度2013Q3财报);另一方面百度会保证这些研究是与产品紧密结合的, 例如2013百度最高奖是语音识别引擎和通宝项目, 另外入选的团队还有基础机器学习的研究小组和deep learning在投放变现系统中的应用, 里边3个项目和基础研究有关, 都有业界大牛的带领, 而且都在具体场景中有应用:百度最高奖_百度百科
当然有一个让我一直比较困惑的, 就是百度的狼性, 这个仁者见仁, 愚者见愚(我是愚者)的东东, 我就不发表意见了。
更多内容可参见: semocean.com