На форуме 9558 тем, 76453 сообщений, 44667 участников
тема · 1 722 просмотра · 14 ответов

Нагрузки ^_^ Opencart 2102 + корявый htacces

Общие вопросы
читают: 0 участников и 1 гость
порядок
21 мар 2017 04:34· изменено#1
Друзья, выручайте )

Снимок.PNG

Нежданно негаданно словил такую приколюху... В силу молчаливости хостаря заметил только когда из бэкапов уже не развернуться... Вспомнить что делал не представляется возможным (ставил модули по rss потокам, но их уже выпиливал - бестолку)

Сайт давно уже перехал с 1,5 на 2102 местную. И относительно недавно стал переeзжать на https.


В общем и целом на этом тарифе я давно, на этом домене тоже(по сути он сменился на https, но всё же).
Боты запрашивают не миллионы и даже не тысячи страниц в час. Мой товарищ настаивает на том, что вина в ботах(бинк, майл, яша, гугл подрубаются, действительно чаще посетителей, коих в день 700-800).

Нагрузка по базе относительно не изменилась
Снимок.PNG

Но у меня разгорается от такового вот лога долгих запросов в MySQL

>>>> вырезано, перенесено в следующее сообщение


В силу того, что от ботов, по понятным причинам, зашториваться не охотj. А знания мои в MySQL ограничиваются однострочными запросами(как правило, в гугл), прошу хелпа в вопросе оптимизации оных.

Я так и не понял с чем именно проблема, с тем что сайтмап генерируется на лету (на лету? коробочный гугл сайтмап),или с тупизмом в самих запросах.


Страница продукта как таковая и вне каких-то шоковых ситуаций генерируется и загружается практически моментально (1-2 сек, по gtmetrix), но когда ловит эти 1000 ms - посетитель натыкается на >110секунд ожидания


Заранее благодарен.
21 мар 2017 04:37#2
1000 ms

Страница:/index.php?route=feed/google_sitemap
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 25.66мс

SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM oc_product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '1') AS reward, (SELECT ss.name FROM oc_stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '1') AS stock_status, (SELECT wcd.unit FROM oc_weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '1') AS weight_class, (SELECT lcd.unit FROM oc_length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '1') AS length_class, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM oc_review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN oc_manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '136' AND pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0'

----------------------

Страница:/
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 19.3мс

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC, LCASE(pd.name) DESC LIMIT 0,16

----------------------


Страница:/
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 16.83мс

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC, LCASE(pd.name) DESC LIMIT 0,16

----------------------

Страница:/index.php?route=feed/google_sitemap
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 18.58мс

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC

----------------------

Страница:/index.php?route=feed/google_sitemap
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 1000.84мс

*тут такой же как первый, сменился только id товара"

----------------------

Страница:/index.php?route=feed/google_sitemap
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 1001.04мс

*тут такой же как первый, сменился только id товара"

----------------------

Страница:/
Источник:domain/public_html/catalog/model/catalog/product.php
Время выполнения: 17.51мс

SELECT p.product_id, (SELECT AVG(rating) AS total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM oc_product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' GROUP BY p.product_id ORDER BY p.date_added DESC, LCASE(pd.name) DESC LIMIT 0,16
21 мар 2017 10:13#3
Google Sitemap если штатный, то может и создавать нагрузку. Все же лучше не генерировать каждый раз, а кешировать итд.
Всяческих генераторов сайтмап которые не создают нагрузку хватает.

Далее. Бытует мнение (не силен в теории этого вопроса), что шифрование трафика создает дополнительную нагрузку на процессор, что и влияет на тариф. Когда поднялась шумиха вокруг https везде писали, что возрастут затраты из за покупки сертификата и смены тарифа из за возросшей нагрузки.
21 мар 2017 13:13#4
вырубил стоковый сайтмапгенератор под гугла... пока рано, говорить, но нагрузка вроде как снизилась... upd: ничерта не снизилась
не посоветуете фришного сайтмапгенератора с кэшем ?

понятно что гугл в помощь, но уже столько говна всякого перелопатил, что щас ещё глубже закопаюсь, по-моему (


очень мало инфы по оптимизации запросов в двойке, такой проблемы нет ? не стоит её рассматривать ?
если под полуторку это пологовно едва ли не решение всех проблем... то с двойкой такого объёма инфы нет
(индексы добавлены уже все какие только можно)
21 мар 2017 13:28· изменено#6
блин... кэшеры это ничерта не выход по-моему...
понятно, что когда плавно всё это дело растёт - мошт и вариант...
но когда у тебя резко забомбило, на сайте, которому не первый год...
ну блин... это косяк разраба, того мудака, который чо-то накосячил с кодом (все обернулись на меня?)...

Снимок.PNG


где то я находил этот модуль уже...
ща два скрина скину, посмеётесь

а... щас уже не так смешно..но ночью у них за4е секунды было...
понятно что у меня уже чо-то там где-то подпилено, да выпелено.. но у меня на лету всё

moy.PNGnemoy.PNG
21 мар 2017 14:02#7
Кешер как минимум должен снизить нагрузку.
Вы вот в спойлере статистику давали. Но вот там не хватает данных по кол-ву запросов. Может один нагруженный процесс долбится 1000 в час.. вот и нагрузка. Тем более показали вы время, но информации по нагрузки на cpu нету.
В любом случаи, мне кажется https дал свои результаты по нагрузки. Не зря же пишут об этом?
21 мар 2017 14:36#8
да. отсутствие временной метки косяк мода логирования, не до допилов сейчас.

хостарь божитсться, что https не при делах..

кэшер, да. понятно, нагрузку снизит, но сколько я с мультиязычником/мультивалютником с ними нае6*ался... что ставить кэшеры желание отбило...

на данный момент проблема как бы решена следующим макаром, буду выяснять кто именно виноват чуть позже. ибо нет времени сейчас вникать, адовый денёк.

вот стата с отрубленной гуглсайтмапой и с костылём, о котором напишу под скрином
Снимок.PNG

короче были у меня в своё время url с заглавными буквами...
потом был переезд.. не желая ставить вкмод - я отрубил себе возможность поставить кучу самых известных и крутых модулей и ограничился сеопро...

сеопро у меня при обращении на адрес с заглавной буквой возвращает 404... я хз почему так...у меня ещё параллельно куча проблем с редиректами (различные модули менеджеры редиректов просто не работают)....

в итоге был найден и вставлен в htacces следующий костыль
смотреть костыль

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]


который сначала перекидывал на http(покер по какому протоколу обратились) версию со строчными буквами... а с http шёл редирект на https...
короче при одном обращении - два редиректа...

больше пинаю на костыль... сейчас гуглсайтмапа снова активирована...посмотрю чо будет...

весьма жаль что проблема сугубо уродски индивидуальная и большинству юзеров совсем не поможет (
чисто как бы - смотрите какой я ублюдок что так на говноделал )


если есть решение по строчным/заглавным - был бы рад.

установка полноценных сеомодулей ещё немного за горами,а травить 404 болльшому количеству визитёров не охото.
21 мар 2017 14:49#9
привести в нижнему регистру запросы, дело одной строки в контроллере сеопро.
21 мар 2017 14:51· изменено#10
Vlad написал(а): ↑привести в нижнему регистру запросы, дело одной строки в контроллере сеопро.

можно носом ткнуть ? там по-моему есть перегон в строчные..но что-то у меня пошло не так...


короче да, это был долбанный костыль. яган*он (


Я сижу прям офуеваю от мастерства создавать себе проблемы)))10 часов к ряду я потратил на эту хрень)))
21 мар 2017 15:57#11
KirillKern написал(а): ↑там по-моему есть перегон в строчные

может и есть. Приложите файл, посмотрю..
21 мар 2017 15:58#12
Vlad написал(а): ↑может и есть. Приложите файл, посмотрю..

Ближе к вечеру. Спасибо)
21 мар 2017 17:31#14
KirillKern написал(а): ↑да. отсутствие временной метки косяк мода логирования, не до допилов сейчас.

хостарь божитсться, что https не при делах..

кэшер, да. понятно, нагрузку снизит, но сколько я с мультиязычником/мультивалютником с ними нае6*ался... что ставить кэшеры желание отбило...

на данный момент проблема как бы решена следующим макаром, буду выяснять кто именно виноват чуть позже. ибо нет времени сейчас вникать, адовый денёк.

вот стата с отрубленной гуглсайтмапой и с костылём, о котором напишу под скрином
Снимок.PNG

короче были у меня в своё время url с заглавными буквами...
потом был переезд.. не желая ставить вкмод - я отрубил себе возможность поставить кучу самых известных и крутых модулей и ограничился сеопро...

сеопро у меня при обращении на адрес с заглавной буквой возвращает 404... я хз почему так...у меня ещё параллельно куча проблем с редиректами (различные модули менеджеры редиректов просто не работают)....

в итоге был найден и вставлен в htacces следующий костыль
смотреть костыль

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]


который сначала перекидывал на http(покер по какому протоколу обратились) версию со строчными буквами... а с http шёл редирект на https...
короче при одном обращении - два редиректа...

больше пинаю на костыль... сейчас гуглсайтмапа снова активирована...посмотрю чо будет...

весьма жаль что проблема сугубо уродски индивидуальная и большинству юзеров совсем не поможет (
чисто как бы - смотрите какой я ублюдок что так на говноделал )


если есть решение по строчным/заглавным - был бы рад.

установка полноценных сеомодулей ещё немного за горами,а травить 404 болльшому количеству визитёров не охото.

О!!! знакомая портянка 🙂

Ну, в принципе после перехода на https - обе ПС посчитали его новым сайтом, и пошли крутить вертеть - чем и создали проблему нагрузки

В таком случае надо было, уже поздно, наверное, установить частоту посещения роботом в роботс

Как вариант сделать редирект силами php, не помню, почему тогда не сделали

Коробочный сайтмап отключить и никогда не включать, или допилить до нормально работающего, или за малую сумму приобрести адекватный
22 мар 2017 22:14· изменено#15
Chukcha написал(а): ↑$parts = explode('/', trim(utf8_strtolower($route), '/'));


используемый сеопро в сообщении, с такой строкой в коде, да.
повторюсь, что ещё существует проблема с созданием редиректов(из модулей), которая ещё не решена.

но тем не менее, если в юрл поменять любую букву на заглавную - отдаёт 404.


простите за задержку. дни какие-то с ног на голову.
то чувство, когда сам себе продел наделал и разрулил блин )))
Снимок.PNG
Вложения · 1
сообщения 1–15 из 15
Чтобы ответить, войдите или зарегистрируйтесь.

Похожие темы