Am două containere docker care încearcă să vorbească cu altul folosind solicitări web, dar se confruntă cu o latență aleatorie. În timpul depanării, am defalcat problema în timpii de conexiune la socket lenți, rulând un simplu server de socket într-unul.
priză de import
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', 80))
serversocket.listen(5)
în timp ce este adevărat:
(clientsocket, adresa) = serversocket.accept()
print((socket client, adresa))
clientsocket.shutdown(socket.SHUT_RDWR)
clientsocket.close()
și se leagă în mod repetat la acesta de la celălalt, imprimând cât timp durează conectarea
priză de import
a=time.time()
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((„altul-container”, 80))
print(time.time() - a)
Ceea ce văd sunt momente de conectare ca:
0.0009965896606445312
0.0010194778442382812
0.0009961128234863281
0.0009963512420654297
0.0010194778442382812
0.0010199546813964844
3.0038609504699707
0.0005102157592773438
Ce este interesant, este că dacă folosesc 2 clienți și mă conectez în mod repetat cu unul până când experimentează această latență misterioasă, apoi trec imediat la celălalt, se poate conecta la server (chiar de mai multe ori) în timp ce celălalt este încă blocat, încercând a conecta.
Câteva detalii despre arhitectură, ambele gazde sunt containere Windows care rulează în docker EE folosind rețeaua docker NAT implicită.
De asemenea, merită să precizez că văd aceste latențe, chiar și atunci când mă conectez folosind adrese IP directe (fără DNS)
Pentru ceea ce merită, văd și această problemă folosind Apache pentru a inversa solicitările web proxy de la una la alta, unde majoritatea solicitărilor se completează instantaneu, în timp ce altele se blochează pentru câteva secunde (problema mea originală)
Editați | ×:
În continuare, în timpul testării mele, am confirmat că problema există și dacă rulez micul meu client de testare a socketului de la gazdă, conectându-mă la serverul de socket care rulează în container, precum și invers (server pe gazdă și client în container). )