Power management issues under 364.X and 367.X (and maybe more)

Since some time ago, I’ve been having power management issues with my GTX 970. My symptoms are very consistent: When my GPU is set to “adaptive” (or automatic) power management, and I wake up the next morning while leaving my PC on overnight, performance will be very bad.

Some facts that I hope might help narrow down the issue:

  • It’s been happening since a few GPU releases ago, not sure which specific version introduced it. It was happening for sure under 364.X (and also now under 367.18) Might have also been a linux kernel upgrade.
  • I have an overclock (+100 MHz) to my GPU core frequency. (None on memory)
  • I use a 10-bit Xorg configuration
  • It happens after I leave my PC passive for a long time (multiple hours). When doing so, I start up i3lock and turn off my displays. The PC is still turned on, and I do not enter suspend or hibernation modes.
  • I notice the issue in mpv - I get heavy stuttering, although the GPU only reports 50% usage (via nvidia-smi)
  • Restarting X will fix it right away
  • Setting my GPU to “prefer maximum performance” overnight prevents the issue from occurring

It’s almost as if the GPU doesn’t wake up back to the full speed or something. Not sure if I can provide any more info than this on a whim, but I could try harder (e.g. bisecting driver versions to see which one introduced the change, or trying more stuff). I mostly just wanted to see if you perhaps recognize the issue.

Some updates:

  • Issue still happens as of now (370.23 driver version)
  • When I try suspending my system (systemctl suspend) while the issue is happening, I no longer get a screen signal after waking up (and X locks itself up completely)

For now, I’m going to wrap my “lock the screen” script with something like this:

# Disable nvidia power management
/usr/bin/nvidia-settings -a '[gpu:0]/GPUPowerMizerMode=1'

# Lock the screen
/usr/bin/i3lock -c 000000

# Re-enable power management
/usr/bin/nvidia-settings -a '[gpu:0]/GPUPowerMizerMode=0'

And hopefully this should clear up the issue, since it only seems to happen at night (where I lock my screen anyway).