Neo4j.rb версии 3.0 низкая производительность RoR, более 1024 мс для всех запросов

Ниже приведен драгоценный камень, который я использую

gem 'neo4j', github: 'andreasronge/neo4j

и ниже представлены модель пользователя и друга:

Пользователь.rb

class User 


include Neo4j::ActiveNode

  property :name, :type => String, :index => :exact
  property :mood, :type => String
  property :status, :type => String
  property :dob, :type => DateTime, :index => :exact
  property :uid, :type => String, :index => :exact, :unique => true
  property :username, :type => String
  property :email, :type => String, :index => :exact
  property :gender, :type => String, :index => :exact
  property :remember_token, :type => String, :index => :exact
  property :fb_access_token, :type => String, :index => :exact

  scope :gender_filter, ->(g){ where(gender: g)}

  property :friends_list

  serialize :friends_list

  #before_save :create_remember_token

  validates :email, :uniqueness => true

  has_many :both, :friends,  model_class: User,  rel_class: Friend
  has_many :both, :friend_girls,  model_class: User,  rel_class: Friend_girl
  has_many :both, :friend_boys,  model_class: User,  rel_class: Friend_boy
  has_many :both, :places,  model_class: Location,  rel_class: Place


 private
  def create_remember_token
      self.remember_token = SecureRandom.urlsafe_base64
  end

end

Друг.рб

class Friend 
    include Neo4j::ActiveRel
    property :provider, :type => String

  from_class User
  to_class   User
  type 'friends'

end

Ниже приведены журналы консоли для выполнения запроса:

 CYPHER 1022ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1
 User#friend_boys 1077ms MATCH (user0:`User`), (result:`User`), user0-[rel0:`friend_boys` {_classname: "Friend_boy"}]-(result:`User`) WHERE ID(user0) = 0 RETURN resu
lt LIMIT 8
  Rendered users/_list.html.erb (7425.9ms)
  Rendered users/friends.html.erb within layouts/application (7456.0ms)
  Rendered layouts/_shim.html.erb (1.0ms)
 User#places 1063ms MATCH (user0:`User`), (result:`Location`), user0-[rel0:`places` {_classname: "Place"}]-(result:`Location`) WHERE ID(user0) = 0 RETURN result
  Rendered layouts/_header.html.erb (25855.1ms)
  Rendered layouts/_sidebar.html.erb (3.0ms)
Completed 200 OK in 36067ms (Views: 33981.5ms) 

Но те же отдельные запросы занимают около 350 мс в консоли администратора Neo4j.

Я использую версию neo4j-commnunity 2.1.3.

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

Обновление 1:

Как было предложено, я стер каталог данных и переустановил neo4j-community (2.1.3), но ничего не изменилось, производительность по-прежнему была низкой, поэтому я решил установить новую версию neo4j-community (2.1.5), сохранив существующий каталог данных. -место, опять те же результаты. Затем я удалил каталог данных и снова установил neo4j-community (2.1.5), на этот раз я получил лучшую производительность для некоторых запросов в моем приложении rails по сравнению с более чем 1000 мс для всех запросов в моей предыдущей настройке.

Ниже приведены журналы:

Экземпляр 1:

 CYPHER 2025ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}

 CYPHER 16ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>171, :result_email=>"[email protected]"}

Пример 2:

 CYPHER 15ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}

 User#friend_girls 25ms MATCH (user171:`User`), (result:`User`), user171-[rel0:`friend_girls`]-(result:`User`) WHERE ID(user171) = {ID_user171_} RETURN result LIMIT 8 | {:ID_user171_=>171}

В экземпляре 1:

Как вы можете видеть, для второго запроса потребовалось всего 16 мс по сравнению с моими предыдущими попытками настройки, которые всегда занимали более 1000 мс.

Но для первого запроса производительность слишком низкая, более 2 секунд.

В экземпляре 2:

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

В экземпляре 3:

 CYPHER 1033ms MATCH (n:`Location`) WHERE n.address = {n_address} RETURN n LIMIT 1 | {:n_address=>"Vijayanagar, Karnataka, India"}

 CYPHER 14ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}

 CYPHER 90ms START start = node(171), end = node(173) CREATE start-[rel0:`places` {_classname: "Place"}]->end

 CYPHER 16ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>171, :result_email=>"[email protected]"}

 User#places 59ms MATCH (user171:`User`), (result:`Location`), user171-[rel0:`places`]-(result:`Location`) WHERE ID(user171) = {ID_user171_} RETURN count(result) AS count | {:ID_user171_=>171}

 User#places 14ms MATCH (user171:`User`), (result:`Location`), user171-[rel0:`places`]-(result:`Location`) WHERE ID(user171) = {ID_user171_} RETURN result | {:ID_user171_=>171}

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

Обновление 2:

Ниже лог после bundle update

Started GET "/" for 127.0.0.1 at 2014-10-28 08:14:26 +0530
Processing by StaticPagesController#home as HTML
 CYPHER 1030ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
  Rendered users/_default_pic.html.erb (3.0ms)
  Rendered users/_pics_grid.html.erb (4.0ms)
 User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN count(result) AS c
ount | {:ID_user184_=>184}
  Rendered users/_places.html.erb (17.0ms)
  Rendered users/_my_badges.html.erb (1.0ms)
  Rendered users/_profile_pics.html.erb (0.0ms)
  Rendered users/_show.html.erb (200.1ms)
  Rendered static_pages/home.html.erb within layouts/application (204.2ms)
  Rendered layouts/_shim.html.erb (0.0ms)
 User#places 0ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN result | {:ID_user
184_=>184}
  Rendered layouts/_header.html.erb (499.6ms)
  Rendered layouts/_sidebar.html.erb (3.0ms)
Completed 200 OK in 2100ms (Views: 1064.7ms)


Started GET "/" for 127.0.0.1 at 2014-10-28 08:14:35 +0530
Processing by StaticPagesController#home as HTML
 CYPHER 2036ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
  Rendered users/_default_pic.html.erb (2.0ms)
  Rendered users/_pics_grid.html.erb (0.0ms)
 User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN count(result) AS c
ount | {:ID_user184_=>184}
  Rendered users/_places.html.erb (14.0ms)
  Rendered users/_my_badges.html.erb (0.0ms)
  Rendered users/_profile_pics.html.erb (17.9ms)
  Rendered users/_show.html.erb (221.0ms)
  Rendered static_pages/home.html.erb within layouts/application (226.1ms)
  Rendered layouts/_shim.html.erb (0.0ms)
 User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN result | {:ID_user
184_=>184}
  Rendered layouts/_header.html.erb (474.4ms)
  Rendered layouts/_sidebar.html.erb (1.0ms)
Completed 200 OK in 3094ms (Views: 1053.2ms)


Started GET "/assets/xeditable/img/loading.gif" for 127.0.0.1 at 2014-10-28 08:15:57 +0530


Started POST "/users/de30de56-7898-4d6b-8be4-c18a0c4915d6/update_status" for 127.0.0.1 at 2014-10-28 08:16:15 +0530
Processing by UsersController#update_status as JSON
  Parameters: {"name"=>"xe_status", "value"=>"i am doing good", "pk"=>"1", "id"=>"de30de56-7898-4d6b-8be4-c18a0c4915d6"}
 CYPHER 1016ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
 CYPHER 26ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>184, :re
sult_email=>"[email protected]"}
Completed 200 OK in 1305ms (Views: 1.0ms)

Gemfile

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.2'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

gem "will_paginate"

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data'

gem 'omniauth-facebook'
gem "geocoder"
gem 'rails4-autocomplete'
gem "font-awesome-rails"
gem 'koala'
gem 'newrelic_rpm'
gem 'jquery-turbolinks'


group :production do
    gem 'rails_12factor'
end

gem 'jquery-ui-rails'

gem "string-urlize"  # for making the title the primary key and work as an URL, see Neo4j.rb id_property

platforms :jruby do
  gem 'neo4j-community', '~> 2.0.0'
end

gem 'sidekiq'
gem 'sinatra', require: false
gem 'slim'

gem 'neo4j'

gem 'cloudinary'

group :development do
  gem 'spring'
  gem 'os'
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'meta_request'
  gem 'debugger'
  gem 'foreman'
end

Ruby version is 2.0.0 and Rails version is 4.0.2


person achalbi    schedule 18.10.2014    source источник
comment
Что-то здесь очень не так. Где находится ваша база данных? Это местное?   -  person subvertallchris    schedule 18.10.2014
comment
Вы также можете использовать текущую основную ветку в Github. На днях я выдвинул исправление, которое удаляет свойства {_classname} из каждого запроса ActiveRel, но мы еще не выпустили новую версию для Rubygems.   -  person subvertallchris    schedule 18.10.2014
comment
Да, это локальная база данных (сервер Neo4j). Должен ли я протестировать его с помощью Enterprise Edition? Прямо сейчас использую Community Edition.   -  person achalbi    schedule 18.10.2014
comment
Это не имеет значения, я использую Community для всего. Вы пробовали перезапустить сервер? У вас есть действительно значительный объем данных, хранящихся в свойствах? Я не могу придумать ничего, что могло бы привести к такой производительности.   -  person subvertallchris    schedule 18.10.2014
comment
Я работал над этим проектом несколько месяцев и много раз перезапускал сервер, но производительность никогда не была лучше. Я попробовал встроенную базу данных с той же производительностью.   -  person achalbi    schedule 18.10.2014
comment
У меня всего 3 пользователя и мало отношений. Я пробовал и на других машинах, обычный узел «Пользователь», который не имеет большого количества данных, хранящихся в свойствах, занимает около 300 мс, если получить бит по идентификатору.   -  person achalbi    schedule 18.10.2014
comment
Я также попробовал демонстрационное приложение 'Movie Graph' sql, которое поставляется с инструментом браузера neo4j для приведенного ниже запроса, который занимает около 3000 мс - 'MATCH (tom {name: Tom Hanks}) RETURN tom'. я думаю, что 3 секунды слишком много. действительно запутался, и любая помощь будет принята с благодарностью, спасибо.   -  person achalbi    schedule 18.10.2014
comment
Наверняка проблема с вашим сервером. Я бы выключил его, стер каталог данных и снова запустил. Может что-то не так с вашими индексами?   -  person subvertallchris    schedule 18.10.2014
comment
Мне не хватает какой-либо конфигурации, поскольку я пробовал на двух машинах, и обе показывают одинаковые характеристики. Также я должен сделать что-то еще для индексации, кроме добавления ':index =›:exact'.   -  person achalbi    schedule 18.10.2014
comment
Нет, так пойдет. Если у вас очень простая модель, всего одно свойство, никаких проверок, и вы сохраняете/загружаете этот один узел, она все еще медленная? Я внес изменение в поведение Unique, которое улучшило его производительность, но вы должны заметить это только на большом графике. Он еще не выпущен, но находится в мастере.   -  person subvertallchris    schedule 18.10.2014
comment
Вам когда-нибудь везло с этим?   -  person subvertallchris    schedule 25.10.2014
comment
Я обновил вопрос своим последним наблюдением, теперь проблема заключается в низкой производительности для 1-го запроса в каждом запросе, спасибо.   -  person achalbi    schedule 25.10.2014
comment
Это первый запрос на каждой странице или только первый запрос после запуска Rails? Первый запрос после запуска Rails будет медленным, потому что он устанавливает сеанс. При загрузке каждой модели она проверяет индексы этих моделей, поэтому первый запрос в сеансе, приводящий к загрузке модели, также будет медленным. Вы можете обойти это, просто вызывая имя каждой модели в инициализаторе, это просто заставит Rails запускаться немного медленнее.   -  person subvertallchris    schedule 25.10.2014
comment
Да, на каждой странице/запросе, а не на модели   -  person achalbi    schedule 25.10.2014
comment
Можете ли вы показать, как выглядят эти фрагменты?   -  person subvertallchris    schedule 25.10.2014
comment
Также сделайте bundle update neo4j, вчера мы выпустили новую версию с множеством исправлений производительности. Ничего, что могло бы объяснить это, я не думаю, но это может только помочь.   -  person subvertallchris    schedule 25.10.2014
comment
А как насчет вашего гемфайла? Системные ресурсы на вашем компьютере? Никто никогда не сообщал об этом, поэтому я действительно думаю, что это как-то связано с вашей установкой, нам просто нужно выяснить, что.   -  person subvertallchris    schedule 25.10.2014
comment
Эй, спасибо за обновление, после выполнения bundle update оно решило нашу первоначальную проблему более 1000 мс для всех запросов на всех наших машинах. Но проблема более 1000 мс для первого запроса в каждом запросе все еще существует. см. обновление 2 для журналов. Я также обновил свой gemfile, спасибо.   -  person achalbi    schedule 28.10.2014
comment
Думаю, это небольшой прогресс. Не могли бы вы попробовать переключиться на Ruby 2.1, а затем на bundle update?   -  person subvertallchris    schedule 28.10.2014
comment
Еще одна вещь, которую вы упомянули на всех наших машинах, так что эта проблема возникает более чем на одной машине? Если вы войдете в rails c и выполните User.find_by(remember_token: 'xqbwLZFzaULDZUKihEql5Q'), сколько времени пройдет после первого запроса, который устанавливает сеанс с базой данных?   -  person subvertallchris    schedule 28.10.2014
comment
да, мы тестируем на трех машинах, на всех установлена ​​ОС Windows. Я также тестировал ruby ​​2.1.3 и rails 4.1.6, но результаты те же.   -  person achalbi    schedule 28.10.2014
comment
Время выполнения команды Benchmark.ms { User.find_by(remember_token: 'xqbwLZFzaULDZUKihEql5Q') } в rails c заняло более 2000 мс.   -  person achalbi    schedule 28.10.2014
comment
Хм... Можешь попробовать добавить это в свой Gemfile? gem 'neo4j-core', git: '[email protected]:neo4jrb/neo4j-core.git', branch: 'debug-slow-connections'. Затем пакетная установка, конечно. Это меняет способ обработки соединения. Интересно, есть ли проблема с адаптером, который мы использовали, и с Windows.   -  person subvertallchris    schedule 28.10.2014
comment
Это ошибка, которую я получил после обновления моего gemfile и запуска bundle install Fetching [email protected]:neo4jrb/neo4j-core.git Warning: Permanently added the RSA host key for IP address '192.30.252.129' to t he list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. Retrying git clone "[email protected]:neo4jrb/neo4j-core.git" "C:/Ruby21-x64/lib/ruby/gems/2.1.0/cache/bundler/git/neo4j-core-71e20a094252d6e746dff80816a9edad56f9aeca" --bare --no-hardlinks   -  person achalbi    schedule 28.10.2014
comment
Попробуйте gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'debug-slow-connections'   -  person subvertallchris    schedule 28.10.2014
comment
Теперь все запросы превышают 1000 мс.   -  person achalbi    schedule 28.10.2014
comment
Что ж, это интересно. Есть ли шанс, что у вас есть доступ к Linux или Mac, и вы могли бы протестировать свое приложение там? Мне потребуется некоторое время, чтобы установить Ruby и все остальное на мою машину с Windows.   -  person subvertallchris    schedule 28.10.2014
comment
У нас нет эксклюзивных машин Linux или Mac, но мы попробуем с виртуальной настройкой, спасибо.   -  person achalbi    schedule 28.10.2014
comment
Вы, ребята, когда-нибудь устанавливали эту настройку на машине с Linux, чтобы увидеть, была ли производительность лучше?   -  person subvertallchris    schedule 06.11.2014
comment
Не стесняйтесь обращаться ко мне, контактная информация есть в моем профиле, если хотите. Я являюсь одним из сопровождающих драгоценного камня Neo4j на случай, если он еще не установлен.   -  person subvertallchris    schedule 06.11.2014
comment
Спасибо, но мы не смогли выполнить локальную установку на Linux-машине. Однако мы попробовали это в онлайн-IDE (cloud9 IDE — на основе Ubuntu), подключившись к базе данных графена. Здесь мы по-прежнему получаем 200 мс - 500 мс на все запросы. Кроме того, мы не можем развернуть наш проект в Heroku, поэтому мы подняли вопрос heroku-run-rails-console-starts-webrick-instead-of-irb, я не знаю, имеет ли это какое-либо отношение к конфигурации neo4j.   -  person achalbi    schedule 06.11.2014
comment
Действительно похоже, что с приложением что-то не так. Меня не будет в городе с завтрашнего дня до понедельника, но я с удовольствием взгляну на него, если хочешь. Просто пришлите мне письмо, контактная информация есть в моем профиле.   -  person subvertallchris    schedule 06.11.2014