ICE 超過最大連線數崩潰的問題
阿新 • • 發佈:2019-02-10
最近做ice伺服器的壓力測試,發現ICE在檔案描述符用盡的情況下會崩潰,檢視原始碼發現時connectionFactory中的一段程式碼:
//
// Now accept a new connection.
//
TransceiverPtr transceiver;
try
{
transceiver = _acceptor->accept();
}
catch(const SocketException& ex)
{
if(noMoreFds(ex.error))
{
{
Error out (_instance->initializationData().logger);
out << "fatal error: can't accept more connections:\n" << ex << '\n' << _acceptor->toString();
}
abort();
}
// Ignore socket exceptions.
return;
}
bool
IceInternal::noMoreFds(int error)
{
#ifdef _WIN32
return error == WSAEMFILE;
#else
return error == EMFILE || error == ENFILE;
#endif
}
EMFILE The per-process limit of open file descriptors has been reached.
ENFILE The system limit on the total number of open files has been reached.
返回EMFILE或者ENFILE通常是由於linux程序預設的單程序可以開啟的最大描述符過小導致的。通過修改ulimit -n 可以修改當前使用者的最大描述符數。 也可以通過修改/etc/security/limits.conf/ 來修改所有使用者的最大描述符數。
ICE3.4.2中當檢測單noMoreFd時伺服器崩潰,因為會呼叫abort函式。其實這是沒必要的,返回客戶端連線異常就足夠了。所以需要的話可以註釋掉abort重新使用原始碼編譯。