Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: aigor.net 06. 05. 2024, 17:19:35
-
Ahoj, přepisuju jeden fousatý projekt z PHP 5 a MySQL (lib) do PHP8 a PDO.
Narazil jsem u toho na dost nepříjemný problém. Na několika místech se (kromě lokální DB) musím připojit i k sousednímu serveru a tam se kód vždy zasekne na 4sec. Původní projekt, nový projekt a i externí DB běží jako VM na jednom serveru.
Zkusil sem místo PDO použít MySQLi, ale se stejným výsledkem. Firewall mlčí, adresuju přes IP, user/login je bez změny, ale je to prakticky nepoužitelné.
Kód připojení kopíruje vzor z https://phpdelusions.net/pdo_examples/connect_to_mysql (https://phpdelusions.net/pdo_examples/connect_to_mysql)
Už nevím co vyzkoušet, nebo kde hledat. Všechno se tváří v pořádku, "jen" zoufale pomalé :(
-
4 sekundy je v ramci sveta db absolutne nemyslitelne obrovske cislo. jedine co ma napada ze by to mohlo byt je ze ta ziva db nema indexy a musi robit full scan na vsetkych moznych tabulkach s milionmi zaznamov a/alebo ma neskutocne malo ram alebo nejaky dojebany platnovy disk. inak to nedava ziaden zmysel. je dost mozne ze ten vps je naozaj na najhorsom moznom hw takze otestuj na nom disk, ram aj siet.
-
Původní projekt je rychlý a bez problémů?
-
A při ručním spuštění mysql klienta na stroji s PHP se klient k externímu mysql připojí ihned a rovnou lze dávat query, žádné čekání?
-
Dělá to jen při navázání spojení s DB? Není tam nějaký problém s překladem DNS (že by se třeba nejprve zkoušelo připojení na jinou IP adresu nebo jiným IPv4/IPv6 protokolem)? Nedělá databáze nějaké zpětné ověření uživatele třeba přes Ident, nebo nepřekládá si IP adresu klienta na jméno? Nepokouší se tam navazovat šifrování přes TLS?
-
Tak popořadě. Připojení z původního kódu je samozřejmě rychlé jako blesk a tam sem nikdy nic speciálního neřešil. Na novém virtuálu je opět jen čistá terminálová instalace a PHP8 místo PHP5.
Ruční připojení do SQL si nejsem jist, zkusím zítra...
DNS překlady, nebo IPv6 celkem vylučuju, když adresu serveru zadávám jako IPv4. Nic jiného tam není - testuju i jen čistý kus kódu kde je připojení k DB a konec.
Reálně pořád běží oba virtuály - starý i nový, právě záseky v připojení ke třetí straně mě brání starou verzi odstavit, to by mě uživatelé utloukli.
-
jednou jsme takhle taky honila ducha. divnej byl prave v tom "pokazde presne x sekund + tech par desitek ms co to tvra obvykle". jako programator nevim presne co to bylo, ale dle spravcu nejakej vosel spatne nakonfiguroval v server house svuj switch. Rozhodne to neni problem aplikacni, bude to neco v sitovani.
-
Přesně proto marně vymýšlím, jestli existuje nějaký "debug" místo 4sec koukání na prázdnou stránku.
V tomhle se neorientuju, tak žádné nástroje neznám. Je by mě zajímalo kde se to celou tu dobu poflakuje a co se tam děje...
-
DNS překlady, nebo IPv6 celkem vylučuju, když adresu serveru zadávám jako IPv4. Nic jiného tam není - testuju i jen čistý kus kódu kde je připojení k DB a konec.
Pokud to není vypnuté na serveru, tak to SERVER resolvuje, aby matchoval to 'user'@'client' v právech.
Takže ověřit na něm, jestli funguje reverze klienta.
-
Já bych navrhoval prozkoumat to pomocí tcpdumpu. Srovnat časy na obou serverech a pustit tcpdump na obou. Porovnání by mohlo vyloučit, že se jedná o síťový problém. Určitě zkusit cli klienta. Případně vytvořit novou prázdnou databázi a připojit se k ní. Bude to dělat dál?
-
Tohle za mě vypadá na jednu z těchto možností:
- timeout nějakého novějšího protokolu který PDO zkouší, po timeoutu zkusí starší protokol. Co je za verzi MySQL na tom vzdáleném serveru? ... šifrování spojení apod.
- špatně nastavený "virtuální" switch/síťovka
- špatně nastavené IPv6 nebo IPv4, pokud se se serverem nespojí na IPv4 (padne timeout) zkusí IPv6 apod což by mohlo souviset s předchozím bodem.
Jak je nakonfigurovaná síť na Hypervizoru? Jdou data "ven" na fyzický switch a pak zpět nebo se switchuje na virtuálním a pak jdou data případně ven?
-
ked tak pozeram co sa tu pise, na mieste zakladatela vlakna by som asi hladal "ako zistit ako to komunikuje".
existuje nieco inteligentnejsie ako pouzit Wireshark? :)
-
Tohle za mě vypadá na jednu z těchto možností:
- timeout nějakého novějšího protokolu který PDO zkouší, po timeoutu zkusí starší protokol. Co je za verzi MySQL na tom vzdáleném serveru? ... šifrování spojení apod.
Tohle může být ono, MySQL je 5.0.67.
Dneska sem testoval i připojení z příkazové řádky a prodleva je tam také.
Bohužel do MySQL sáhnout nemůžu, je to součást další muzeální aplikace třetí strany, ze které čtu jen některá data.
-
Pokud to není vypnuté na serveru, tak to SERVER resolvuje, aby matchoval to 'user'@'client' v právech.
Takže ověřit na něm, jestli funguje reverze klienta.
Máte pravdu! Pokusím se dokopat správce onoho serveru aby to vypnul a uvidím.