2017-01-05 6 views
1

Я запускаю веб-приложение, используя php/MySql.max_questions - оценка содержания [mysql/php]

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

Мое приложение находится на общем сервере, поэтому у меня нет доступа к изменению целой кучи параметров (включая max_questions).

Я столкнулся с ошибками max_questions на неудовлетворительно частом основании.

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

Учитывая, что у меня нет доступа для изменения значения max_questions; есть ли в любом случае, что я могу прочитать, сколько вопросов из моего максимума я использовал, чтобы я мог дросселировать выполнение, чтобы оставаться ниже предела?

Так что в настоящий момент я начинаю ночные задания, которые не срабатывают, возможно, через пару часов, тогда как если бы я замедлил их, чтобы бежать на 80%, они могли работать в течение 10 часов.

Есть ли в любом случае я могу видеть, если я выше, скажу 95% моего пособия в любой момент времени и поэтому замедляю мою обработку, когда это так?

Благодарен за любые предложения.

+0

Лучше всего использовать блок try/catch и проверить исключение для этой строки ошибки. Если обнаружено, инициируйте период сна/кулдауна. Кроме того, взгляните на это: http://dba.stackexchange.com/questions/31190/viewing-mysql-account-resource-limits –

+0

Джереми - Спасибо. Это немного "DOH!" момент для меня. КУРС, если я просто улавливаю ошибку max_questions, я могу заставить процедуру приостановить оставшуюся часть часа (или меньше?) И перезапустить. (Я новичок в использовании этого сайта, но я думаю, что вы опубликовали комментарий, а не ответ? Поэтому я не думаю, что могу проголосовать за вас, к сожалению. –

ответ

0

Если вы слишком быстро бомбардируете MySQL, неважно, если вы соберете свои запросы - даже если их собрать, это хорошая идея, чтобы ваш скрипт закончился раньше. Вы просто достигнете предела более сложными запросами. Вы можете использовать usleep для выполнения дроссельной заслонки, тогда вам придется учитывать интервал дроссельной заслонки на задержку, которая гарантирует, что ваш скрипт не успеет выполнить ежечасные запросы за пределом.

Сначала узнайте значение max_questions, или макс. почасовые запросы для одного пользователя. (Определено в db/table mysql/user.) Затем зарегистрируйте время начала вашего скрипта и учтите количество запросов, которые вы выполнили. Когда вы приближаетесь к пределу, установите скрипт в режим ожидания до 60 минут, затем сбросьте таймер. Если вы используете комбинацию этого подхода и постоянный микропереключатель, у вас меньше шансов нанести другие ограничения (например, max_user_connections), который может иметь ваш хост.

Если ваш хост позволяет вам иметь несколько пользователей MySQL, которые могут обращаться к одной базе данных, вы можете настроить отдельного пользователя для каждого параллельного сеанса или настроить ротатор пользователя в свою процедуру подключения к базе данных. (Если нет, вы можете разбить базу данных, если можно выделить различные аспекты процесса и делегировать разные задачи различным пользователям. В этот момент я предпочел бы получить базовый VPS за 5 долларов США в месяц.)

Для общей ссылки, ссылки на руководство по MySQL на Account Resource Limits. При создании или изменении пользователей используется MAX_QUERIES_PER_HOUR, что переводится в столбец max_questions. Если у вас есть необходимые разрешения, вы можете выпустить оператор FLUSH USER_RESOURCES, чтобы сбросить счетчики за пределы использования, отличные от max_user_connections (сбросит все почасовые ограничения).

Редактировать: Вы можете настроить свою базу данных, чтобы сохранить статистику пользователя в таблице под базой данных mysql. Установите userstat = 1 в вашей конфигурации, перезапустите сервер и статистику можно получить с помощью SHOW USER_STATISTICS.Это работает, по крайней мере, с MariaDB (info) и Percona (info) вилки MySQL; однако я не могу найти информацию об этом для самой MySQL, это может потребовать установки стороннего плагина.

+0

Пока не выяснено, где текущие значения ресурса пользователя лимиты сохраняются (как представляется, не находятся в базе данных 'mysql', где установлен лимит), но справедливая ставка заключается в том, что вы не будете иметь доступ к этому, где бы он ни находился. Легче просто отслеживать свой запрос подсчет в любом случае –

+0

Спасибо - поймите, что привязка к точкам, но взаимодействие mysql не является фактором ограничения времени. Я могу запускать как минимум 6 параллельных процессов без снижения скорости. Я посмотрел, как отслеживать количество запросов, Я, кажется, преуменьшаю ограничения на транзакции c 30k (должно быть 50) - есть несколько дополнительных запросов, связанных с веб-трафиком, но не так много! Следовательно, вы хотите увидеть, могу ли я «читать» текущий «счет» и действовать это. Если не возможно, я думаю, мне нужно прибегнуть к пробной и ошибке! (кстати, у меня нет доступа к нескольким пользователям на db). –

+0

Текущее состояние того, где вы находитесь со своим лимитом, по-видимому, хранится в журналах MySQL - и выборка информации будет меньше, чем тривиальная операция. Не то, что вы хотите делать все время! Если у вас есть права на чтение таблицы 'mysql/user', вы можете запустить запрос и узнать точное значение вашего лимита. В противном случае, например. просто установите счетчик и запишите его в файл после каждого запроса и посмотрите, где счетчик, когда он завершен. Если у вас есть запросы от веб-трафика поверх, очевидно, вычитайте это из кеша вашего скрипта с некоторым дополнительным преимуществом, чтобы ваши сайты не теряли силу. –

Смежные вопросы