zeromq使用注意点滴

1.关于介绍zeromq的就不说了,可以自己去看官方guide很详细

2.主要说下在使用过程中需要注意的地方

  1)使用如果使用c++的接口的时候,在你自己的类中或者apache模块中需要将zmq::context_t 对象定义在zmq::socket_t对象的前面,这样可以保证销毁的顺序

  2)使用sub-pub时候,如果sub没有调用setsockopt设置过滤项(设置NULL则接受所有),那么将会接收不到任何的消息,默认会阻塞所有消息

  3)如果是后台服务集群使用且zmq需要bind端口的,那么最好在iptables中进行下过滤,不要让外部链接连接过来,否则会造成cpu空转;关于cpu空转将会在最后说

  4)客户端连接服务器时,每个客户端中的zmq,每个连接使用一个socket,虽然可以一个socket可以调用connect多次,也就是连接多个server。但是,记住,最好是一个socket只调用一次connect

  5)使用zmq的程序,运行一段时间后(可能几天),如果你碰到异常退出,并且你使用nohup运行的lognohup.out中显示zeromq connection timeout,那么你可以zeromq/src/tcp_socket.cpp文件中的203行看是write的时候出错。

 int zmq::tcp_socket_t::write (const void *data, int size)
{
ssize_t nbytes = send (s, data, size, ); // Several errors are OK. When speculative write is being done we may not
// be able to write a single byte to the socket. Also, SIGSTOP issued
// by a debugging tool can result in EINTR error.
if (nbytes == - && (errno == EAGAIN || errno == EWOULDBLOCK ||
errno == EINTR))
return ; // Signalise peer failure.
if (nbytes == - && (errno == ECONNRESET || errno == EPIPE))
return -; errno_assert (nbytes != -);
return (size_t) nbytes;
}

这是由于 errno_assert (nbytes != -1);造成的,但是,真正的原因是nbytes==-1时,errno==ETIMEDOUT ,在前面一行中没有去添加对这个timeout的判断,另外,可以参考该文件中对win上的处理。因此,这里如果你碰到了timeout错误,那么请将errno == ETIMEOUT加入到errno==EPIPE后面,然后重新编译

  6)关于cpu空转。首先你可以用top 程序名,去看你的程序的cpu使用率是否是100%,而且基本固定不变,那么这时候,你就需要怀疑是否你的程序的问题,然后通过lsof -p 程序的进程号,去查看是否有文件描述符有can't identify protocol,还要注意下,是否有外网的ip连接到你的zmq的监听的端口。然后,你可以在zeromq/src/epoll.cpp中的loop,rm_fd,add_fd函数中打log,看看在监听到EPOLLERR|EPOLLHUP 的文件描述符是不是lsof -p 查看到的can't identify protocol的文件描述符一致。其实,只要做到前面5点,那么cpu 空转基本是不会出现的。

ps:最后,希望碰到问题,大家能自己思考为什么会出现这样的问题,该如何解决,对自己的提升会有很大的帮助。

来源:http://www.linuxidc.com/Linux/2013-03/80273.htm

(转载)zeromq使用注意点滴的更多相关文章

  1. [转载]为什么我希望用C而不是C++来实现ZeroMQ

    来源: http://blog.jobbole.com/19647/ 开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的.在我的整个职业生涯里我都在使 ...

  2. 转载:关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

    转载: http://blog.csdn.net/konglongaa/article/details/52208273

  3. 点滴积累【other】---HTTP Error 503. The service is unavailable (转载)

    此文参考来源:http://luowei1371984.blog.163.com/blog/static/440415892012726448381/ 描述:在访问网站是会遇到这样的问题,提示“HTT ...

  4. 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)

    此文参考来源:http://blog.csdn.net/tiantian1980/article/details/6577499 问题:HTTP 错误 404.13 - Not Found,请求筛选模 ...

  5. 点滴积累【other】---Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决方案(转载)

    此文来自:http://blog626.blog.163.com/blog/static/105610732201051591450870/ 搭建IIS时出现如下错误: HTTP Error 500. ...

  6. 点滴积累【other】---win2003 service pack2 IIS 无法复制CONVLOG.EXE CONVLOG.EX_(转载)

    在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了下资料,说是在运行-中输入”esentutl /p %windir%/security/database/seced ...

  7. php五种常见的设计模式(转载)

    很多人都想着写博客来记录编程生活中的点滴,我也不例外,但想了好长时间不知道写什么........万事开头难,先转载一篇吧..... 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Ga ...

  8. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  9. .Net读取Excel文件时丢失数据的问题 (转载)

    相信很多人都试过通过OleDB读取Excel文件,这种方法效率十分高,只是有一点会让人十分头痛,就是当一列中既有混合型数据,又有纯数据时,往往容易丢失数据. 百度过后,改连接字符串 “HDR=YES; ...

随机推荐

  1. [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】

    eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...

  2. dwz中权限的控制

    很多人不明白用dwz要如何在没有登录的时候跳转到登录页面,没有权限的时候弹出提示. 其实,作者在设计的时候,已经完全考虑到了这些需求. 不管是navTab还是dialog,dwz的页面加载最终都是通过 ...

  3. C++ 拷贝构造函数 和 六大函数

    1.  C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...

  4. JMeter中的场景执行持续时间设置

    jmeter之调度器配置 JMeter的线程组设置里有一个调配器设置,用于设置该线程组下脚本执行的开始时间.结束时间.持续时间及启动延迟时间.当需要半夜执行性能测试时会用到这个功能. 设置调度器配置, ...

  5. ps命令使用 进程查看

    ps命令是Process Status的缩写 用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命 ...

  6. 各浏览器抗uaf机制

    今年中旬,微软针对旗下ie浏览器中大量出现的uaf漏洞,对ie浏览器的安全机制进行了一个大幅度的升级,其中主要体现为隔离堆及延迟释放两个机制,顿时又将uaf漏洞的利用向上提升了一个大坎, 但是类似的对 ...

  7. Wireshark工具创建过滤器的方式

    Wireshark工具创建过滤器的方式  [实例1-3]现在要抓取目的或来源地址为192.168.5.9的封包.在图1.5中添加如下所示的条件: tcp dst port 3128 添加后单击Star ...

  8. 阻止Ajax多次提交

    1.Ajax的abort() xhr = $.ajax({}) if (xhr){ xhr.abort(); } 2.通过在Ajax的beforeSend()方法以及complete()方法添加删除类 ...

  9. http://blog.csdn.net/hitmediaman/article/details/6636402

    http://blog.csdn.net/hitmediaman/article/details/6636402

  10. BFS+Hash(储存,判重) HDOJ 1067 Gap

    题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...