cpp-ipc icon indicating copy to clipboard operation
cpp-ipc copied to clipboard

怎样清空之前的接收进程?

Open ZesongLee opened this issue 3 years ago • 13 comments

当之前的接收进展不正常退出时, 此时对应的接收进程没有正常退出, 相应的que__的recv_conn次数也不会下降, 以至达到最大数量32... 有没有方便的接口可以快速清楚之前生成的所有接收进程?

ZesongLee avatar Nov 19 '20 04:11 ZesongLee

确实如你所说,因为我仅用了共享内存,进程崩溃对端是无感知的。 我一般是在signal中捕获异常情况,然后显式调用disconnect来执行清理动作。

mutouyun avatar Nov 21 '20 02:11 mutouyun

其实我在遇到发送超时的时候,有设计清除无效(引起超时的)连接标记的机制。 当环形队列满了,仍然有数据(接收者)未完成消费,就会触发超时等待(默认100ms)。

默认环形队列255,所以我有点奇怪。。除非系统在消息通讯写满队列的这段时间里,出现二三十次接收者崩溃,否则不会出现你的这个情况。。

mutouyun avatar Nov 21 '20 19:11 mutouyun

这里环形队列的长度255是指发送内容的长度255吗? 这样是否意味着我一直发送超过255的内容, 环形队列就会一直处于满的状态?

在这个过程中如果遇到段错误之类的强制退出, 有概率无法触发异常signal, 接收就会直接崩溃, 然后多次调试后确实会达到最大数量.

ZesongLee avatar Nov 22 '20 12:11 ZesongLee

不是,是指发送的消息个数 段错误之类的强制退出,在运行的时候应该不会抓不到的,你看下你捕获了哪几个信号,是否有遗漏

mutouyun avatar Nov 23 '20 06:11 mutouyun

谢谢, 再具体看看~

那在Linux下有没有清空之前已经占用shm的方法, 就像重启那样?

ZesongLee avatar Nov 24 '20 04:11 ZesongLee

暂时没有,我考虑加一个吧。

其实我以前的版本有这种接口,但后来我把它删掉了。 主要是粗暴的清空所有连接,有可能会导致其他问题,在这个接口的使用上必须小心,确保没有其他进程在用这个消息通道。

mutouyun avatar Nov 24 '20 08:11 mutouyun

在同一name使用传输多次后, 发送端会有几率触发以下问题:

prod_cons.h, 242:                 ipc::log("force_push: k = %u, cc = %u, rem_cc = %u\n", k, cc, cur_rc);
prod_cons.h, 243:                 cc = wrapper->elems()->disconnect(cur_rc); // disconnect all remained readers
prod_cons.h, 244:                 if (cc == 0) return false; // no reader

每100ms传输一次, 每次传输的数据2MB左右. 我感觉依然是之前的receiver进程没有退出干净导致的, 但是recv_conn的数量是正常的.

ZesongLee avatar Nov 24 '20 09:11 ZesongLee

在同一name使用传输多次后, 发送端会有几率触发以下问题:

prod_cons.h, 242:                 ipc::log("force_push: k = %u, cc = %u, rem_cc = %u\n", k, cc, cur_rc);
prod_cons.h, 243:                 cc = wrapper->elems()->disconnect(cur_rc); // disconnect all remained readers
prod_cons.h, 244:                 if (cc == 0) return false; // no reader

每100ms传输一次, 每次传输的数据2MB左右. 我感觉依然是之前的receiver进程没有退出干净导致的, 但是recv_conn的数量是正常的.

走到这里,说明有receiver意外退出,消息队列满了有消息还没消费完。 这里是自动清理超时连接的逻辑,因此这段代码走过之后,recv_conn的数量就正常了。

mutouyun avatar Nov 25 '20 02:11 mutouyun

这个disconnect也会随之清理消息队列对吧?

所以得到这个false之后我不应该立即关闭发送端退出程序, 而是应该直接尝试重新发送数据?

ZesongLee avatar Nov 25 '20 08:11 ZesongLee

这个disconnect也会随之清理消息队列对吧?

所以得到这个false之后我不应该立即关闭发送端退出程序, 而是应该直接尝试重新发送数据?

对的,你看下还存活的接收端是不是收到数据了。这个提示不影响正常的接收端。

mutouyun avatar Nov 26 '20 01:11 mutouyun

Sender端2MB数据每20ms发送一次的话, Receiver的recv()函数会等待超过50ms, 甚至在一些情况下超过100ms, 这是什么原因导致的呢?

我调整了ipc::data_length, 发现并没有明显的改善...

ZesongLee avatar Dec 03 '20 15:12 ZesongLee

Sender端2MB数据每20ms发送一次的话, Receiver的recv()函数会等待超过50ms, 甚至在一些情况下超过100ms, 这是什么原因导致的呢?

我调整了ipc::data_length, 发现并没有明显的改善...

发送接收是单对单的, "ssu"

ZesongLee avatar Dec 03 '20 15:12 ZesongLee

hi,请问你的编译环境、运行时的硬件环境和操作系统是怎样的? demo/msg_que 的测试能够跑到多少每秒?

mutouyun avatar Dec 06 '20 13:12 mutouyun