PyZMQ发布者Socket调用send_string时阻塞问题求助
ZMQ发布者send操作阻塞问题排查
我正在开发一个包含数千个分布在不同机器上订阅者的ZMQ应用,目前遇到严重的send阻塞问题:只有当发布者绑定的端口仅连接1-2个订阅者时才能正常发送,否则send操作完全无法执行。
尝试添加zmq.NOBLOCK参数后依然阻塞,而且不只是send操作,所有ZMQ Socket相关调用都会卡住——比如调用socket.getsockopt(zmq.EVENTS)获取事件选项时也无法返回。
Python最小复现示例
import zmq ctx = zmq.Context() socket = ctx.socket(zmq.PUB) socket.bind("tcp://*:{port}") socket.send_string("whatever", zmq.NOBLOCK) # 此处卡住无法返回
C语言最小复现示例
情况略有不同:第一次send会阻塞长达10分钟,后续send则正常工作。
void *ctx = zmq_ctx_new(); void *socket = zmq_socket(ctx, ZMQ_PUB); zmq_bind(socket, "tcp://*:{port}"); int count = 1; while (1) { if(count % 60 == 0){ printf("Sending Message\n"); zmq_send(socket, "whatever", 8, ZMQ_NOBLOCK); printf("Message Sent.\n"); } count++; sleep (1); }
补充信息:strace输出
对Python进程执行strace后,得到重复的futex调用输出:
futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) ... write(9, "\1\0\0\0\0\0\0\0", 8) = 8 write(9, "\1\0\0\0\0\0\0\0", 8) = 8 futex(0x7f7bfc000020, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7f7bfc000020, FUTEX_WAKE_PRIVATE, 1) = 0
这是否可能是库层面的死锁问题?请问出现阻塞的原因是什么?恳请帮忙排查此问题。
内容的提问来源于stack exchange,提问作者ALG
相关产品推荐
相关产品推荐

