How to find out what a kworker does?

I have kworker processes, which regularly enters D state. My computer also becomes laggy, which I think may be due to D state kworkers. Usually, these processes run with a command similar to this: kworker/u16:2

I was told that D state processes may be due to bad drivers or hardware. I would like to find out which driver or hardware is affected. How can I find out which of these processes do what?

Any way how to investigate that?


Solution 1:

There is a good article from RedHat on finding out what code kworker threads are running. Please see https://access.redhat.com/solutions/4388131

Here is an excerpt from the article:

On Red Hat Enterprise Linux 7 the ftrace subsystem and trace-cmd command can provide information about what functions the kworker and softirq kernels threads are running.

# trace-cmd record -e workqueue:workqueue_queue_work
# trace-cmd report > trace.log

You can get list of the most frequently queued to least frequently queued workqueue functions with the following:

# grep -o -e "function=[_a-zA-Z_][_a-zA-Z0-9]*" trace.log|sort|uniq -c |sort -rn