No C-States above C3 in Fedora Server

New member here!

Fun problem - on my home server, powertop reports that the CPU has up to C10 available, but it never idles beyond C3. The same machine with any desktop distro happily idles up to C8.

A simple ls /sys/devices/system/cpu/cpu0/cpuidle/ gives me
state0 state1 state2 state3 on F38 Server.

Same thing on F38 Workstation gave me
state0 state1 state2 state3 state4 state5 state6 state7 state8

I reproduced the problem across two different machines and on Debian.

I searched around for a while, but all anyone ever wants to do is disable C-States for more performance and less latency. I’d rather like my server to idle properly and save power.

So, uh… why are half my idle states missing?

I was curious about this and founds these docs CPU Idle Time Management — The Linux Kernel documentation

It says that the number of states is a function of the hardware.

Can you confirm that you found the difference for the exact same model of CPU? See the output of lscpu.

I tested on two machines (laptops, if it matters):
Dell Latitude 7370, Intel Core M7-7Y75
Samsung Galaxy Book Flex 950QCG, Intel Core i7-1065G7

I used the Samsung laptop as, y’know, a laptop for a while running Fedora Workstation, then switched to a different laptop and said, “Hey, let’s turn this paperweight into a server!” Like I said, in Workstation all C-States are available and utilized, but as soon as I switched to Server, half of them vanished. Powertop says they exist, but they’re not being utilized.

With the same kernel and no overrides on the kernel command line I would expect to see the same set of state in /sys. In Server or Workstation.

If you boot your server off of a workstation USB do the state change?

For reference this is from my Fedora Server system.
I see all the states you wanted to have.

$ ls /sys/devices/system/cpu/cpu0/cpuidle
state0/  state1/  state2/  state3/  state4/  state5/  state6/  state7/ state8/

$ lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  4
  On-line CPU(s) list:   0-3
Vendor ID:               GenuineIntel
  BIOS Vendor ID:        Intel(R) Corporation
  Model name:            Intel(R) Xeon(R) E-2224G CPU @ 3.50GHz
...

Well, that sent me down a rabbit hole of testing.

Turns out,

  1. I was confusing CPU idle states with package idle states. I checked the CPU idle states from a live USB on both laptops, and got 0-3 on the Samsung and 0-8 on the Latitude. This actually checks out in powertop.

  2. Thunderbolt is not my friend. I’d been using a Thunderbolt dock to provide I/O for the laptop, but when I pulled it down for testing, I left the dock behind and used a plain USB power supply.
    Lo and behold, the system idles correctly with the package state hanging out in C8 and C10 most of the time and pulling about 2W from the wall. Swap back to Thunderbolt, and it refuses to idle deeper than C3 again, drawing over 10W. 5x power draw for a bit more I/O? Ouch.

I played a bit of mix-and-match with some USB-C hubs and adapters I have laying around and managed to get the server to behave itself.

So, Linux works as expected, and this is a friendly reminder to everyone to check your peripherals as part of troubleshooting.

Thank you!