Ошибка подключения Neo4j при подключении большего количества одновременных пользователей

#ubuntu #neo4j

#ubuntu #neo4j

Вопрос:

  • Сообщество Neo4j 3.5.12
  • Python 3.6.9
  • neo4j-драйвер == 1.7.6
  • neobolt == 1.7.17
  • Ubuntu Server 18.04
  • Flask 1.1.2

На веб-сервере, который я запускаю, внезапно произошло увеличение трафика на 2000%. До этого увеличения все работало нормально. Однако теперь я вижу следующую ошибку через несколько часов (не уверен, как долго, но в течение 5 часов) интенсивного трафика, а затем после этого постоянно сбой. Например, соединения не закрываются или что-то в этом роде.

      db = GraphDatabase.driver("bolt://localhost:MYPORTNO", auth=basic_auth(DATABASE_USERNAME, DATABASE_PASSWORD, encrypted=False)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 120, in driver
     return Driver(uri, **config)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 161, in __new__
     return subclass(uri, **config)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 235, in __new__
     pool.release(pool.acquire())
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 715, in acquire
     return self.acquire_direct(self.address)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 608, in acquire_direct
     connection = self.connector(address, error_handler=self.connection_error_handler)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 232, in connector
     return connect(address, **dict(config, **kwargs))
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 972, in connect
     raise last_error
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 962, in connect
     s = _connect(resolved_address, **config)
   File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 843, in _connect
     raise ServiceUnavailable("Failed to establish connection to {!r} (reason {})".format(resolved_address, error))
neobolt.exceptions.ServiceUnavailable: Failed to establish connection to ('127.0.0.1', MYPORTNO) (reason [Errno 111] Connection refused)

  

Если я перезапущу apache, он снова заработает, так что в настоящее время в качестве бандажа я делаю это на задании cron каждые несколько часов, но, похоже, это работает только частично.

Я увеличил кеш страницы и вычисление кучи в соответствии с этой статьей.

Я увеличил лимит открытых файлов с 1024 по умолчанию до 50000.

Я удвоил спецификацию сервера.

Структурно я создаю экземпляр драйвера базы данных в файле конфигурации:

Файл конфигурации:

 db = None
def getDB():
    global db
    if not db:
        db = GraphDatabase.driver("bolt://localhost:XXXXXX", auth=basic_auth(DATABASE_USERNAME, DATABASE_PASSWORD), encrypted=False) 

    return db
  

Затем я могу выполнять запросы в своих файлах модулей следующим образом. Я считаю, что следующий синтаксис правильно управляет соединениями, которые открываются и закрываются из-за with инструкции, и поэтому не должен оставлять открытые соединения:

Файл модуля:

 db = config.getDB()

with db.session() as s:
        with s.begin_transaction() as tx:
            tx.run("the cypher", {the params})
  

Я также вижу следующую ошибку в журналах, хотя я не уверен, что они напрямую связаны.

 ValueError: filedescriptor out of range in select()

  

Кто-нибудь знает, что является причиной этого или как это исправить, пожалуйста? Спасибо!

Ответ №1:

Оказывается, у меня было задание cron, которое выполнялось каждые 10 минут и каждый раз оставляло экземпляр драйвера открытым. Ошибка школьника.