1. 程式人生 > >ICE 超過最大連線數崩潰的問題

ICE 超過最大連線數崩潰的問題

最近做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重新使用原始碼編譯。