Koliko resursa troši WooCommerce i kad shared nije dovoljan

0

Prodavnica ti radi bez problema. Onda pustiš popust, pošalješ newsletter, i za pola sata ti se javi prvi kupac sa slikom ekrana na kom piše 508. Ti otvoriš sajt sa telefona, sve radi normalno, i pomisliš da je do njega.

Nije do njega. Dogodilo se to da je tvoja prodavnica u tih pola sata tražila više nego što paket daje. Problem je što niko ne prodaje hosting u jedinicama koje razumeš, pa ne znaš ni gde si sada ni kada ćeš udariti u zid. Ovaj tekst objašnjava koje četiri brojke stvarno odlučuju, kako da izmeriš gde stojiš i po čemu prepoznaješ da si prerastao paket.

WooCommerce se ne meri brojem poseta

Na blogu je posao lak. Posetilac dođe, cache mu servira gotov HTML, PHP se skoro i ne pokrene. Hiljadu poseta dnevno na blogu je za server praktično ništa.

Prodavnica radi drugačije, jer tri najvažnije stranice ne smeju da se keširaju. Korpa, kasa i nalog kupca moraju da budu sveže za svakog posetioca posebno, inače ti kupac vidi tuđu korpu. Zbog toga svaki ozbiljan cache plugin ima pravilo da preskoči te stranice i kolačiće wp_woocommerce_session_* i woocommerce_cart_hash, kao i zahteve koji idu kroz wc-ajax. To je zvanična preporuka iz WooCommerce dokumentacije za keširanje, ne naša izmišljotina.

Praktična posledica: dodavanje u korpu, kasa, prijava i svaki AJAX poziv koji osvežava korpu prolaze kroz pun PHP i punu bazu. Sto ljudi koji čitaju blog i sto ljudi koji su u kasi su za server dva potpuno različita događaja.

Četiri brojke koje stvarno odlučuju

1. Memorija

WooCommerce od verzije 10.8 zvanično traži WordPress 6.9 ili noviji, PHP 8.3 ili noviji, MySQL 8.0 odnosno MariaDB 10.6, i memorijski limit od najmanje 256 MB. To je minimum za jedan proces, ne za ceo sajt.

Tu ljudi najčešće pogreše. Ako je memorijski limit 256 MB, a u istom trenutku ti pet ljudi radi nešto nekeširano, to je pet nezavisnih PHP procesa i svaki od njih sme da uzme do 256 MB. U praksi retko uzmu ceo limit, ali se lako složi gigabajt i po samo od nekoliko paralelnih kasa i jednog uvoza proizvoda u pozadini.

Zato u specifikacijama paketa stoji RAM kao poseban red: 2 GB na WP Start paketu, 4 GB na WP Advanced i 8 GB na WP High-End. Prodavnica sa nekoliko dodataka za dostavu, plaćanje i fiskalizaciju vrlo brzo pojede prva dva gigabajta.

2. Ulazni i aktivni procesi

Ovo je limit koji najviše boli, a najmanje se pominje. Ulazni procesi su broj zahteva koje tvoj nalog sme da obrađuje u istom trenutku. Kad se taj broj popuni, server ne usporava, nego odbija sledeći zahtev i posetilac dobija 508 Resource Limit Is Reached.

Brojke po paketima su 100 ulaznih i 200 aktivnih procesa na WP Start, 250 i 500 na WP Advanced, 500 i 1000 na WP High-End.

Zvuči kao mnogo dok ne uračunaš vreme. Keširana stranica drži proces desetak milisekundi. Kasa koja računa poštarinu preko API-ja kurirske službe ume da drži proces dve do tri sekunde. Ako ti u minuti prođe 40 ljudi kroz kasu, a svaki drži proces tri sekunde, to je oko dva procesa stalno zauzeta samo kasom, dok istovremeno bot indeksira katalog i neko radi izvoz porudžbina. Kad kampanja udari, ti brojevi se ne sabiraju linearno nego u talasu.

3. Disk IO i IOPS

Svaka porudžbina piše u bazu na više mesta: sama porudžbina, stavke, zalihe, sesija kupca, log plaćanja, red zakazanih zadataka. Uz to ide i pisanje u fajlove, od keša do logova dodataka.

Paketi to ograničavaju na 20 MB/s i 2048 IOPS na WP Start, 40 MB/s i 4096 IOPS na WP Advanced, 100 MB/s i 8192 IOPS na WP High-End. Kad udariš u IOPS limit, simptom je čudan i lako ga pogrešno protumačiš: sajt nije pao, procesor nije zauzet, ali sve traje duže nego juče. Najčešće se to dogodi u satu kad se poklope kampanja i dnevni bekap.

4. Inodovi

Inod je jedan fajl. Ne veličina, nego komad. Ograničenje je 500.000 na WP Start, 1.000.000 na WP Advanced i 2.000.000 na WP High-End.

Prodavnice ovaj limit troše brže od bilo čega drugog, jer WordPress od svake slike proizvoda pravi više izvedenih veličina. Katalog od 3.000 proizvoda sa po dve slike i šest registrovanih veličina je već oko 36.000 fajlova samo u medijskoj biblioteci. Dodaj tu keš, logove, dnevne bekape koji stoje na nalogu i fajlove tridesetak dodataka, i broj raste bez da si primetio. Kad se inodovi popune, prvo obično pukne bekap, pa tek onda sajt.

Posao koji se odvija dok ti spavaš

WooCommerce veći deo pozadinskog posla radi kroz Action Scheduler: slanje mejlova, sinhronizacija zaliha, obnova pretplata, generisanje fidova, podsetnici za napuštenu korpu. Taj red se pokreće preko WP Cron-a, najviše jednom u minutu, i obrađuje podrazumevano po 25 zadataka u jednoj turi, uz mogućnost da radi do pet redova paralelno.

Dve stvari odatle vredi zapamtiti. Prva, ako ti je WP Cron vezan za posete, a nemaš posetilaca noću, red se ne prazni nego se gomila i onda ujutru krene sav odjednom. Druga, kad broj zakazanih zadataka stalno raste i nikad ne padne na nulu, to nije problem plugina nego znak da nalog nema dovoljno procesa i memorije da ih poklopi.

Kako da izmeriš gde si sada

  1. Otvori WooCommerce, pa Status, pa System status. Tu piše koliko ti je memorijski limit, koja verzija PHP-a radi i koliko je velika baza. Ako je limit ispod 256 MB, ovde staješ i to prvo rešavaš.
  2. U kontrolnoj tabli hostinga nađi grafikone potrošnje resursa. Ne gledaj prosek nego vrhove i kolonu sa odbijenim zahtevima. Ako se tamo pojavljuje bilo koji broj veći od nule, već si udarao u limit.
  3. Pretraži logove grešaka po broju 508. Jedan pogodak mesečno je slučajnost, deset u istom satu je poruka.
  4. Instaliraj Query Monitor, otvori kasu kao običan kupac i pogledaj koliko upita i koliko sekundi troši ta jedna stranica. Preko sto upita na kasi znači da neki dodatak radi posao koji ne mora.
  5. Prebroj fajlove. Preko SSH-a je to jedna komanda, find . | wc -l u korenu naloga. Uporedi rezultat sa limitom iz svog paketa.
  6. U WooCommerce, Status, Scheduled actions pogledaj koliko zadataka stoji kao pending. Ako je taj broj ujutru veći nego uveče svakog dana, red se ne prazni.

Pet znakova da si prerastao paket

Nijedan od ovih sam po sebi nije presuda, ali tri zajedno jesu.

  • 508 se pojavljuje baš onda kad ti je promet najveći, a nestane čim promet padne.
  • Kasa je sporija od kategorije sa dvesta proizvoda, iako je kategorija teža stranica.
  • Spisak porudžbina u administraciji se otvara više sekundi. Ovo je često zaseban problem strukture baze, o čemu smo pisali u tekstu o HPOS-u i prodavnicama sa preko 5.000 porudžbina, pa proveri prvo to pre nego što platiš jači paket.
  • Broj zakazanih zadataka raste iz dana u dan.
  • Dnevni bekap povremeno ne prođe do kraja, ili ti stigne upozorenje o prostoru i inodovima.

Šta uradi pre nego što platiš više

Dobar deo prodavnica koje se guše ne treba jači paket nego pola sata rada.

Proveri prvo da su izuzeci u kešu tačno postavljeni. Korpa, kasa i nalog van keša, plus kolačići sesije i wc-ajax zahtevi. Ako su ta pravila pogrešna, dešava ti se ili da se stranice keširaju kad ne treba, ili, češće, da se ne kešira ništa pa svaki posetilac ide kroz pun PHP.

Zatim uključi object cache ako ga paket podržava, jer prodavnice imaju mnogo ponovljenih upita nad istim podacima. Pa prođi kroz spisak dodataka i skini one koje ne koristiš, posebno one koji kače nešto na svako učitavanje stranice. Onda počisti stare izvedene veličine slika i registruj samo one koje ti tema stvarno prikazuje. Konkretne korake za ovaj deo posla imaš u čeklisti za ubrzavanje WooCommerce prodavnice.

Ako posle svega toga i dalje vidiš odbijene zahteve u vrhovima, onda je stvarno paket.

Kada je jači paket jedina prava odluka

Gruba orijentacija, po onome što viđamo na nalozima:

Katalog do nekoliko stotina proizvoda i par porudžbina dnevno mirno stoji na ulaznom paketu. Nekoliko desetina porudžbina dnevno, redovne kampanje i pet do deset dodataka traže srednji paket, uglavnom zbog procesa i memorije, ne zbog prostora. Katalog preko nekoliko hiljada artikala, pretplate, B2B cene po kupcu ili sezonski skokovi u kojima se prodaja dešava u jednom satu su već gornji paket ili poseban server.

Ako ti odgovara da neko drugi vodi računa o tome, pogledaj šta ulazi u naš WooCommerce hosting, gde su paketi podešeni za prodavnice, a ne za obične sajtove. Ceo pregled resursa po paketima je u specifikacijama svih paketa, pa možeš da uporediš brojke sa svojim merenjima pre nego što bilo šta menjaš. Ako tek razmišljaš o prelasku na drugi nivo, pomoći će ti i tekst o tome kada sajt preraste osnovni paket.

Prodavnica ne pada zbog broja posetilaca. Pada zato što u jednom trenutku traži više paralelnih procesa, memorije ili upisa nego što paket daje. Izmeri ta četiri broja jednom, zapiši ih negde, i sledeći put kad pustiš kampanju znaćeš unapred da li ti je tesno ili nije.