Syslog.eu

System log of the Unix and other worlds

By

Solaris CLOSE_WAIT

Flattr this!

V Solarisu se stává, že netstat ukazuje poměrně hodně TCP spojení, které jsou ve stavu CLOSE_WAIT. V tomto stavu jsou klidně i několk dnů. Čím je to způsobeno a jak se to dá odstranit?


Na vině jsou Solaris a Windows. V podstatě jde o to, že win klienti neumějí správně ukončit TCP spojení a Solaris, i když by měl, se z toho nedostane.

Správné ukončení TCP spojení má vypadat asi takto:

client          server
1   --- FIN,ACK -->
2   < ---- ACK ----- 
3

Ve chvíli, kdy klient požádá u ukončení (1), server mu ukončení potvrdí (2) a po vyřízení všech požadavků pošle i klientovi zprávu, že přechází do stavu CLOSE (3) a klient mu to potvrdí (4). Toto poslední potvrzení (4) ale některé verze windows neposílají a server tak čeká a čeká a …. Správně by měl podle nastavení timeoutu sám po určité době spojení uzavřít. Tento timeout můžeme zkusit nastavit pomocí ndd:

ndd -set /dev/tcp tcp_close_wait_interval 60000

(1 minuta)

Ale u Solarisu se tak neděje. Pomůže jedině ukončení procesu, který spojení udržuje. Jenže u velkých systémů může nastat problém, že podle čísla portu nejsme schopni jednoznačně určit, jaký proces port “drží”. V linuxu by se to dalo vyřešit

netstat -p

a dostaneme u každého spojení i číslo/název procesu. V Solarisu si musíme pomoci příkazem

lsof -i

Ta nám v podstatě udělá stejnou službu. Pak už stačí zjištěný proces zabít ručně. V Solarisu 9 je již lsof součástí systému, do starších verzí lze lsof nainstalovat například z Sunfreeware.com.

Stránky projektu Lsof

Poor English excerpt:

Many semi-closed connections in Solaris can be frozen in a CLOSE_WAIT state because some clients (e.g. Windows) do not close its TCP/IP sessions correctly. We have to kill process which holds this connection. On Linux we can use netstat -p to identify that one but in Solaris we have to use the lsof utility which can do the same work (lists open TCP/IP sessions with process id holder). You can also try to decrease tcp-force-close timeout to 1 minute by a comand:

ndd -set /dev/tcp tcp_close_wait_interval 60000

Lsof project

One Response to Solaris CLOSE_WAIT

  1. nixik says:

    to se mi stava bezne, vzdy nakonec restaruju celou masinu :-(
    dik za info

Leave a Reply

Your email address will not be published. Required fields are marked *