У меня много проблем с неэффективностью node_save (). Но спасает ли узел мою проблему? В конечном итоге это то, что я пытаюсь выяснить.
Я создал цикл с 100 000 итераций. Я создал минимум для того, чтобы объект узла был действительным и сохранялся правильно. Вот код сохранения узла:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
Вот результаты:
100 000 узлов были сохранены, каждый с помощью node_save (). Это заняло 5196,22 секунды. Это только 19 экономит секунду.
По меньшей мере, это неприемлемо, особенно когда этот человек получает около 1200 отдельных запросов на вставку в секунду , а этот человек получает 25 000 вставок в секунду .
Итак, что здесь происходит? Где узкое место? Это с функцией node_save () и как она разработана?
Может ли это быть мое оборудование? Мое оборудование - это сервер разработки, на котором нет никого, кроме меня - двухъядерный Intel, 3Ghz, Ubuntu 12.04 с 16 гигабайтами оперативной памяти.
В то время как цикл работает, мой ресурс использует: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M RAM.
Моя конфигурация mysql была сделана мастером Percona .
Mysql говорит, что если загрузка моего процессора ниже 70%, моя проблема связана с диском . Конечно, у меня есть только пробег мельницы WD Caviar 7200 об / мин, но я должен получить более 19 вставок в секунду с этим, я надеюсь!
Не так давно я писал о сохранении 30 000 узлов в день . Однако, чтобы было ясно, этот узел не имеет никакого отношения к каким-либо внешним силам. Это просто тест, чтобы узнать, как увеличить скорость вызовов node_save ().
На самом деле мне нужно каждую минуту получать 30 000 элементов в базу данных с помощью node_save. Если сохранение узла не является опцией, мне интересно, могу ли я написать свою собственную API-функцию drupal "node_batch_save ()" или что-то, что использует способность mysql выполнять массовые вставки с помощью запроса INSERT . Мысли о том, как подойти к этому?
источник
Ответы:
Вы никогда не получите 30 000 вставок в минуту, используя node_save. Ни за что.
ВСТАВКА быстрая, потому что это все, что она делает. Узел save выполняет несколько вставок (основная таблица, таблица редакций, таблица для каждого поля), очищает любые кэши объектов и запускает перехватчики. Крючки являются сложной частью. Если у вас есть много модулей contrib (или даже одного, который плохо себя ведет), которые действительно могут снизить производительность, особенно если автор не учел вариант использования «Я экономлю тонну узлов сразу». Например, мне пришлось добавить это в мой класс Migrate:
С другой стороны, если вы напишите пользовательскую функцию сохранения, которая не вызывает хуков, вы подвергаетесь явной опасности получения противоречивых данных в состоянии, неожиданном для системы. Я бы никогда не рекомендовал это делать. Запустите xhprof и посмотрите, что происходит.
источник
node_save()
, но добавляет некоторый код смягчать известные проблемы , которые могут быть вызваны, например Pathauto восстановления кэша меню после каждого узла экономииПрежде всего, установите XCache / APC (для PHP <5.5) и настройте memcached для Drupal.
Затем вы можете оптимизировать конфигурацию MySQL для сложных запросов, используя скрипт mysqltuner, доступный по адресу: http://mysqltuner.pl
Например
Другие предложения:
источник
Используйте модуль Mongodb для хранения полей https://drupal.org/project/mongodb Результаты здесь: согласно http://cyrve.com/mongodb
источник