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.

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
Or
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

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.

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?
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.
Hey Robert. Thanks for the clarification!