Para corrigir esse problema, descobri que é necessário definir a seguinte configuração para algo em torno de 5% a 6% da sua RAM física total, dividida pelo número de núcleos no computador:
sysctl -w vm.min_free_kbytes=65536
Lembre-se de que essa é uma configuração por núcleo, por isso, se eu tiver 2 GB de RAM e dois Núcleos, calculei 6% de apenas 1 GB e adicionei um pouco mais apenas para estar seguro.
Isso força o computador a tentar manter essa quantidade de RAM livre e, ao fazer isso, limita a capacidade de armazenar em cache arquivos de disco. É claro que ainda tenta armazená-los em cache e imediatamente trocá-los, então provavelmente você deve limitar sua troca também:
sysctl -w vm.swappiness=5
(100 = troca sempre que possível, 0 = troca apenas por necessidade total)
O resultado é que o Linux não decide mais aleatoriamente carregar um arquivo de filme inteiro de aproximadamente 1 GB em memória RAM enquanto o assiste e mata a máquina ao fazê-lo.
Agora, há espaço reservado suficiente para evitar a falta de memória, o que aparrently foi o problema (visto que não há mais congela como antes).
Depois de testar por um dia - os bloqueios sumiram, às vezes há pequenas lentidões, porque o material fica em cache com mais frequência, mas eu posso viver com isso se não precisar reiniciar o computador a cada poucas horas.
A lição aqui é - o gerenciamento de memória padrão é apenas um dos casos de uso e não é sempre o melhor, embora algumas pessoas tentem sugerir o contrário - o ubuntu deve ser configurado de forma diferente do servidor.
Você provavelmente deseja tornar essas configurações permanentes adicionando-as ao seu /etc/sysctl.conf
da seguinte forma:
vm.swappiness=5
vm.min_free_kbytes=65536