通过包含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;
}
}