Perplesso dalla regolazione cpushare su Docker.

Ho scritto un programma di prova 'cputest.py' in python come questo:

import time while True: for _ in range(10120*40): pass time.sleep(0.008) 

, che costa 80% di CPU quando è in esecuzione in un contenitore (senza interferenze di altri contenitori).

Poi ho eseguito questo programma in due contenitori con i seguenti due comandi:

 docker run -d -c 256 --cpuset=1 IMAGENAME python /cputest.py docker run -d -c 1024 --cpuset=1 IMAGENAME python /cputest.py 

e utilizzati 'in cima' per visualizzare i costi del cpu. È risultato che abbiano relativamente costo del 30% e del 67% di CPU. Sono abbastanza perplesso da questo risultato. Qualcuno lo spiegherà gentilmente per me? Grazie molto!

    Mi sono seduto ieri sera e ho cercato di capirlo da solo, ma ho finito per non essere in grado di spiegare la divisione 70/30. Così, ho inviato un'email ad alcuni altri devs e ho ricevuto questa risposta, che credo abbia senso:

    Penso che tu sia un po 'malinteso come funziona la pianificazione delle attività – ecco perché le matematiche non funzionano. Cercherò di scavare un buon articolo, ma a un livello di base il kernel assegna fette di tempo ad each attività che deve eseguire e assegna le fette alle attività con le priorità assegnate.

    Quindi, con quelle priorità e il codice stretto (senza sonno) il kernel assegna 4/5 delle slot a a e 1/5 a b. Quindi la divisione 80/20.

    Tuttavia, quando aggiungi nel sonno diventa più complesso. Il sonno innanzitutto dice al kernel di cedere l'attività corrente e quindi l'esecuzione tornerà a quel task dopo che il tempo di sonno è trascorso. Potrebbe essere più lungo del tempo dato – soprattutto se ci sono più elevati compiti prioritari in esecuzione. Quando niente altro sta eseguendo il kernel allora si siede inattivo per il tempo di sonno.

    Ma quando hai due compiti, i sonni permettono di intrecciare i due compiti. Così quando uno dorme l'altro può eseguire. Ciò probabilmente port ad una complessa esecuzione che non è ansible modellare con matematiche semplici. Sentitevi liberi di dimostrarmi sbagliato lì!

    Penso che un altro motivo per la divisione 70/30 sia il modo in cui stai facendo "carico del 80%". I numbers che hai scelto per il ciclo e il sonno funzionano solo sul tuo PC con un'unica esecuzione. Potresti provare a spostare il ciclo per essere basata sul tempo trascorso – quindi il ciclo per 0,8 poi il sonno per 0,2. Questo potrebbe darti qualcosa di più vicino all'80/20, ma non lo so.

    Quindi, in sostanza, la tua chiamata time.sleep() sta spingendo i numbers attesi, rimuovendo il time.sleep() causa il carico CPU più vicino a quello che ci si aspetterebbe.