Ho installato Nginx + uWSGI + Django su un VDS con 3 core CPU. uWSGI è configurato per 6 processi e 5 thread per processo. Ora voglio dire a WSGI di utilizzare i processi per il bilanciamento del carico fino a quando tutti i processi sono occupati e quindi utilizzare i thread se necessario. Sembra che uWSGI preferisca i thread e non ho trovato alcuna opzione di configurazione per modificare questo comportamento. Il primo processo richiede oltre il 100% di tempo di CPU, il secondo richiede circa il 20% e altri processi non vengono utilizzati per lo più.Come dire a uWSGI di preferire i processi ai thread per il bilanciamento del carico
Il nostro sito riceve 40 r/s. In realtà anche avere 3 processi senza thread è utile per gestire tutte le richieste di solito. Tuttavia, l'elaborazione delle richieste si blocca di volta in volta per vari motivi, ad esempio le risorse condivise bloccate, ecc. In questi casi, abbiamo il processo -1. Gli utenti non amano aspettare e fare clic sul collegamento ancora e ancora. Di conseguenza tutti i processi si bloccano e tutti gli utenti devono attendere.
Vorrei aggiungere ancora più thread per rendere il server più robusto. Ma il problema è probabilmente Python GIL. Threads non utilizzerà tutti i core della CPU. Quindi più processi funzionano molto meglio per il bilanciamento del carico. Ma i thread possono aiutare molto nel caso di risorse condivise bloccate e I/O attendere i ritardi. Un processo può fare molto lavoro mentre uno dei suoi thread è bloccato.
Non voglio ridurre i limiti di tempo finché non ci sono altre soluzioni. È possibile risolvere questo problema con i thread in teoria, e non voglio mostrare all'utente i messaggi di errore o fargli aspettare ogni richiesta fino a quando non c'è altra scelta.
Quando dico "processi anziché thread per il bilanciamento del carico" intendo che voglio bilanciare l'utilizzo dei thread tra i processi invece di inviare tutte le richieste a un singolo processo a meno che non sia occupato al 100%. I thread non sono realmente paralleli all'interno di un singolo processo in Python a causa di GIL. Che ne dici di uWSGI 1.4? Ha un algoritmo di bilanciamento del carico migliore? Io uso Ubuntu LTS con uwsgi 1.0.3 (spero sia stabile nei lts). Ha davvero senso aggiornarlo? Ho anche pensato alla modalità più economica, ma è soprattutto per risolvere il problema della mandria di tuoni. Ma non credo che ci sia mancanza di discussioni, la maggior parte di esse non viene utilizzata. – raacer
qualsiasi cosa <1.4 non è supportato e buggato. 1.0 ha più di 2 anni e nel frattempo uWSGI si è evoluto (e migliorato) molto.Come autore principale di uWSGI posso dire che qualsiasi cosa <1.4 non ha nulla a che fare con ciò che uWSGI è attualmente. – roberto
"Come l'autore principale di uWSGI" è un argomento significativo! Dovevi iniziare con questo :) Grazie per la spiegazione, sono felice di ricevere una risposta dall'autore di uWSGI. Può essere che tu possa spiegare brevemente qual è la logica corrente per scegliere un thread per l'elaborazione delle richieste in 1.9? Potresti per favore? – raacer