Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pomoc w doborze serwera
jbadyl
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 19.06.2010

Ostrzeżenie: (0%)
-----


Witam, mam pewien problem strona która posiadam w tej chwili hostowana w home.pl linia ekonomiczna (ale hosting w lini biznesowej tez nic nie zmienia) (IMG:style_emoticons/default/smile.gif) zaczyna działać bardzo wolno problemem są zapytania do bazy danych.
Nie mam możliwości szybkiego zoptymalizowania zapytań ze względu na użycie gotowego rozwiązania nieszczęśliwie połączonego z rozwiązaniem autorskim.

Strona ma około 100 000 odsłon miesięcznie, baza mysql zajmuje około 25 mb, średnio w każdej z tabel jest około 3k rekordów w 4 po 15k, sporo indeksów. A większość zapytań tego gotowego rozwiązania użytego w serwisie podczas jednego zapytania łączy za pomocą join co najmniej 5 - 8 tabel i robi z nimi dziwne rzeczy.
Jakich rozmiarów serwer polecacie żeby strona działał to sprawnie, stabilnie, szybko a ja nie poszedł z torbami, czy wystarczający był by już jakiś VPS ( z odpwiednią konfiguracją mysqla zeby sobie wszystko ładnie w pamięci trzymał bo baza nie jest jakaś specjalnie ogromna) czy moze jestem w błędzie ?

Co jest minimalną granicą tak poniżej której nie powinienem schodzić jeżeli chodzi o specyfikacje serwera ?

JB.
Go to the top of the page
+Quote Post
redeemer
post
Post #2





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


Przy takiej bazie serwis powinien śmigać. Dodaj może cacheowanie wyników zapytań w warstwie aplikacji?
Go to the top of the page
+Quote Post
jbadyl
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 19.06.2010

Ostrzeżenie: (0%)
-----


Nie wydaje mi się to dobrym pomysłem, znaczy jest ale na dla mojego przypadku chyba nie bardzo ponieważ masa rzeczy jest sortowana, grupowana itd a dodanie jednego elementu w tabeli spowoduje i tak konieczność odświeżenia cache przy takiej ilości odwiedzin bo średnio co drugi odwiedzający powoduje zmianę w bazie która wymagała by odświeżania cache

Poza tym nie widzę tam jakiejś prostej możliwości wpięcia się w istniejące funkcje więc to by była duża przeróbka która nie ma sensu gdyż za kilka miesięcy i tak większość najprawdopodobniej będzie pisana od nowa.
Go to the top of the page
+Quote Post
!*!
post
Post #4





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Z tego co opisałeś, toć to maleństwo i powinno działać bezproblemowo. Spróbuj podpiąć cache, aby chociażby sprawdzić czy działa lepiej, jeśli nie, winy szukałbym gdzie indziej, chociażby po stronie home.pl , i nie ma co tu gdybać.
Go to the top of the page
+Quote Post
athabus
post
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Wg. mnie przy takiej stronie, tj realtywnie mały ruch, ale cieżki skrypt powinieneś celować w jakiś dobry jakościowo hosting typu kei.pl - oni mają dobre maszyny i stosują mały overselling, przez co nawet ciężkie skrypty chodza bardzo sprawnie. Przykładowo skrypt na kei.pl chodził mi zdecydowanie szybciej niż na dość mocnym vps'ie w budżetowej firmie.

Minusem jest to, że w takich firmach z reguły stosują bardzo rygorystyczne obwarowania co do obciążenia - z jednej strony to plus, bo wykluczają z hostingu osoby zarzynające sprzęt i skrypty chodzą szybko, z drugiej strony oczywiście jak to Ty jesteś wysysaczem zasobów to masz problem ;-)

Jeśli to nie pomoże to pomyśl o vps - znowu raczej odpuść sobie budżetowe rozwiązania, bo one nie zdadzą egzaminu na dłuższa metę. Ja sam korzystam z vps w firmie iq.pl i moge o nich powiedziec bardzo dużo dobrego. Fak, że płacę z jakieś 50-70% drożej niż w firmach budżetowych, ale skok jakościowy w stosunku do niby takiej samej konfiguracji w firmie budżetowej jest ogromny. Przykładowo mam taką akcję w panelu admina, która średnio u nich zajmuje mi ~2s, a w budżetowej konkurencji na bardzo podobnej konfiguracji było to ~6s.

Reasumując przy takich uwarunkowaniach jak masz patrzyłbym na coś renomowanego, gdzie zagwarantują ci mały overselling usłgu, dużo pamięci/procesora na maszynie matce i szybkie dyski sas lub ssd najlepiej w macierzy raid 10. Ewentualnie jeśli masz ograniczony budżet to to szukaj czegoś w de lub uk.
Go to the top of the page
+Quote Post
jbadyl
post
Post #6





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 19.06.2010

Ostrzeżenie: (0%)
-----


Dostałem slow logi, i niektóre rzeczy trwają sporo ale od strony bazy danych nie mam tego jak ugryźć bo z indeksami przesadzać nie ma sensu bo to może zaszkodzić. Wg pomocy technicznej z hostingiem jest wszystko ok.


Przykładowe zapytanie,

  1. SELECT offers.id, items.name, items.description AS description, items.userId, users.name AS userName, users.city AS city, users.countryId AS country, countries.name AS countryName, winnerUsers.name AS winnerName, startDate, endDate, type, url AS imageURL, smallUrl AS imageSmall, oc.categoryId AS categoryId, offers.currentPrice, offers.active, offers.winner, offers.draft, offers.inWebstore,offers.views,offers.startPrice,offers.adult,offers.shipConditions,gs_users.user_photo, tags.tag_id, youtubeVideo, votes, points, rating FROM sklep_offers offers LEFT JOIN sklep_items items ON items.id=itemId LEFT JOIN sklep_users users ON users.id=items.userId LEFT JOIN sklep_images images ON images.id=imageId LEFT JOIN sklep_offers_categories oc ON oc.offerId=offers.id LEFT JOIN sklep_users winnerUsers ON winnerUsers.id=offers.winner LEFT JOIN sklep_countries countries ON users.countryId=countries.id LEFT JOIN `tag_work` tags ON tags.id_work = items.id_work_fk LEFT JOIN users gs_users ON users.id_user_fk=gs_users.id_user WHERE (currentPrice BETWEEN 0 AND 1000000000 AND offers.active=1 AND offers.draft=False) OR (offers.draft=False AND offers.type="STANDARD" ) GROUP BY offers.id ORDER BY offers.views DESC


jedno z najcięższych zapytań SQL wg logów które dostałem najdłużej 5 sekund, średnio koło 3 sekund trwa jego wykonanie wykonanie, i teraz jak to ruszyć skoro jego wynik jest zależny od ilości wyświetleń elementów na stronie plus stronnicowanie poprzez limit, wiec przy ponownym wywołaniu w zupełności wystarcza cache MySQL w takim krótkim okresie czasu.

Chociaż może ktoś z was widzi jak to lepiej zrobić ?

Wracając do VPS najlepiej taki który pozwolił by mi bez zbędnych przenosin na zwiększanie parametrów coś jak w chmurze, jednak taniej niż w e24cloud,

Ten post edytował jbadyl 11.08.2012, 17:40:07
Go to the top of the page
+Quote Post
athabus
post
Post #7





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Jeśli chodzi o vps to chyba większość dostawców umożliwia coś takiego. W iq na pewno jest taka opcja, bo sam kiedyś ich o to pytałem. Problem pojawia się dopiero przy migracji na dedyka.
Go to the top of the page
+Quote Post
scanner
post
Post #8





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Cytat(jbadyl @ 11.08.2012, 18:37:20 ) *
Przykładowe zapytanie,
  1. SELECT offers.id, items.name, items.description AS description, items.userId, users.name AS userName, users.city AS city, users.countryId AS country, countries.name AS countryName, winnerUsers.name AS winnerName, startDate, endDate, type, url AS imageURL, smallUrl AS imageSmall, oc.categoryId AS categoryId, offers.currentPrice, offers.active, offers.winner, offers.draft, offers.inWebstore,offers.views,offers.startPrice,offers.adult,offers.shipConditions,gs_users.user_photo, tags.tag_id, youtubeVideo, votes, points, rating FROM sklep_offers offers LEFT JOIN sklep_items items ON items.id=itemId LEFT JOIN sklep_users users ON users.id=items.userId LEFT JOIN sklep_images images ON images.id=imageId LEFT JOIN sklep_offers_categories oc ON oc.offerId=offers.id LEFT JOIN sklep_users winnerUsers ON winnerUsers.id=offers.winner LEFT JOIN sklep_countries countries ON users.countryId=countries.id LEFT JOIN `tag_work` tags ON tags.id_work = items.id_work_fk LEFT JOIN users gs_users ON users.id_user_fk=gs_users.id_user WHERE (currentPrice BETWEEN 0 AND 1000000000 AND offers.active=1 AND offers.draft=False) OR (offers.draft=False AND offers.type="STANDARD" ) GROUP BY offers.id ORDER BY offers.views DESC

Zrób sobie EXPLAIN tego zapytania - masz tu 8 (OSIEM) leftjoinów - naprawdę nie możesz tego rozbić na osobne zapytania czy użyć podzapytań?
Go to the top of the page
+Quote Post
jbadyl
post
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 19.06.2010

Ostrzeżenie: (0%)
-----


Zrobilem sobie explain może czegoś nie widze w tym co on zwraca:
(IMG:http://img210.imageshack.us/img210/9188/explainc.png)

Wiem ze najlepsze było by przepisanie całego serwisu jednak to wymaga czasu, cos tam probuje w tych zapytaniach zmieniać jezeli wiem ze nic mi sie nie posypie z tego powodu ale niestety nie przynosi to wymiernego efektu.


UPDATE:

Być może przyczyną albo jedną z przyczyn błędna reguła dla mod_rewrite, pomimo zwracania tego co powinna czyli obrazka, wykonywało się również zapytanie do skryptu php, sam skrypt wykonywał sporo zapytań wiec podczas jednego załadowania strony wykonywane było dodatkowe kilkanaście jego wywołań ponownie.
Serwer bazy danych miał prawo się zakleszczyć z taką ilością joinów.

Dodatkowo ktoś miał fantazję aby wyświetlić kilka pozycji na stronie są pobierane wszystkie rekordy i po stronie robiona jest ich filtracja, dziękuje za pomoc, chyba do czasu przepisania całości uda mi się wszystko jakoś połatać i przyspieszyć.

Podepnę się jeszcze z pytaniem, czy jest coś na windowsa w działaniu podobne do siege ? bo nie chce mi się uruchamiac virtualboxa tylko po to.

Ten post edytował jbadyl 12.08.2012, 20:03:35
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 04:45