nginx clobbering traffico sftp durante le ore di punta – è la risposta di tc?

Questo è probabilmente una continuazione della mia precedente (senza risposta) perché la causa sottostante è probabilmente la stessa.

Ho un server Linux con nginx e sshd in esecuzione su di esso. È su un link condiviso 100metri / s non misurato. Durante "tempi di punta" (fondamentalmente, durante il giorno negli Stati Uniti), la prestazione di sftp diventa molto ctriggers, a volte la tempistica prima di poter anche connettersi. ssh non è influenzato. So che è nginx perché quando smetto nginx, il problema con sftp va via immediatamente. Tuttavia, la nginx stessa ha essenzialmente zero latenza durante questi "episodi".

  • Dite al kernel linux di mettere un file nella cache del disco?
  • Solaris è meglio a servire le richieste web?
  • sincronizzazione delle cartelle locali
  • Bash - Programma sta scrivendo direttamente al terminal
  • Suggerimenti sulle distribuzioni Linux per i server
  • Improvvisamente ha iniziato a sperimentare enormi tempi di attesa prima che le richieste hanno colpito il server
  • Questo è un problema di lunga durata con il mio server e ho iniziato di recuperare una volta per tutte. Ieri ho cominciato a sospettare che il volume puro del traffico http accoppiato con la latenza maggiore indotta da una mancanza di width di banda a monte stava affondando il mio traffico sftp. Ho usato tc per aggiungere alcune priorità:

     /sbin/tc qdisc add dev eth1 root handle 1: prio /sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1 /sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:1 /sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1 

    Purtroppo, anche se posso vedere i pacchetti sftp accumulati nel primo prio:

     class prio 1:1 parent 1: Sent 257065020 bytes 3548504 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 class prio 1:2 parent 1: Sent 291943287326 bytes 206538185 pkt (dropped 615, overlimits 0 requeues 0) backlog 0b 0p requeues 0 class prio 1:3 parent 1: Sent 22399809673 bytes 15525292 pkt (dropped 2334, overlimits 0 requeues 0) backlog 0b 0p requeues 0 

    … la latenza è ancora inaccettabile quando si collega. Ecco alcuni graziosi grafici che ho fatto proprio ora cercando di correlare qualcosa con la latenza sftp:

    Ecco la latenza sftp da una posizione diversa. Ho il timeout impostato a 25 secondi. Qualsiasi cosa più grande del normale 1-2 secondi che occorre per colbind e scaricare un piccolo file è inaccettabile per me. Potete vedere come diventa OK durante la notte e poi la latenza calcia di nuovo durante il giorno.

    Contenuto di /proc/net/sockstat . Si noti la correlazione apparente della latenza sftp con l'utilizzo della memory tcp. Non c'è idea di ciò che potrebbe significare.

    Uscita del module stub status di nginx. Niente da vedere quì …

    Uscita di netstat -tan | awk '{print $6}' | sort | uniq -c netstat -tan | awk '{print $6}' | sort | uniq -c netstat -tan | awk '{print $6}' | sort | uniq -c . Ancora una volta, sembra piatta.

    Allora perché non funziona per me? Devo effettivamente limitare la width di banda piuttosto che solo dare priorità alla port 22 dentro e fuori? O è tc lo strumento sbagliato per il lavoro e manca totalmente la vera causa del male performance sftp?

    Uscita di uname -a :

    Linux [redacted] 3.2.0-0.bpo.2-amd64 #1 SMP Fri Jun 29 20:42:29 UTC 2012 x86_64 GNU/Linux

    Sto eseguendo nginx 1.2.2 con il module streaming mp4 compilato.

    Modifica 2012/07/31:

    Ewwhite ha chiesto se sono vicino o al mio limite di width di banda. Ho controllato, e sembra che sia una correlazione (anche se non perfetta) tra il limite di 100 mbit e la ctriggers latenza sftp:

    Perché, però, il traffico sftp (associato alla port 22) non wheresse essere priorizzato al di sopra del traffico http durante questi episodi?

    Modifica 2012/07/31 # 2

    Nel raccogliere i dati di latenza sftp / scp ho notato un pattern, come mostrato nel grafico sottostante (le righe verdi che ho aggiunto):

    Due cluster – sottraendo la latenza "basale", sono a ~ 5 e ~ 10 secondi. Potete anche vederli abbastanza chiaramente sul grafico di latenza sftp di cui sopra su una scadenza molto più grande. Da where viene questo numero di 5 secondi?

  • Configurare iptables con un ponte e IP statici
  • Utilizzare uWSGI come server proxy
  • chkconfig su per il programma di path arbitrario
  • Puoi consigliare un'applicazione gratuita del pannello di controllo (alternativa cPanel) o una distro Linux speciale (con un pannello di questo tipo) per un piccolo hosting condiviso?
  • Nel mio / etc / hosts / file su Linux / OSX, come faccio a sottodominare un wildcard?
  • smettila linux a inviarmi messaggi di errore cron?
  • 2 Solutions collect form web for “nginx clobbering traffico sftp durante le ore di punta – è la risposta di tc?”

    Un paio di cose saltano fuori a me …

    • Non stai uscendo o si avvicina ai limiti della width di banda, vero?
    • Hai esaminato i livelli di pool di entropia del sistema durante il periodo di performance slow sftp (check /proc/sys/kernel/random/entropy_avail )? Ad esempio, le sessioni di nginx eseguono molte richieste SSL? Questo può avere un effetto chiaro su altri servizi che utilizzano la crittografia.
    • Ci sono alcuni parametri di sintonia sysctl.conf che possono aiutare (tcp window size?), Ma sftp non è terribilmente efficiente. È scp un'opzione? Quanti sono i file?
    • DNS? Si incontrano ritardi di ricerca inversa? Hai qualche controllo su chi ti connette? Se è prevedibile, provare una voce di stub per l'IP di origine in /etc/hosts per vedere se ciò aiuta.

    Quindi si scopre che ho avuto alless tre problemi diversi che si mascherano l'un l'altro. Ecco cosa ho fatto per risolvere i problemi:

    1. Priorita l'ICMP e il traffico in output / in output sulla port 22 (come mostrato nella mia domanda precedente). Ciò aumenta la capacità di risposta sftp (ad esempio, ls ) e anche la trasmissione della trasmissione durante i periodi di punta.

    2. Risolvere la carenza di entropia installando il pacchetto haveged tramite i backports di Debian. Ciò risolve il "block per diversi minuti a select() " . ewwhite ++

    3. Aggiungi UseDNS no a /etc/ssh/sshd_config e rehash sshd . Questo risolve il ritardo sftp a intervalli di 5 secondi durante i periodi di picco. Sergey Vlasov ++

    Rimanenti misteri:

    • Il mio host ha inizialmente configurato /etc/resolv.conf per me, aggiungendo due dei loro nameserver come primari. È comprensibile che uno o più di questi nameserver siano sovraccarichi durante i periodi di punta (cioè durante il giorno negli Stati Uniti), con conseguente ritardi di intervalli di 5 secondi che ho notato nei miei grafici di latenza sftp. Tuttavia, perché sftp eseguire una ricerca DNS inversa each volta che trasferisco un file ? Sono stati semplicemente questi casi quando la ricerca inversa è stata interrotta sulla connessione iniziale e poi, al primo trasferimento, il sottosistema sftp ripetutamente tentato di invertire il mio IP? In questo caso il sistema non provare i server dei nomi secondari? Ad each modo, ho aggiunto alcuni noti public server di pubblico come primarie nei confronti dei miei overload di ISP, in modo che altre possibili applicazioni in esecuzione su questo stesso server non avranno problemi con DNS durante i tempi di punta.

    • Che cosa sta consumando entropia sul mio server? Non riesco a trovare alcuna prova che il file nginx (che serve file statici) chiama rand() , eppure sembra proprio quello che sta succedendo. È il filesystem (ext3 / 4) o è un'altra parte del kernel coinvolto in qualche modo?

    Comunque, questo è abbastanza buono per adesso. Grazie a questa comunità, sono riuscito a risolvere uno dei problemi più fastidiosi e persistenti che ho incontrato in oltre dieci anni di amministrazione del server web unix.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.