O soluție pentru MySQL foarte lent

Încercam ieri să testez o îmbunătățire la un algoritm de căutare, când am observat că containerul docker cu mysql răspundea foarte foarte greu. Cam peste câteva secunde așa.

Prima încercare a fost restart – nu mă luați la rost, era serverul local vroiam doar să pot testa! În fine chiar și după restart rezultatul a fost același – mysql era foarte lent.
O scurtă verificare a logurilor a scos la iveală următoarele

[Warning] IP address '172.17.0.4' could not be resolved: Temporary failure in name resolution

Aparent, în mod implicit mysql încearcă să rezolve domeniile utilizatorilor conectați, iar asta adaugă timp prețios la fiecare cerere.
Pentru a sări acești timpi putem adăuga următorii parametri în fișierul my.cnf:

skip-name-resolve
skip-host-cache

Cu skip-name-resolve mysql nu va mai rezolva host-ul la fiecare conexiune nouă iar skip-host-cache va ignora cache-ul dns intern. Mai multe puteți afla aici: https://dev.mysql.com/doc/refman/5.5/en/host-cache.html .
De asemeea aceste setări nu sunt recomandate în producție fără o testare în prealabil.

Runlocal.sh – alternativă la eb local run

Runlocal este un script bash care simulează funcționarea lui eb local run. Așadar, dacă aveți un Dockerfile în proiect puteți să-l rulați cu ajutorul lui runlocal fără a avea nevoie de utilitarul eb.

Runlocal, construiește imagine din Dockerfile, lansează containerul și (opțional) urmărește log-ul containerului (cu opționea -f). Apoi curăță automat containerul și imaginea la ieșire (CTRL+C dacă urmăriți logurile).

De asemenea puteți integra runlocal în propriul vostru script:

Scriptul este disponibil ca un gist aici.

Bine v-am găsit

Am lipsit o perioadă destul de mare de pe blog, însă am de gând să scriu din nou.

Mi-am mutat acum blogul pe Amazon Web Services, iar momentan experimentez diverse metode a-mi reduce factura. Cel mai scump serviciu pare-se a fi RDS, dar îmi place ideea de daily snapshots așa că evaluez și alte strategii.

Mi-am pus de asemenea HTTPS, dar de la Cloudflare, care știu că nu e https end-to-end dar totuși mai bun decât deloc.

Am mai publicat făcut câteva gist-uri: unul care te poate ajuta să simulezi eb local dacă folosești Docker/containere și un script php care afișează tot ce-i trimiți în cererea HTTP, un fel de http request bin.