S.O.S. PgSQL lassú kapcsolódás

 ( NoMan | 2012. október 21., vasárnap - 21:16 )

Tisztelt Fórumozók!

Egy anomáliával fordulnék hozzátok. Remélem még van, aki fent van és tudtok nekem ötleteket adni.

A jelenség a következő:
- Adott egy szerver, amin van egy webszerver(Apache) és egy adatbázis szerver(Postgres). Ezen a szerveren minden olyan oldal, ami használ adatbázist, szinte elérhetetlenül lassú.
- Nézem iftop, iotop, htop semmi extra terhelés. Sőt szinte semmi terhelés.
- Nézem netstat-ot, szinte nulla kapcsolat
- Adatbázis mentes, statikus honlapok azonnal betöltődik
- localhost/server-status szintén nem töltödik be.
- Lekérdeztem postgres specifikus select-ekkel a kapcsolatok számát, de semmi.
- su - postgres; - ha psql, akkor pillanatok alatt kapcsolódik, ha írok oda adatbázis nevet, akkor kb 3 perc múlva ad promtot

Már nincs ötletem, hogy mi lehet a gond. Nem volt szerver frissítés, semmi... Egyik pillanatról a másikra elkezdte ezt csinálni és nem értem, hogy miért.

Van valakinek valami ötlete, hogy még mit nézhetnék meg, ami választ adna arra az egyszerűnek tűnő kérdésre, hogy MIÉRT CSINÁLJA EZT?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ha már kapcsolódott az adatbázishoz, akkor utána a lekérdezések nem tűnnek lassúnak.

DNS rendben? Talán megpróbálja feloldani a kapcsolódó kliensek IP-jét. Vagy épp a hba configban hostnév alapján van engedélyezés, és azt nem tudja feloldani.

--
joco voltam szevasz

Az ötlet jó volt. De a DNS rendben van. Mindent felold a szerver. :-(

Egyszer mi azzal szívtunk, hogy a hálókártya vagy a annak a drivere miatt 0,5-1,5mp-es latency volt adott tcp kapcsolattal és esetünkben MySQL volt a cél. Természetesen egy remek integrált kártyával próbálkoztunk, mert természetesen nagyhirtelen kellett a szolúció.

Indítsd újra a postgres-t.

Több ízben megtörtént. A szervert is és a postgrest is újra rúgtam már. Semmi változás.

esetleg strace-ld a psql-t klienst mit csinal kapcsolodaskor.

Lehet ennek a toolnak a használatát én nem ismerem, de akkor is megakad a futása, amikor strace nélkül, amúgy kapcsolódik.

Valamit rosszul csinálok?

Nem teljesen értem a fenti mondatot, de a lényeg hogy mit csinál mikor kapcsolódik. Azt látnod kéne. Persze olyan kapcsolodást kéne elkapni ami megakad.

Itt akad meg, ez neked mond valamit?

munmap(0x7f25d98f6000, 4096) = 0
socket(PF_NETLINK, SOCK_RAW, 0) = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=7115, groups=00000000}, [12]) = 0
sendto(3, "\24\0\0\0\26\0\1\3\177j\204P\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\177j\204P\313\33\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 168
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\177j\204P\313\33\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 128
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\177j\204P\313\33\0\0\0\0\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(3) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(5432), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(48182), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
close(3) = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(5432), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(60481), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(3) = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
fcntl(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
connect(3, {sa_family=AF_INET6, sin6_port=htons(5432), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=3, events=POLLOUT|POLLERR}], 1, -1

Hát ha jól látom IPv6-os címre is rápróbál. Olyan meg gondolom nincs?

Fórumon olvasgattam és azt írták, amit kb eddig is tudtam:

# "local" is for Unix domain socket connections only
#local all all trust
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 trust

- Ha csak simán a psql-el kapcsolódunk, akkor a local ágra futunk rá

- de ha már beírjuk, hogy -h localhost, akkor távoli kapcsolatként értelmezi a rendszer, így a host ágak jönnek

Ahhoz, hogy a kielőrtessük, hogy IPv4-en kapcsolódjon, IPv4 címet kell neki megadni, tehát 127.0.0.1. Így tehát most nekem is kapcsolódik azonnal.

Ez mind rendben is van. Értem én ezt. De eddig akkor miért volt jó a localhost és most nem jó?

Jah és persze, hogyha a hosts fájlba kikommentezem a

::1 localhost

sort, akkor localhost-al is működik a kapcsolódás.

De akkor sem értem, hogy mi változott meg a rendszerben. :-(

Hát ez passz :)

Hiába keresgélek a neten... Nincs válasz erre a kérdésre. :( De azért még holnap keresgélek, mert nagyon érdekel, hogy mi változott meg.

Minden esetre nagyon szépen köszönöm! Az strace most életet mentett.

Köszi G, hogy Rád még ilyenkor is lehet számítani :$
További szép estét és köszi még egyszer.

Nincs mit. Esetleg nem kapott IPv6-os címet a géped, míg előtte nem volt neki?

Jelenleg is van neki valami IPv6-os címe.

Az strace egy nagyon jó ötlet volt... Végre sikerült rájönnöm, hogy miket is irkál.

Így tesztelgettem, hogy mikor mit csinál és mit ír ki.
Rájöttem, hogy addig nincs gond, amíg így adom ki a psql: psql < dbname >

De ha beleírom, hogy -h localhost, akkor leakad és vár fél percet.
Gondoltam, akkor kipróbálom mi van ha a localhost helyett 127.0.0.1-et írok. Pillanatok alatt kapcsolódott.

Mi lehet a gond? Mi változhatott meg, ami miatt ilyet produkálhat?

http://hup.hu/node/118750#comment-1520059

Most csak az a komment alapján feltételezem, hogy először IPv6-tal próbál csatlakozni, ott kivárja a timeout-ot majd csatlakozik pillanatok alatt IPv4-el. Ha "::1"-ra próbálsz csatlakozni, akkor mi van?

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Igen az IPv6-os csatlakozással volt gond. De sikerült megoldani, hogy felejtse el.

Ezert most sokan meg fognak engem kopdosni, de en azt mondom, ha nincs szukseged ipv6-ra, tiltsd le az egeszet. Neten rakeresel, asszem vmi ket sysctl beallitas, sajnos sosem tudom megjegyezni, de az elso ot talalatban benne lesz. Egyre figyelj: _ne_ a modult probald meg kitolteni/feketelistazni/letorolni, hanem kimondottan sysctl beallitast keress.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal