Zend Framework 2 Доктрина MongoDB ODM и Apache работают слишком медленно

У нас возникают странные проблемы с производительностью:

Мы точно знаем, что это не проблема с БД (пробовал с реальным экземпляром MongoDB, все тот же результат).


Мы определили объекты, которые работают с Doctrine ODM таким образом:

<?php

namespace CatalogueManager\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;

/*
* @ODM\Document(repositoryClass="CatalogueManager\Repository\ProductRepository")
*/
class Item
{
/** @ODM\Id */
protected $id;

/** @ODM\String */
protected $name;

/** @ODM\Timestamp */
protected $created;

/** @ODM\Timestamp */
protected $updated;

// ---------------------------------------------------------------------- //

/**
* Return properties as an array. Helper method to assist with converting
* doctrine objects to arrays so we can return front-end api calls as json.
*
* Required as currently Doctrine ODM do not support array hydration of
* referenced documents.
*
* @access public
* @return array
*
*/
public function toArray()
{
$arr = ['id'          => $this->id,
'name'        => $this->name,
'urlSlug'     => $this->urlSlug,
'desc'        => $this->desc,
'metaData'    => $this->metadata,
'category'    => $this->category,
'brand'       => $this->brand,
'assets'      => $this->assets,
'shipping'    => $this->shipping,
'specs'       => $this->specs,
'attrs'       => $this->attrs,
'optionTypes' => $this->optionTypes
];

return $arr;
}

// ---------------------------------------------------------------------- //

/**
* Getter
*
* @access public
* @return string
*
*/
public function getId()
{
return $this->id;
}

/**
* Getter
*
* @access public
* @return string
*
*/
public function getName()
{
return $this->name;
}

// ---------------------------------------------------------------------- //

/**
* Setter
*
* @param string $value Property value
*
* @access public
* @return void
*
*/
public function setName($value)
{
$this->name = $value;
}

}

Мы используем их для импорта ок. 100 продуктов в базу данных продуктов. Все это занимает около 5 секунд на реальной машине, но при попытке на виртуальная машина, это занимает ок. 25 секунд сделать то же самое.

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

Любой совет будет оценен …


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

Доступны данные Webgrind (скриншот): https://www.dropbox.com/s/jjlg7ano6epy6t1/webgrind.png?dl=0

1

Решение

Посмотрев на некоторые скриншоты данных XDebug, я думаю, что вы просто неправильно используете ORM / ODM, поскольку вы выполняете пакетную обработку результатов> 13K.

Правильное решение для такого рода операций объясняется в http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html

То, что происходит, очень просто:
— ODM загружает одну запись из БД
— ODM сохраняет эту запись в UnitOfWork
— при сбросе ODM перебирает все записи в UnitOfWork, ищу измененные документы / юридические лица

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

Вам следует позвонить ObjectManager#clear() между партиями обрабатываемых кусков.

2

Другие решения

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

Вещи, которые могут быть полезны:

  1. Вы можете сделать так, чтобы у вашей виртуальной машины было больше памяти, добавив это в ваш бродячий файл

config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", "1024"] end

  1. Также используйте модуль zf2 ZendDeveloperTools, который покажет вам, в какое время ваши запросы, маршрутизация, дБ-запросы (это работает с доктриной), а какие нет. И вы можете точно определить, что работает медленно.

И просто примечание. Почему вы запускаете php 5.5 на 12.04, а не на 14.04 (это более правдоподобно, но не так точно). Это проще настроить.

1

По вопросам рекламы [email protected]