Skip to content

What is Kworker? How to reduce CPU usage?

Linux is one of the most versatile operating systems you can run. It’ll run on just about any device from credit card-sized computers like the Raspberry Pi to highly specced out servers. However, it has its own bugs, glitches and shortcomings that keep popping up from time to time. 

In this article, we’re taking a look at Kworker, what it does, why is it important and how you can reduce the process’ CPU usage.

Also read: How to fix Curl command not found on Linux?

What is Kworker?

Kworker is a Linux tool responsible for all operations performed by the kernel. In day-to-day operations, the kernel takes care of the following tasks:

  • Timer related tasks
  • Receiving and sending inputs and outputs
  • Data processing
  • Interrupt handling
  • Performing system calculations

Kworker can also duplicate itself to function on multiple cores at the same time. In such cases, you might see multiple Kworker instances with a number suffixed to them, such as kworker0, kworker1 and so on. 

What is Kworker? How to reduce CPU usage?

It’s basically a placeholder for kernel worker threads so you can monitor your kernel activity on the system. It’s not something that can be safely removed from the system, or removed at all for that matter. You can monitor its usage by using the following command.

sudo top


sudo ps aux | grep worker

Also read: How to fix ‘Runtimeerror: cuda error: invalid device ordinal’?

How to reduce Kworker’s CPU usage?

Generally, Kworker usage shouldn’t account for more than 10% CPU usage under normal operating conditions. That said, if you’re experiencing high CPU usage from Kworker, you can try out the following five fixes. 

Update your kernel

The first thing you should do in such cases is to update the kernel to the latest version possible. This can be done by running the following commands one after another.

sudo apt-get update
sudo apt-get dist-upgrade
What is Kworker? How to reduce CPU usage?

Deactivate the internet flag configuration

Another possible reason for a spike in CPU usage is any service using the internet on your PC. This can be prevented by disabling the internet configuration on your PC. However, do keep in mind that this might restrict several (or all) processes on your system from accessing the internet. 

ifconfig eth0 down

If you’re using WiFi, change eth0 to the name of your WiFi interface. For example,

ifconfig wlan0 down

To enable internet again, just use this command 

ifconfig eth0 up

Also read: Screen recording failed to save due to 5831: 5 Fixes

Use a process limiter

You can try and use a process limiter to limit how often the Kworker process spikes its CPU usage. Now while this will keep your CPU usage down, it can cause system slowdowns as Kworker will be throttled over other processes. 

What is Kworker? How to reduce CPU usage?

You can download the phc-intel package from this link and install it on your system. 

Disable firmware interrupts

Disabling firmware interrupts means there’s less work for Kworker to handle, eventually leading to lower CPU usage. To do so, open a terminal and type the following command. 

echo "disable" > /sys/firmware/acpi/interrupts/gpeXX

Alternatively, you can also use this command.

grep enabled /sys/firmware/acpi/interrupts/*

Using a Shell prompt

Last but not least, you can also deploy a shell command to throttle Kworker. Open the terminal as a root user and type the following command. 

#echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

Alternatively, you can also use this command.

#echo N> /sys/module/drm_kms_helper/parameters/poll

Also read: How to make a file executable in Linux?

Hello There!

If you like what you read, please support our publication by sharing it with your friends, family and colleagues. We're an ad-supported publication. So, if you're running an Adblocker, we humbly request you to whitelist us.

We may earn a commission if you buy something from a link on this page. Thanks for your support.

  • I believe the commands for disabling firmware interrupts are reversed. Also, the grep command is not an alternative to the “echo disable” command; rather, it is used to determine the value(s) for “XX” when you run the “echo disable” command.

    The purpose of the grep command is to find the particular interrupt(s) that are out of control. On my system (linux mint 21) I used the following command..

    grep . -r /sys/firmware/acpi/interrupts | grep /gpe | grep -Eav “:[ t][ t]*.[ t][ t]*|gpe_all”

    … sorry for all the extra grep stuff, but it *should* filter out the unwanted info. Individual users may need to experiment. The key is to find “/gpeXX” for which the first value is huge. Once you find it then the “XX” comes from the /gpeXX value. For example..

    grep . -r /sys/firmware/acpi/interrupts | grep /gpe | grep -Eav “:[ t][ t]*.[ t][ t]*|gpe_all”
    /sys/firmware/acpi/interrupts/gpe6E: 1955895 EN enabled unmasked

    … in this case I have only one interrupt with a huge value (‘1955895’). For this interrupt, the value of ‘XX’ is ‘6E’.

    Now that I have the value of ‘XX’, I can disable it with this command..

    sudo echo “disable” >/sys/firmware/acpi/interrupts/gpe6E

    Please note this is a workaround for an unusually high interrupt rate by kworker on your system. kworker itself might not show high cpu utilization (because kernel time spent processing interrupts is not counted against a process’ own time). But you will see a high system load, sometimes without any process that seems to be taking much cpu time.

    A better indicator as to whether this is your problem is to run the following…

    vmstat 5 5
    procs ———–memory———- —swap– —–io—- -system– ——cpu—–
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    0 0 4864 5766512 2035344 11505196 0 0 9 35 4 3 3 1 96 0 0
    0 0 4864 5774024 2035360 11488864 0 0 0 43 50849 5922 1 0 98 0 0
    0 0 4864 5774004 2035360 11488800 0 0 0 38 50861 5933 1 0 98 0 0
    0 0 4864 5771268 2035376 11488812 0 0 0 57 51036 6247 1 0 98 0 0
    0 0 4864 5771452 2035392 11488816 0 0 0 28 51388 6528 1 1 98 0 0

    … unfortunately the column labels don’t align with the data, but the key here are the two columns “in” (interrupts) and “cs” (context switches). They are both very high and steady (ignore the first sample). From researching the problem, I know the root cause is the interrupt rate, while the context switch rate is merely a side effect.

    … so, if this is what you’re observing, then the “grep” and “sudo echo disable” commands are likely to be you’re solution.

  • >