- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
通过包含 2 个 zeromq 订阅者和 1 个 zeromq 请求套接字的同一个类对象,我在不同的线程中创建对象。我使用属于同一个 ZContext 的 inproc zeromq 套接字。
每次创建对象时,服务器(运行 Centos 7)系统中打开的文件数 (lsof | wc -l) 都会递增。创建第一个对象后,打开的文件数增加了 300,第二个对象的打开文件数增加了 304,并持续增长。
由于我的程序可以在运行时使用这些对象中的许多,这可能会导致 zeromq 出现太多打开文件错误,即使我将限制设置为 524288 (ulimit -n)。随着对象的数量越来越多,每个对象消耗的打开文件限制更多,其中一些对象在 1500 左右。
在运行时,我的程序在创建许多对象并且线程在对象上执行它们的工作(将消息发送到另一个服务器或客户端)时因打开文件过多错误而崩溃。
我怎样才能克服这个问题?
示例代码:
void Agent::run(void *ctx) {
zmq::context_t *_context = (zmq::context_t *) ctx;
zmq::socket_t dataSocket(*(_context),ZMQ_SUB);
zmq::socket_t orderRequestSocket(*(_context),ZMQ_REQ);//REQ
std::string bbpFilter = "obprice.1;
std::string bapFilter = "obprice.2"
std::string orderFilter = "order";
dataSocket.connect("inproc://ordertrade_publisher");
dataSocket.connect("inproc://orderbook_prices_pub");
orderRequestSocket.connect("inproc://frontend_oman_agent");
int rc;
try {
zmq::message_t filterMessage;
zmq::message_t orderMessage;
rc = dataSocket.recv(&filterMessage);
dataSocket.recv(&orderMessage);
//CALCULATION AND SEND ORDER
// end:
return;
}
catch(std::exception& e) {
std::cerr<< "Exception:" << e.what() << std::endl;
Order.cancel_order(orderRequestSocket);
return;
}
}
最佳答案
我也遇到了这个问题。我不确定我是否有解决方案,但我看到上下文 (zmq::context_t
) 具有最大数量的套接字。参见 zmq_ctx_set
了解更多详情。此限制默认为 ZMQ_MAX_SOCKETS_DFLT
,这似乎是 1024。
您可能只需要增加您的上下文可以拥有的套接字数量,尽管我怀疑可能会发生一些泄漏(至少在我的情况下)。
更新:
我能够通过套接字选项的组合修复泄漏:
我不能确定我是否需要 linger 和 immediate,但它们似乎都适合我的用例;他们可能会帮助你。设置这些选项后,我打开的文件数量不会无限增加。
关于c++ - ZeroMq:打开的文件太多。同一对象上的 fd 使用量持续增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51557002/
我是一名优秀的程序员,十分优秀!