dunno Temat założony przez niniejszego użytkownika |
Blad accept: Too many open files » 2025-02-01 18:07:20 Aplikacja postawiona na Debian 11 przed zamknięciem aplikacji wywala wielokrotnie błąd: accept: Too many open files aplikacja: https://pastebin.com/w2NgZkhs. dodatkowo mam zalogowana informacje ze aplikacja sama sie zamknela poniewaz listen_errors przekroczyl 100 i dodane mam wypisywanie w konsoli: accept_errors = 0; while( g_game.getGameState() != GAME_STATE_SHUTDOWN && accept_errors < 100 ) { fd_set listen_set; timeval tv; FD_ZERO( & listen_set ); FD_SET( listen_socket, & listen_set ); tv.tv_sec = 2; tv.tv_usec = 0; int32_t reads =( int32_t ) select( listen_socket + 1, & listen_set, NULL, NULL, & tv ); if( reads == SOCKET_ERROR ) { int32_t errnum; #ifdef WIN32 errnum = WSAGetLastError(); #else errnum = errno; #endif if( errnum == ERROR_EINTR ) { continue; } else { SOCKET_PERROR( "select" ); break; } } else if( reads == 0 ) { continue; } SOCKET s = accept( listen_socket, NULL, NULL ); OTSYS_SLEEP( 100 ); if( s > 0 ) { OTSYS_CREATE_THREAD( ConnectionHandler,( void * ) & s ); } else { accept_errors++; SOCKET_PERROR( "accept" ); } } closesocket( listen_socket ); listen_errors++; } if( listen_errors >= 100 ) { std::cout << "ERROR: Server shutted down because there where 100 listen errors." << std::endl; }
następnie aplikacja zamyka się z bledem w konsoli ERROR: Server shutted down because there where 100 listen errors. Obejscie problemu to: do /etc/security/limits.conf dodalem username hard nofile 4096 oraz przed uruchamianiem apki dla pewnosci: ulimit -n 4096 Natomiast wydaje mi sie, ze gdzies te sockety nie sa zamykane poprawnie bylby ktoś w stanie zerknac na kod https://pastebin.com/w2NgZkhs i zobaczyc czy sockety sa zamykane we wlasciwych miejscach? Source bazowane na: https://github.com/divinity76/YurOTS/tree/master/ots/source |
|
pekfos |
» 2025-02-01 19:16:28 Obejscie problemu to: do /etc/security/limits.conf dodalem username hard nofile 4096
oraz przed uruchamianiem apki dla pewnosci: ulimit -n 4096 W żaden sposób nie obejdziesz wycieku zasobów, więc jeżeli to działa i działa stabilnie, to problem jest rozwiązany. Po prostu masz za duży ruch względem konfiguracji programu. Do faktycznej diagnozy powinieneś obserwować użycie deskryptorów plików przez program, np przez ls -l /proc/pid-programu/fd i sprawdzić czy użycie rośnie w przypadku gdy nie powinno. A jeśli rośnie, to co dokładnie rośnie. Te zasoby są używane nie tylko przez sockety. |
|
dunno Temat założony przez niniejszego użytkownika |
» 2025-02-01 21:40:15 Jak udało mi się ustalić problem pojawiał się w przypadku ataków DDOS. Na ten moment był ostatni tego typu atak i serwer gry nie został wyłączony, więc jest okej. Dziękuje również jak zawsze za cenne wskazówki. |
|
pekfos |
» 2025-02-01 23:04:28 Tu wystarczy zwykły atak DoS, bo mechanizm awarii programu nie wymaga dużego ruchu. Potrzeba tylko dużej liczby połączeń, o co dość łatwo. Może po prostu wywal ten warunek wyłączający program. Serwery tak nie działają, bo to tworzy podatność na atak na dostępność usługi. |
|
dunno Temat założony przez niniejszego użytkownika |
» 2025-02-02 09:45:24 właśnie rano znowu serwer padł, w logach znowu widać, że celowo ktoś atakował. Zgodnie z twoją radą wyłaczyłem ten warunek, zobaczę co się wydarzy. Dzięki. |
|
dunno Temat założony przez niniejszego użytkownika |
» 2025-02-02 18:13:27 Wracam z efektem: teraz serwera nie wywalilo, ale byly mega lagi i padł "login server" tj. nie można było zalogować się do gry ;p |
|
dunno Temat założony przez niniejszego użytkownika |
» 2025-02-02 18:26:26 cos mozna na to poradzic z poziomu aplikacji? |
|
DejaVu |
» 2025-02-02 20:58:39 Możesz np. dorobić jakiś mechanizm szybkiego odrzucania nowych połączeń. |
|
« 1 » 2 |