Why does our MySQL server become non-responsive with the processlist showing tons of processes waiting in STATE=init, INFO=commit?
You are seeing the victims.  Probably only a few of them are the villains.
Look at &quot;Time&quot;.  A few 'system' processes may have very large times; look at the next couple -- they may be the ones that started the problem
How big is max_connections?  If it is more than a few dozen, it is inviting a log jam.
When a lot of threds are running (check Threads_running), they tend to stumble over each other, waiting for resources (CPU, I/O, buffer_pool space, table cache space, etc).  Meanwhile, the allocation mechanism is &quot;playing fair&quot;.  That is, it is given each player a little of what it needs, so as to give a fair amount to the others.  Net effect:  Latency goes through the roof and throughput flattens or declines.

Cures:

Check for swapping -- Swapping is terrible for performance, and it may be a factor in what you are seeing.
Lower (yes, lower) max_connections.
Lower (yes, lower) the number of web server clients that can run simultaneously.
Use the slowlog (with a low value of long_query_time to identify both the long-running queries and the fast, but frequently running, queries.  Improve both.
It is usually easier to give the end-user a civilized message &quot;System is busy, DO NOT HIT RELOAD&quot;, than to let things clog up and &quot;never&quot; finish.
Use Replicas to spread the readonly queries across multiple servers.