0%

zmq相关

一些零碎的东西

  1. zmq的io thread:一般1 个 io thread就够大部分的应用了,可以同时处理成千个连接,处理速度为Gbyte/s。一般一个核心多可以处理3个线程,所以多核心服务器上可以设置核心数3倍的io thread个数,也只是一般来说。要在新建任何socket之前调用zmq_ctx_set()去设置io thread。增加1个io thread,则zmq增加一个后台线程。

  2. high-water mark: 对ZMQ_DEALER来说,达到hwm就阻塞信息,不再发送,一直堵着,对ZMQ_ROUTER来说,就直接丢掉,不管了就。比如说一个client使用dealer,发送连续的1,2,3,4,5….,另个server使用router,如果发送到1时候server掉线,client的信息就发不出去,则信息就在client处堆积,比如设置的hwm为10,就是说client还可以正常发送10个信息,发送到11,但这10个信息(2到11)并不是真的发送给了server,而是存储到了zmq内部的缓存地方,10个信息发送完了,server还没上线,client就阻塞到程序发送数据的地方,不再发送信息。如果server不知道什么时候上线了,不管是在client还没到达hwm限制的时候上线,还是达到hwm限制很长时间之后才上线,server都会收到从2开始往后的数据。

  3. ZMQ_AFFINITY:从socket的io thread线程池中挑选一个线程处理接下来的连接,默认的是系统把连接过来的任务平均给线程池中的每一个io thread;

  4. ZMQ_BACKLOG:设置最大待连接数,默认是100个,所以我的程序有时候进行快速连接就会出现连接不上的情况。

  5. ZMQ_IMMEDIATE:设置是否在连接完整建立前存储信息到queue,默认为存储,如果设置为1的话,就只在连接完整建立后才存储,有助于避免某些socket在建立前数据因提前发送存储到本地缓存而丢失(REQ,PUSH,DEALER).有时候会覆盖掉HWM,如果断线就会覆盖,如果只是因为server性能问题,则不会覆盖。

  6. ZMQ_RCVTIMEO:设置recv超时时间,默认为-1,即阻塞,设为正值的话,就立即等一段时间再返回EAGAIN

  7. czmq的recv已经把SIGINTR信号屏蔽掉了.