Look into earlyoom
or systemd-oomd
, the kernel out-of-memory killer will only start killing processes way after it should be. It will happily deadlock itself in a memory swap loop before considering killing any process.
There are a lot of other ways to fine tune the kernel to prevent this, but it's a good starting point to prevent your system from freezing. Just keep in mind it will kill processes when memory is running out until enough memory is available.
Ouch, hope you can get that sorted out. A broken disk my also "deadlock" the system when binaries it tries to start are on that disk and no longer in cache, e.g. sshd or your shell.
In my experience when only ping sporadically works it's an OOM issue, if the ssh login fails weirdly it can also be an I/O issue. If your network is working as expected obviously.