Mam dużo problemów z nieefektywnością node_save (). Ale czy węzeł zapisuje mój problem? Właśnie tego próbuję się dowiedzieć.
Utworzyłem pętlę ze 100 000 iteracjami. Stworzyłem absolutne minimum, aby obiekt węzła był poprawny i poprawnie zapisany. Oto kod zapisu węzła:
$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);
}
Oto wyniki:
Zapisano 100 000 węzłów, każdy za pomocą node_save (). Wykonanie tego zadania zajęło 5196,22 sekund. To TYLKO 19 oszczędza sekundę.
Mówiąc co najmniej, jest to nie do przyjęcia, szczególnie gdy ta osoba otrzymuje około 1200 pojedynczych zapytań na sekundę , a ta osoba otrzymuje 25 000 wstawek na sekundę .
Co się tu dzieje? Gdzie jest wąskie gardło? Czy jest z funkcją node_save () i jak jest zaprojektowana?
Czy to może być mój sprzęt? Mój sprzęt to serwer programistyczny, nikt na nim poza mną - dwurdzeniowy Intel, 3Ghz, Ubuntu 12.04 z 16 gigabajtami pamięci RAM.
Podczas działania pętli moje użycie zasobów to: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M RAM.
Moja konfiguracja mysql została wykonana przez kreatora Percona .
Mysql mówi, że jeśli użycie procesora spadnie poniżej 70%, mój problem jest związany z dyskiem . To prawda, że mam tylko jeden bieg młyna WD Caviar 7200 RPM, ale mam nadzieję, że powinienem otrzymywać więcej niż 19 płytek na sekundę, mam nadzieję!
Nie tak dawno temu pisałem o oszczędzaniu 30 000 węzłów dziennie . Jednak dla jasności ten węzeł nie ma nic wspólnego z żadnymi siłami zewnętrznymi. Jest to wyłącznie test porównawczy, aby dowiedzieć się, jak zwiększyć szybkość wywołań funkcji node_save ().
Realistycznie muszę co minutę wprowadzać do bazy danych 30 000 elementów za pomocą node_save. Jeśli zapisywanie węzłów nie jest opcją, zastanawiam się, czy mogę napisać własną funkcję API drupal „node_batch_save ()” lub coś, co wykorzystuje zdolność mysql do wykonywania wstawiania zbiorczego za pomocą zapytania INSERT . Myśli, jak do tego podejść?