(转载)zeromq使用注意点滴
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的时候出错。
1 int zmq::tcp_socket_t::write (const void *data, int size) 2 { 3 ssize_t nbytes = send (s, data, size, 0); 4 5 // Several errors are OK. When speculative write is being done we may not 6 // be able to write a single byte to the socket. Also, SIGSTOP issued 7 // by a debugging tool can result in EINTR error. 8 if (nbytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK || 9 errno == EINTR)) 10 return 0; 11 12 // Signalise peer failure. 13 if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE)) 14 return -1; 15 16 errno_assert (nbytes != -1); 17 return (size_t) nbytes; 18 }
这是由于 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
作 者:fengbohello
个人网站:http://www.fengbohello.top/
E-mail : fengbohello@foxmail.com
欢迎转载,转载请注明作者和出处。
因作者水平有限,不免出现遗漏和错误。希望热心的同学能够帮我指出来,我会尽快修改。愿大家共同进步,阿里嘎多~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?