O processo está bloqueando um mutex (ou futex no linux speak). Portanto, o backlog é legítimo, estamos literalmente presos atrás de uma chamada de sistema e, embora as conexões estejam indo embora, nada mais está atualizando.
Para referência futura a outras pessoas que encontrem esta questão, este foi o comando de violação:
# strace -p 5340
Process 5340 attached
futex(0x223cee0, FUTEX_WAIT_PRIVATE, 0, NULL
Portanto, há algum tipo de impasse, e agora só tenho que descobrir qual processo está usando mutexes. gdb
eventualmente me deu essa informação:
(gdb) bt
#0 sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
#1 0x00007f0ecc982068 in PyThread_acquire_lock () from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#2 0x00007f0ecd037b29 in gil_real_get () from /usr/lib/uwsgi/plugins/python_plugin.so
#3 0x00007f0ecd030167 in uwsgi_python_master_fixup () from /usr/lib/uwsgi/plugins/python_plugin.so
#4 0x000000000042cb66 in uwsgi_respawn_worker ()
#5 0x000000000042b38f in master_loop ()
#6 0x000000000046741e in uwsgi_run ()
#7 0x000000000041698e in main ()
Então, algum tipo de impasse na tentativa de adquirir o bloqueio de intérprete global.
Editar 2 : o enredo fica mais espesso. Quase exatamente o mesmo problema que esse cara , exceto que o nosso é com o RabbitMQ ao invés do MongoDB. A execução de um segundo thread causa problemas durante o recarregamento, algumas vezes fazendo com que o GIL não seja liberado e, em seguida, interrompido ao tentar readquiri-lo.
Basicamente, estamos fazendo algo que não deveríamos estar fazendo e só precisamos repensar a coisa toda.