Sometimes I see that my computer uses a lot of swap space, but none of the system monitors (e.g.
ps, Gnome’s System Monitor,
top, btop) show which processes are to blame. There’re several memory metrics (e.g. total swap usage), but never per process swap usage. 😠
There’s a StackExchange question that asks the same thing, but the solutions are all not well scripted, slow or “meh” for other reasons … so I tackled the problem myself. 😝
All the information is basically buried in the
/proc/*/status files. Among other things they contain the amount of swap a process uses, its PID and even better: its name. So we have to go through all the files,
grep the useful lines, extract the data from those lines and recombine them.
I tried different combinations of
sed and Bash string interpolation … and while it worked, it was even slower than the StackExchange suggestions. 😯😅😞 This looked more and more like a “if I knew grep/sed/awk better I wouldn’t need to invoke 4 sub shells/pipes/processes for each file” kind of problem. I remembered Bryan Cantrill making an offhanded remark once that
awk had a simple and concise language and a great manual.
If you get theBryan Cantrill
awkprogramming language manual…you’ll read it in about two hours and then you’re done. That’s it. You know all of awk.
I had put off diving in for too long. So I started reading and roughly 20 minutes in I knew enough to solve the whole problem (almost) entirely in
awk (it still needs the shell for filename globbing 😕🤷). And … it’s blazingly fast! And … you can also combine it with
head to quickly find the worst offenders. 😎
You can find the code in this Gist. There’s a simpler version in an earlier revision. 😉