J'écris une API Flask et je constate de nombreux échecs lors des tests de charge.

En regardant les journaux uwsgi, je vois quelque chose qui a l'air un peu méchant, qui est:

Cx_Oracle.DatabaseError: ORA-12592: TNS: paquet incorrect

La connexion oracle fonctionne, car je ne vois pas un échec complet, mais cela semble être ce qui met fin prématurément à l'appel de repos http dans la plupart des cas.

Qu'est-ce qui cause cela? J'utilise RHEL, avec cx_Oracle 7.23, en me connectant à la base de données 12C. J'utilise le client léger Oracle.

Exception on /api/read/maa [GET]
Traceback (most recent call last):
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/ariel/anaconda3/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/decorator.py", line 48, in wrapper
    response = function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/uri_parsing.py", line 144, in wrapper
    response = function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/validation.py", line 384, in wrapper
    return function(request)
  File "/ariel/anaconda3/lib/python3.7/site-packages/connexion/decorators/parameter.py", line 121, in wrapper
    return function(**kwargs)
  File "./registrations.py", line 58, in read_maa_non_passive
    for row in cursor_ariel.fetchall():
cx_Oracle.DatabaseError: ORA-12592: TNS:bad packet
Getting data and status code

----MISE À JOUR---------

Tous mes problèmes ont disparu lorsque j'ai arrêté le regroupement de connexions dans cx_Oracle. À l'origine, j'avais une seule connexion à oracle partagée dans l'application Flask. Cela m'a fait échouer dans les tests de résistance. J'ai donc essayé d'être intelligent et d'utiliser SessionPooling, d'acquérir des connexions et de les libérer à chaque appel de service. Enfin, je suis revenu à la «mauvaise pratique» et j'ai créé une toute nouvelle connexion à Oracle pour chaque appel de fonction (point de terminaison api), et j'obtiens maintenant un taux de réussite de 100% lors des tests de résistance dans Locust, même pour les appels de réponse plus importants qui sont de 30 Mo charges utiles json.

0
smackenzie 15 oct. 2020 à 21:33

2 réponses

Meilleure réponse

Pour les personnes qui ne lisent pas / n'ont pas lu les fils de commentaires, la solution était de démarrer le pool avec threaded=True.

Voir Comment utiliser Python Flask avec Oracle Database < / a>.

0
Christopher Jones 16 oct. 2020 à 00:36

Pouvez-vous le tester avec un client régulier et revenir avec des résultats?

Le client instantané est un sous-ensemble du client régulier.

-1
devnull 15 oct. 2020 à 20:49