- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть две таблицы с людьми. Скрипт сравнивает людей из 1 таблицы с людьми из 2-ой таблицы и обновляет несколько полей в таблице №1 согласно логике сравнений.
Всего три запроса, вот их шаблон
Так как всего записей в таблицах более 300.000 я протестировал из консоли работу скрипта с LIMIT 30.
Проверил в пхп майадмн - 30 записей получили в поле SCAN = 1
Так как крон без геморроя можно самое быстрое поставить на раз в минуту я подобрал лимит чтобы скрипт отрабатывал секунд за 45. Это было лимит =100.
Еще раз проверил - все ок и запустил крон.
Прошло пару часов, я зашел в мунин и смотрю, а нагрузка та стала падать.... (см. скриншоты)
Странно....
Первая мысль мускуль "прогрелся" и скрипт стал отрабатывать быстрее.
Я тормознул крон, и решил протестировать скрипт опять через консоль.
Он отработал за 8 сек!!! Я обрадовался, думаю щас лимит поднимаю и задача закончится за день.
Но решил проверить в пхпмайадмин - еще раз запуская скрипт, отрабатывает за 8 сек, а кол-во записей получивших SCAN = 1 равно 20!!! И это при лимите 100!!!
Короче поигрался с лимитами - скрипт их вообще не придерживается.
Подумал может квери кеш? ДОбавил SQL_NO_CACHE
Скорость скрипта стала по 45 сек с лимитов 100, счетик увеличивался на 5-7 единиц. Просто херня какая то. убрал но кеш, поднял лимит до 200, стало отрабатывать за 55 сек примерно и счетчик увеличивается на 120 примерно. Ну просто НОЛЬ ЛОГИКИ :))) чертовщина
Какие у вас мысли? Почему плавно падает нагрузка и скрипт плавно замедляется, когда ведь ему четко говорят - бери 100 штук записей, анализируй, обновляй!!!
Потому, что LIMIT это не
Это сделай всё, что я хочу со всеми записями, а потом отбрось все, кроме 100
Разницу понимаешь? Поэтому LIMIT пишется в конце запроса.
---------- Добавлено 19.01.2019 в 20:55 ----------
Может их по факту столько там.
Я не привел весь скрипт, может в итоге логики лимит потом и станет в конец. Но работать он должен как я описал. И он работал так в первые запуски. Чего по фатку столько? В таблицу скан записывается 1 когда она обработана, всего записей 350.000.
По идее они должны обрабатываться пачками согласно лимиту. Но если сейчас опять тормознуть крон и запускать срипт вручную через консоль, то кол-во обрабатываемых им записей не поддается логике - 5, 20, 127, но никак не столько сколько задано в лимите
выборку запусти без лимита и посмотри сколько там записей вообще.
Также у тебя на полях есть индексы? Случаем не прописано в системе задержка по вставке индексов?
Я итак знаю сколько записей в 1 и 2 таблице. скрип обновляет поле scan - ставит туда 1, это значит эта запись проанализирована.
В самом конце скрипта есть такое
а в начале такое
кодер его написавший тоже без понятия почему скрипт так странно работает.
В таблице №1 есть только первичный ключ на ID и индекс на поле scan
Проверь, чтобы были ещё индексы на полях: fullname и shortname.
Эти поля из таблицы 2, там есть индексы. Вторая таблица вообще не обновляется, только сравнивается. Может этот lock виноват, как корректно убрать его?
В итоге за ночь скрипт затормозился и делал обновление 2-3 записей при лимите 200.
Как такое возможно?
Простые запросы, четкий лимит. Скрипт начал работать ровно так как от него и ожидали - четко соблюдая лимит и потом затормозился, что может вызвать такое?
ВЫ на одновременную работу двух скриптов грешите, что незаконченный первый запуск блокирует второй скрипт? В процессах два скрипта одновременно не видно? Я к тому, что создать lock файл проверки, что пока скрипт не закончил работу, второму не давать запускаться , чтобы одновременно два скрипта не запускались. Или запустить в ручном режиме вообще без лимита в бекграунде командой nohup. Или может в самом скрипте ошибка, выводить на экран больше отладочной информации.
Проверьте логи ядра, не убивается ли Ваш процесс ядром по нехватке памяти ?
---------- Добавлено 20.01.2019 в 11:43 ----------
Ну и в скрипт добавьте "метки" которые будут сбрасываться в лог
Так будет проще понять в чём дело, и на каком этапе ошибка
В общем поднял я на домашнем опенсервер. Загрузил таблицы, выполняю скрипт с лимитом в 200. Выполнился за 125 сек. Блин долго нет смысла. Проверяю сколько скан = 1. Ровно 200! Вспомниаю что хотел перевести таблицы в мемори. Первожу, выполняю скрипт - 38 сек!!! Смотрю сколько скан = 1, уже 398!!! А не 400 как должно. Еще раз 5 запускаю скрипт - кол-во скан плавно уменьшается от 200 к нулю. Т.е. поведение скрипта полностью такое же как и на сервере. Нужно пересмотреть его логику...