Fehler: can't start new thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maha2
User
Beiträge: 1
Registriert: Dienstag 13. Juni 2023, 13:02

Hallo!
Bei der Erzeugung einer Instanz der Klasse pymongo.MongoClient habe ich in unregelmäßigen Abständen folgenden Fehler:

Code: Alles auswählen

...  
  File "/srv/foo/src/bar.mongodb.core/bar/mongodb/core/clients.py", line 78, in get_client
    db_clients_uri[key] = pymongo.MongoClient(host)
  File "/home/foo/src/pymongo-3.12.1-py3.6-linux-x86_64.egg/pymongo/mongo_client.py", line 779, in __init__
    self._get_topology()
  File "/home/foo/src/pymongo-3.12.1-py3.6-linux-x86_64.egg/pymongo/mongo_client.py", line 1297, in _get_topology
    self._kill_cursors_executor.open()
  File "/home/foo/src/pymongo-3.12.1-py3.6-linux-x86_64.egg/pymongo/periodic_executor.py", line 87, in open
    thread.start()
  File "/home/foo/src/Python-3.6/lib/python3.6/threading.py", line 846, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread
Zur Untersuchung habe ich in threading.py an der entspr. Stelle in de Exception-Behandlung des Handler 'start' einen Log eingebaut:

Code: Alles auswählen

from logging import getLogger
logger = getLogger('threading')
try:
    import subprocess
    total, used, free = map(
        int, subprocess.check_output(['free', '-t']).splitlines()[-1].split()[1:])
    logger.error('### RAM memory used: {} %'.format(str(round((used/total) * 100, 2))))
    import threading
    logger.error('### PYTHON threads: '+str(threading.active_count()))
except Exception as err:
    logger.error('### RAM memory error '+str(err))
In den Logs habe ich folgendes Ergebnis:
RAM memory error [Errno 11] Diese Ressource ist zur Zeit nicht verfügbar

Kann die Log-Ausgabe eindeutig interpretiert werden?
a) Können beim Aufruf von subprecess.check_output() aufgrund des Thread-Problems einfach keine neuen Threads mehr erzeugt werden oder
b) ist das RAM-Limit erreicht oder
c) ?

Besten Dank!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Linux-System beschraenken die Mengen der Resourcen, die ein Prozess anfordern kann. Das Kommandozeilentool ulimit und das proc-Filesystem erlauben, das zu betrachten und ggf. zu modifizieren: https://stackoverflow.com/questions/344 ... s-in-linux

Gerade im Umfeld von Virtualisierung koennen diese Limits auch harscher sein. Entweder kannst du die hochschrauben, oder du musst deine Anwendung so strukturieren, dass sie stattdessen zB mit gepoolten DB-Verbindugen arbeitet. Denn irgndwas geht immer aus. Wenn's die Threads nicht sind, dann als naechstes der RAM.
Antworten