sphinx是一个著名的开源搜索引擎,和lucence系的(solr,elastisearch) 齐名,sina微博,搜狐微博,神奇网站,discuz都用它

sphinx用c++代码开发,代码写很工整。一般认为sphinx性能好,而solr功能更完善.实际上从网络IO模型上来说,sphinx 性能其实不如solr

sphinx内置4种IO模型,可通过配置文件指定

enum Mpm_e
{
    MPM_NONE,        ///< process queries in a loop one by one (eg. in --console)
    MPM_FORK,        ///< fork a worker process for each query
    MPM_PREFORK,    ///< keep a number of pre-forked processes
    MPM_THREADS        ///< create a worker thread for each query
};

注释写的很清楚,在windows下只能用thread模式,在linux默认是fork模式,可以通过修改sphinx.conf[workers]项指定其他模式

sphinx常用的thread/fork模式步骤如下

  1. 主进程 create/bind/accept 新连接
  2. fork或者thread来处理客户端请求,每次只处理一条query
  3. 处理完成一条query之后,马上close掉client连接
    这样设计,可以降低编程难度,不容易出错,有点大巧不工的意思

phinx代码会自动判断,如果系统支持epoll,用epoll,否则使用poll,如果poll都没有,那就用select,默认timeout时间是5秒

从它的IO模型看,epoll/poll/select只是用来控制socket 读写的timeout,并不是为了高效处理大量并发请求,所以用select还是epoll完全没有区别

sphinx的prefork是标准的prefoxk:fork出子进程之后,才调用accept

sphinx的代码质量相当高,工程化做的不错,会主动的监控thread/sub-process,一旦挂掉数量不够会自动补齐

sphinx全部使用阻塞socket

在阻塞socket上,一样可以使用select来轮询信号,当select完毕,认为该套接字可读时:

  1. 阻塞的套接字,会让read阻塞,直到读到所需要的所有字节;
  2. 非阻塞的套接字,会让read读完fd中的数据后就返回,但如果原本你要求读10个数据,这时只读了8个数据,如果你不再次使用select来判断它是否可读,而是直接read,很可能返回EAGAIN或=EWOULDBLOCK(BSD风格)

本文地址: http://lutaf.com/222.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接