большое количество вставок в секунду, вызывающее значительную нагрузку на процессор - PullRequest
4 голосов
/ 17 февраля 2012

У меня есть PHP-скрипт, который при каждом запуске вставляет новую строку в базу данных Mysql (с относительно небольшим количеством данных ..) У меня более 20 запросов в секунду, и это заставляет мой процессор кричать о помощи ..

Я использую метод sql INSERT DELAYED с движком MyISAM (хотя я только заметил, что INSERT DELAYED не работает с MyISAM).

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

Моей первой идеей было записать эти данные в файлы почасового журнала и один раз в час, чтобы извлечь данные из журналов и сразу же вставить их в БД.

Возможно, лучшая идея - использовать NoSQL DB вместо файлов журнала, а затем один раз в час вставлять данные из NoSQL в Mysql.

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

Ответы [ 5 ]

4 голосов
/ 19 февраля 2012

Хорошо, ребята, мне удалось значительно снизить нагрузку на процессор с помощью APC-кэша

Я делаю это так:

хранение данных в памяти с APC-кешем, с TTL 70 секунд:

apc_store('prfx_SOME_UNIQUE_STRING', $data, 70);

раз в минуту я перебираю все записи в кеше:

$apc_list=apc_cache_info('user');

foreach($apc_list['cache_list'] as $apc){
    if((substr($apc['info'],0,5)=='prfx_') && ($val=apc_fetch($apc['info']))){
        $values[]=$val;
        apc_delete($apc['info']);
    }
}

вставка $values в DB

и процессор продолжает улыбаться ..

наслаждаться

4 голосов
/ 17 февраля 2012

У меня недавно была очень похожая проблема, и я решил просто пакетировать запросы. Это ускорило процесс примерно в 50 раз из-за уменьшения накладных расходов на соединения mysql, а также из-за значительного уменьшения количества переиндексаций. Сохранение их в файл и одновременное выполнение одного более крупного (100-300 отдельных вставок) оператора, вероятно, является хорошей идеей. Чтобы еще больше ускорить процесс, отключите индексирование на время вставки с помощью

ALTER TABLE tablename DISABLE KEYS
insert statement
ALTER TABLE tablename ENABLE KEYS

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

0 голосов
/ 19 февраля 2012

Поскольку вы пытаетесь вставить INLERT DELAYED, я полагаю, вам не нужны вторые данные. Если вы хотите придерживаться MySQL, вы можете попробовать использовать репликацию и тип таблицы BLACKHOLE. Объявив таблицу с типом BLACKHOLE на одном сервере, затем реплицировав ее на MyISAM или другой тип таблицы на другом сервере, вы можете сгладить пики ЦП и ввода-вывода. BLACKHOLE - это просто файл журнала репликации, поэтому «вставки» в него очень быстрые и легкие для системы.

0 голосов
/ 17 февраля 2012

Трудно сказать без профилирования обоих методов, если вы сначала записываете в файл журнала, вы можете в конечном итоге сделать его еще хуже, если пересчитать количество операций с N на N * 2.Вы получаете небольшое преимущество, записывая все это в файл и выполняя пакетную вставку, но имейте в виду, что по мере заполнения файла журнала время загрузки / записи увеличивается.

Чтобы уменьшить загрузку базы данных, посмотрите на использование memкэш для чтения базы данных, если вы еще этого не сделали.

В целом, хотя вам, вероятно, лучше всего просто попробовать оба и посмотреть, что быстрее.

0 голосов
/ 17 февраля 2012

Я бы вставил сон (1);функция в верхней части вашего сценария PHP, перед каждой вставкой в ​​верхней части цикла, где 1 = 1 секунда.Это позволяет циклу циклически повторяться один раз в секунду.

Таким образом, он будет немного регулировать, насколько сильно загружается процессор, это было бы идеально, если бы вы записывали только небольшое количество записей за каждый прогон.

Подробнее о функции сна вы можете прочитать здесь: http://php.net/manual/en/function.sleep.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...