» »

PyMongo | connect/disconnect delay debug

PyMongo | connect/disconnect delay debug

HotBurek ::

Pozdravljeni.

Evo, sledeč problem. Iz svojega PC računalnika naredim SSH tunel na strežnik (ssh -L 27017:127.0.0.1:27017 -N user1@1.2.3.4) in poženem Python kodo. Le-ta se poveže na MongoDB (connect in disconnect), ter izpiše potreben čas za connect in disconnect skupaj. V log fajlu (/var/log/mongodb/mongod.log) se beleži "received"/"connection accepted"/"end connection".

In če to kodo poženem lokalno na mojem PC-ju + SSH tunel, načeloma dobim response nazaj po 10~20ms. Redkokdaj ~500ms. Vsaj tako pravi mongodb log file.

Ironično, ravno obratno pa je, če to isto kodo poženem direktno na severju. Tam je pa kar konstanta, da se v logu zabeleži 500ms, zelo redko ~5ms.


Sedaj mi ja malo zmankalo idej, kako naj to debugiram naprej. OS je isti, Python interpreter je isti, PyMogno je isti.

Skratka, problem je, da ta koda lokalno na strežniku potrebuje 500ms, da se izvede, remote preko SSH tunela pa 20ms.

Kako pridit do tega, da bo MongoDB naredil response v ~20ms tudi lokalno? In to čim bolj konstantno.


Iz spodnje kode; diff vedno vrača nekje 2-3 milisekunde, neglede na to, kej se ga požene.


#!/usr/bin/python3.7

import datetime;
import pymongo;

start = datetime.datetime.now();

mongoClient = pymongo.MongoClient(host="127.0.0.1", port=27017);
# mongoClient = pymongo.MongoClient("mongodb://127.0.0.1:27017");
mongoClient.close();

end = datetime.datetime.now();

diff = (end - start);

print(diff);
print("microseconds=" + str(diff.microseconds));
print("miliseconds=" + str(round(diff.microseconds / 1000)));



Iz spodnje slike;
- modra prikazuje rezultat, ko se koda izvede na PC-ju in gre na strežnik preko SSH tunela (672 - 685 = 13ms)
- rdeča pa, ko se koda izvede direktno na serverju (957 - 479 = 522ms).

root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

HotBurek ::

Evo, našel rešitev.

Gre za dva fajla:

/usr/lib/python3/dist-packages/pymongo/mongo_client.py
line=579
min_interval=0.5

ter

/usr/lib/python3/dist-packages/pymongo/common.py
line=73
MIN_HEARTBEAT_INTERVAL = 0.5


Oboje sem spremenil iz 0.5 na 0.05 in dela k šus.

Vir: https://stackoverflow.com/questions/528...


root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Skripta za Bolho.

Oddelek: Programiranje
304230 (1642) planina91
»

Spletno gostovanje za več manjših projektov

Oddelek: Izdelava spletišč
7821 (622) bluefish
»

Postavitev mySQL

Oddelek: Programiranje
92085 (1663) M01O
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211322 (932) noraguta
»

Framework za web in WebSocket

Oddelek: Programiranje
131409 (1214) usoban

Več podobnih tem