Isso ocorre porque você está usando o PyMongo incorretamente. Você está criando um novo MongoClient para cada consulta, o que exige que você abra um novo soquete para cada nova consulta. Isso anula o pool de conexões do PyMongo e, além de ser extremamente lento, também significa que você abre e fecha soquetes mais rápido do que sua pilha TCP pode acompanhar:você deixa muitos soquetes no estado TIME_WAIT e, eventualmente, fica sem portas.
Felizmente, a correção é simples. Crie um MongoClient e use-o por toda parte:
conn = pymongo.MongoClient('mongodb://localhost:27017')
coll = conn.databases['race_results']
def _perform_queries(query):
return coll.find(query).sort("date", -1)