Så var det et lite "breakthrough" på USB og CPU-bruk (jeg bruker Debian standard 3.2.0-3 rt-kernel, men dette gjelder for nye kernels også)
I motsetning til Oblivion er ikke jeg av den oppfatning at det er noe poeng å få all CPU bruk så lav som overhodet mulig. Jeg tror heller ikke at kernelutviklerne for en så viktig driver som ehci_hcd/xhci_hcd er en haug med rablende fylliker som inkluderer en masse kode på uintelligente måter som sluker CPU cycles for morro skyld.
Bekreftelsen på dette er vel egentlig at xhci_hcd (USB 3.0) som jo er en ny driver er akkurat like "ille" som ehci_hcd (USB 2.0).
MEN, Oblivion har likevel et godt poeng når han klager på CPU-bruken på Intel platformen kontra f.eks ARM. Det gir ingen mening for meg at dette skal variere så fryktelig, vel og merke gitt at det er samme source code som ligger til grunn for drivermodulene.
Den gode nyheten er imidlertid at jeg har funnet ut hva som er den store synderen. På mitt system aktiveres det av en eller annen grunn to tråder for USB 2.0 hubens IRQ 23, sånn bare til info når du ser på outputen. I tillegg er det verdt å merke seg at "top" kjører med "Irix mode ON" som default, noe som vil si at prosentvis CPU bruk oppgitt for en prosess er i forhold til den CPU-kjernen den kjører på, ikke i forhold til all CPU-kapasitet på systemet. 4% CPU for en prosess i "top" med "Irix mode on" vil dermed si 1% CPU bruk om man ser på alle CPUer totalt i et quad system. Man kan toggle Irix-mode med "I" i top. Alle skjermdumpene er med standardinnstillinger i top, med unntak av at jeg viser alle kjernene øverst.
OK. Dette var utgangspunktet:
Deretter kom jeg hit:
For til slutt å havne her:
Dette krevde ingen hacks, source kode endringer, nrpacks, eller kompilering. Synderen er rett og slett SMP og veksling mellom ulike CPUer!
Mitt system har en dual core i3 med hyper threading, dvs 4 logiske kjerner. I det øverste bildet flyter IRQ-trådene fritt mellom CPUene (default). MPD er låst med CPU affinity til CPU 2.
I neste bilde har jeg satt CPU affinity til 3 (altså en annen enn MPD) for IRQ-trådene til USB huben. Allerede her ser vi en fin nedgang i CPU bruk.
I siste bilde har jeg satt samme affinity som MPD. Det vil si at MPD og IRQ-prosessene befinner seg på samme CPU. Her får vi en CPU-bruk som ser langt mer "riktig" ut for IRQ-trådene. Her vil CPU-cachen treffes så ofte som overhodet mulig siden mpd og interrupts befinner seg på samme CPU.
Ideen til å teste dette kom ikke på måfå selvsagt. Man kan vrenge mange prosent (faktisk flere titalls er rapportert) ekstra ytelse fra servere med høyhastighetsnettilkoblinger som f.eks 10GB ved å tilordne interrupt-tråder for nettverkskortet til CPUene på intelligent vis sett i forhold til NUMA og applikasjoner.
Dette forklarer også hvorfor et system uten mange kjerner ser vesentlig lavere CPU-bruk på USB out-of-the-box.
Jeg har vurdert å dytte nettverkskortets IRQ inn på samme CPU, men jeg er fremdeles av den oppfatning av at nettverkskortet bare kan flyte rundt som før og at trafikken ikke bør prioriteres høyere enn noe annet. Rett og slett for å gi mest mulig CPU-tid til den tidskritiske delen av avspillingen.
Scriptet mitt er oppdatert for å ta høyde for dette, samt å gjøre det litt lettere å teste affinity (enkelt å resette til default). Forøvrig er det rt-kernel og nrpacks=1 som har kjørt på systemet med suksess etter at jeg kastet ut Samsung 9-laptopen og satte opp mpd-boksen skikkelig med picopsu og passiv kjølt kabinett i massiv aluminium i stedet. Laptopen passet bare ikke til formålet på grunn av alt dillet og tullet det fokuseres på i en typisk laptop.
Scriptet: http://www.marsboer.net/shared/hifi-linux/hifi.sh
I motsetning til Oblivion er ikke jeg av den oppfatning at det er noe poeng å få all CPU bruk så lav som overhodet mulig. Jeg tror heller ikke at kernelutviklerne for en så viktig driver som ehci_hcd/xhci_hcd er en haug med rablende fylliker som inkluderer en masse kode på uintelligente måter som sluker CPU cycles for morro skyld.
Bekreftelsen på dette er vel egentlig at xhci_hcd (USB 3.0) som jo er en ny driver er akkurat like "ille" som ehci_hcd (USB 2.0).
MEN, Oblivion har likevel et godt poeng når han klager på CPU-bruken på Intel platformen kontra f.eks ARM. Det gir ingen mening for meg at dette skal variere så fryktelig, vel og merke gitt at det er samme source code som ligger til grunn for drivermodulene.
Den gode nyheten er imidlertid at jeg har funnet ut hva som er den store synderen. På mitt system aktiveres det av en eller annen grunn to tråder for USB 2.0 hubens IRQ 23, sånn bare til info når du ser på outputen. I tillegg er det verdt å merke seg at "top" kjører med "Irix mode ON" som default, noe som vil si at prosentvis CPU bruk oppgitt for en prosess er i forhold til den CPU-kjernen den kjører på, ikke i forhold til all CPU-kapasitet på systemet. 4% CPU for en prosess i "top" med "Irix mode on" vil dermed si 1% CPU bruk om man ser på alle CPUer totalt i et quad system. Man kan toggle Irix-mode med "I" i top. Alle skjermdumpene er med standardinnstillinger i top, med unntak av at jeg viser alle kjernene øverst.
OK. Dette var utgangspunktet:
Deretter kom jeg hit:
For til slutt å havne her:
Dette krevde ingen hacks, source kode endringer, nrpacks, eller kompilering. Synderen er rett og slett SMP og veksling mellom ulike CPUer!
Mitt system har en dual core i3 med hyper threading, dvs 4 logiske kjerner. I det øverste bildet flyter IRQ-trådene fritt mellom CPUene (default). MPD er låst med CPU affinity til CPU 2.
I neste bilde har jeg satt CPU affinity til 3 (altså en annen enn MPD) for IRQ-trådene til USB huben. Allerede her ser vi en fin nedgang i CPU bruk.
I siste bilde har jeg satt samme affinity som MPD. Det vil si at MPD og IRQ-prosessene befinner seg på samme CPU. Her får vi en CPU-bruk som ser langt mer "riktig" ut for IRQ-trådene. Her vil CPU-cachen treffes så ofte som overhodet mulig siden mpd og interrupts befinner seg på samme CPU.
Ideen til å teste dette kom ikke på måfå selvsagt. Man kan vrenge mange prosent (faktisk flere titalls er rapportert) ekstra ytelse fra servere med høyhastighetsnettilkoblinger som f.eks 10GB ved å tilordne interrupt-tråder for nettverkskortet til CPUene på intelligent vis sett i forhold til NUMA og applikasjoner.
Dette forklarer også hvorfor et system uten mange kjerner ser vesentlig lavere CPU-bruk på USB out-of-the-box.
Jeg har vurdert å dytte nettverkskortets IRQ inn på samme CPU, men jeg er fremdeles av den oppfatning av at nettverkskortet bare kan flyte rundt som før og at trafikken ikke bør prioriteres høyere enn noe annet. Rett og slett for å gi mest mulig CPU-tid til den tidskritiske delen av avspillingen.
Scriptet mitt er oppdatert for å ta høyde for dette, samt å gjøre det litt lettere å teste affinity (enkelt å resette til default). Forøvrig er det rt-kernel og nrpacks=1 som har kjørt på systemet med suksess etter at jeg kastet ut Samsung 9-laptopen og satte opp mpd-boksen skikkelig med picopsu og passiv kjølt kabinett i massiv aluminium i stedet. Laptopen passet bare ikke til formålet på grunn av alt dillet og tullet det fokuseres på i en typisk laptop.
Scriptet: http://www.marsboer.net/shared/hifi-linux/hifi.sh
Sist redigert: