Questa domanda è simile a Network port open, but no process attached? e netstat shows a listening port with no pid but lsof does not. Ma le risposte a loro non possono risolvere il mio, dal momento che è così strano.Perché sempre 5 connessioni senza programma allegato?
Ho un'applicazione server chiamato lps
che attende per le connessioni TCP sulla porta 8588.
[[email protected] lcms]# netstat -lnp | grep 8588
tcp 0 0 0.0.0.0:8588 0.0.0.0:* LISTEN 6971/lps
Come si può vedere, non c'è niente di sbagliato con il socket di ascolto, ma quando collego alcune migliaia di clienti di test (scritto da un altro collega) al server, sia che si tratti di 2000, 3000 o 4000. Ci sono sempre stati 5 client (che sono anche casuali) che collegano e inviano richieste di accesso al server, ma non possono ricevere alcuna risposta. Prendi 3000 clienti come esempio. Questo è ciò che il comando netstat
dà:
[[email protected] lcms]# netstat -nap | grep 8588 | grep ES | wc -l
3000
E questo è lsof
output del comando:
[[email protected] lcms]# lsof -i:8588 | grep ES | wc -l
2995
che 5 connessioni sono qui:
[[email protected] lcms]# netstat -nap | grep 8588 | grep -v 'lps'
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52658 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52692 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52719 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52721 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52705 ESTABLISHED -
Il 5 di cui sopra dimostra che essi sono collegati al server sulla porta 8588 ma nessun programma collegato. E la seconda colonna (che è RECV-Q
) continua ad aumentare mentre i client inviano la richiesta.
I collegamenti riportati sopra indicano qualcosa su NFS mount e RPC. Per quanto riguarda la RPC, ho usato il comando rcpinfo -p
e il risultato non ha nulla a che fare con la porta 8588. E NFS mount, nfssta
uscita dice Error: No Client Stats (/proc/net/rpc/nfs: No such file or directory).
Domanda: Come può accadere questo? Sempre 5 e anche non dagli stessi 5 clienti. Non penso che sia conflitto di porte in quanto gli altri client sono anche connessi allo stesso IP e alla stessa porta del server e sono tutti gestiti correttamente dal server.
Nota: sto utilizzando Linux epoll
per accettare richieste client. Scrivo anche il codice di debug nel mio programma e registra ogni socket (insieme alle informazioni dei clienti) che restituisce accept
ma non riesce a trovare le 5 connessioni. Questo è uname -a
output:
Linux centos63 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Grazie per il vostro gentile aiuto! Sono veramente confuso.
Aggiornamento 2013/06/08: Dopo l'aggiornamento del sistema per CentOS 6.4, lo stesso problema si verifica. Alla fine sono tornato a epoll
e ho trovato this page dicendo che set ascolta fd per essere non bloccante e accept
fino a o restituzioni di errore EWOULDBLOCK
. E sì, funziona. Non ci sono più connessioni in sospeso. Ma perché è così? Il rete Unix Programming Volume 1 dice
accept is called by a TCP server to return the next completed connection from the
front of the completed connection queue. If the completed connection queue is empty,
the process is put to sleep (assuming the default of a blocking socket).
Quindi, se ci sono ancora alcuni collegamenti completati in coda, perché il processo è messo a dormire?
Aggiornamento 2013/07/01: io uso EPOLLET
quando si aggiunge il socket di ascolto, in modo da non posso accettare tutto, se non mantenere accetta fino EAGAIN
incontrato. Ho appena realizzato questo problema. Colpa mia. Ricorda: sempre read
o accept
fino a EAGAIN
esce se si utilizza EPOLLET
, anche se è in ascolto. Grazie ancora a Matthew per avermi dimostrato con un programma di test.
C'è qualcosa di speciale nell'IP 192.168.0.241 nel proprio ambiente? – Nils
Un altro aggiunto a @Nils, non penso che sia il problema di IP 192.168.0.241. Abbiamo diverse macchine virtuali di prova e quelle 5 possono provenire da diversi host. – leowang
Aspetta un minuto. Questo server 'lps' è un programma che stai scrivendo? –