ottimizzare il mio server Linux per gestire 10.000 thread per processo
Come altri hanno spiegato, questo è generalmente sbagliato. Un thread è una risorsa costosa , in particolare perché ha il proprio stack di chiamate (in genere un megabyte) e perché è un'attività programmabile dal kernel. I thread sono ancora più costosi dei descrittori di file aperti .
Leggi i sistemi operativi: tre pezzi facili (libro di testo scaricabile gratuitamente).
Come regola generale, non si desidera avere molti thread e certamente non molti thread eseguibili. Il numero di thread eseguibili dovrebbe generalmente essere al massimo il numero di core (o un piccolo multiplo di quello), quindi circa una dozzina al massimo. Il numero di thread in un processo potrebbe essere leggermente più grande. Quindi, a meno che tu non abbia un server molto espansivo (con molti socket e core del processore), non vuoi avere più di una dozzina di thread eseguibili e un centinaio di thread (molti dei quali sono inattivi) nel tuo processo (sul desktop) .
Su Linux, thread e processi sono molto simili (poiché entrambi possono essere creati da clone (2) ) ed entrambi sono attività pianificate dal kernel. In realtà lo scheduler del kernel sta pianificando attività che possono essere thread all'interno di un processo multi-thread, o il singolo thread principale di un processo a thread singolo (in quel caso, chiamerai "process" quel singolo thread) o thread del kernel. Probabilmente non vuoi avere più di mille attività programmabili sul tuo sistema desktop.
Su Linux, un processo è semplicemente un gruppo di thread che condividono lo stesso spazio di indirizzi virtuale (e condividono alcune altre cose, come la tabella dei descrittori di file, ecc ...). Alcuni processi hanno solo un thread.
Uno spazio di indirizzi virtuali è definito da Wikipedia come
"l'insieme di intervalli di indirizzi virtuali che un sistema operativo mette a disposizione di un processo"
(ma vedi anche questa risposta che spiega che la terminologia non è universale e che alcuni documenti Microsoft utilizzano una definizione diversa e incompatibile ).
Su Linux, proc (5) è utile per comprendere lo spazio di indirizzi virtuale di alcuni processi. Prova entrambi
cat /proc/self/maps
e cat /proc/$$/maps
in un terminale. Vedi anche questo e pmap (1) & ps (1) e top (1) .
Tutti i programmi di spazio utente sono in esecuzione in alcuni processi e utilizzano la memoria virtuale, quindi ogni processo ha il suo spazio di indirizzi virtuale. La RAM fisica è una risorsa gestita dal kernel Linux e le applicazioni non hanno accesso diretto alla RAM (ad eccezione di mmap (2) -ing /dev/mem
, vedi mem (4) ).
Quindi un processo non utilizza direttamente la RAM. Utilizza la memoria virtuale e ha il suo spazio di indirizzi virtuale. Il kernel utilizza il paging per gestire le pagine RAM fisiche e fornire lo spazio degli indirizzi virtuali e le astrazioni del processo . In qualsiasi momento (anche quando il processo è inattivo o quando è in esecuzione) il kernel potrebbe sfogliare alcune pagine (ad esempio, scambiarle sul disco). Il kernel sta configurando la MMU (e gestendo le eccezioni hardware mancanti della pagina in alcuni gestori di interrupt , recuperando la pagina dal disco o propagando un errore di segmentazione al processo, vedere segnale (7) )
Potresti avere thread verdi sopra i thread di sistema (ma le librerie di thread verdi sono difficili da implementare e eseguire il debug). Dai un'occhiata alle goroutine usate in Go per un esempio di fantasia. Vedi anche setcontext (3) .
A volte, il tuo sistema potrebbe sperimentare il thrashing . Ciò accade quando la memoria virtuale totale (necessaria per tutti i processi) supera, per un grande fattore, la RAM fisica disponibile. Quindi il tuo computer non risponde. Informazioni su dimensioni del set di residenti , paging della domanda , set di lavoro , sovraccarico di memoria , ASLR .
Vedi anche -per Linux- fork (2) , clone (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , credenziali (7) , pthreads (7) , futex (7) , capacità (7) .