blog · git · desktop · images · contact


mpd und die CPU-Last

2009-01-12

mpd ist ja prinzipiell eine tolle Sache, aber er legte hier ein Verhalten an den Tag, das ich noch bei keinem anderen Player gesehen habe: Bis zu 50% CPU-Last? Das heißt, ein Kern wird voll ausgelastet und zwar nur vom Musik abspielen? Da kann was nicht stimmen. :mhf:

Eine kurze Google-Recherche warf mich ins mpd-Wiki: Scheinbar ist ALSA (bzw. dmix als Standard-Plugin dafür) im Moment ziemlich duselig eingestellt und wendet immer Resampling an: Hoch auf 48000 Hz und 32 Bit. Das kostet natürlich Zeit und vorallem ist es - zumindest mir - unverständlich und erscheint sinnlos.

Eine nette Sache dabei gelernt: Mit

$ cat /proc/asound/card0/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 1024
buffer_size: 8192

kann man sich ansehen, mit welchen Parametern die gewählte Soundkarte gerade abspielt. Tatsächlich offenbart es diese Werte auch, wenn ich z.B. mit cmus Musik abspiele. Da ich aber vorher (mit cmus oder jeglichen anderen Playern) noch nie eine überhöhte Last bemerkt habe, will ich mal nicht behaupten, dass es alleine ALSA's Schuld ist. Der mpd war der erste, der sich so verhalten hat.

Übrigens zeigt

$ cat /proc/asound/card0/codec#0

die Fähigkeiten dieser Soundkarte an. Auch gut zu wissen. :)

Wie dem auch sei, man kann dmix wieder auf 44100 Hz runtersetzen. Laut diesem Eintrag hier dürfte das auch kaum Nebenwirkungen haben, höchstens bei DVD's, die angeblich tatsächlich 48000 Hz bieten - ausprobiert hab' ich das aber nicht und ich denke auch nicht, dass ich den Unterschied wahrnehmen würde...

$ cat ~/.asoundrc
pcm.!default {
    type plug
    slave.pcm {
        type dmix
        ipc_key 1024
        slave {
            pcm "hw:0,0"
            rate 44100
            period_size 1024
            buffer_size 8192
        }
    }
}

Man beachte "period_size" und "buffer_size", was den vorigen Werten entspricht. Lasse ich die weg, kommt es zumindest auf meinem "Intel 82801G" Onboard Soundchip im Laptop zu Knacksern, da scheinbar vorallem "period_size" sonst auf 5504 steht und wohl zu hoch ist. Mit diesen Settings habe ich dann nur noch 1-5% CPU-Last:

$ cat /proc/asound/card0/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1024
buffer_size: 8192

Mal sehen, was morgen am Desktop-Rechner passiert.

– Nachtrag: Mit der SBLive 5.1 tritt das Problem überhaupt nicht auf. Vermutlich, weil die Karte noch Hardware-Mixing kann. :)

Comments?