медленный пост-запрос RoR - PullRequest
1 голос
/ 30 марта 2012

У меня проблема с медленным пост-запросом в приложении RoR.Проект представляет собой распределенную систему, в которую клиент отправляет много фотографий, а сервер сохраняет их в БД.Я использую MySql server 5.1, и клиент, и сервер находятся в одной локальной сети, и они программируют в RoR .... клиент отправляет 10 фотографий в одном запросе.10 фотографий отправляются в виде массива в формате yaml.запрос:

res = Net::HTTP.post_form(uri, :mac => 'String', :value => 'Yaml_array_images_data', :num => 10)

и в журнале написано:

`Started POST "/events/save_photo" for 192.168.0.113 at 2012-03-30 09:45:10 +0200
  Processing by EventsController#save_photo as */*
  Parameters: {"data_type"=>"image", "value"=>"--- \n- !binary |\n  /9j/2wCEAAoH
BwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYI...", "created_at"=>"--- \n- 2012-03-30 09:26:29 +02:00 \n-....", "mac"=>"00606E91E5D2"}
(0.3ms)  SET PROFILING=1
  Device Load (1.2ms)  SELECT SQL_NO_CACHE `devices`.* FROM `devices` 
WHERE `devices`.`mac` = '00606E91E51E' LIMIT 1
  CACHE (0.0ms)  SELECT `devices`.* FROM `devices` WHERE `devices`.
`mac` = '00606E91E51E' LIMIT 1
   (0.3ms)  BEGIN
  SQL (2.9ms)  INSERT INTO `multimedia` (`created_at`, `data`, `eve
nt_id`, `updated_at`) VALUES ('2012-03-30 07:45:00', x'f22b19237b63f1c8c40da49ae
5eb68969dd3cf28193ba6a3704fe2f286494439eea4f9071bb6ef9de530ccaaab235a402e2d94aad
2f4f1b90df022c23078f543bc6ca1c6fe8b17af45eae865bb....)
(0.3ms)  SET PROFILING=1
  Device Load (1.2ms)  SELECT SQL_NO_CACHE `devices`.* FROM `devices` 
WHERE `devices`.`mac` = '00606E91E51E' LIMIT 1
  CACHE (0.0ms)  SELECT `devices`.* FROM `devices` WHERE `devices`.
`mac` = '00606E91E51E' LIMIT 1
   (0.3ms)  BEGIN
  SQL (2.9ms)  INSERT INTO `multimedia` (`created_at`, `data`, `eve
nt_id`, `updated_at`) VALUES ('2012-03-30 07:45:00', x'f22b19237b63f1c8c40da49ae
5eb68969dd3cf28193ba6a3704fe2f286494439eea4f9071bb6ef9de530ccaaab235a402e2d94aad
2f4f1b90df022c23078f543bc6ca1c6fe8b17af45eae865bb...)
(44.0ms)  COMMIT
   (0.3ms)  BEGIN
  SQL (0.8ms)  INSERT INTO `events` (`created_at`, `data_type`, `devic
e_id`, `element_id`, `multimedia_id`, `name`, `status`, `updated_at`, `value`) V
ALUES ('2012-03-30 07:45:00', 'image', 19, 413397, 1066303, 'photo', NULL, '2012
-03-30 07:45:11', '--- 0\n...\n')
   (38.2ms)  COMMIT
   (0.3ms)  BEGIN
  SQL (2.9ms)  INSERT INTO `multimedia` (`created_at`, `data`, `eve
nt_id`, `updated_at`) VALUES ('2012-03-30 07:45:01', x'f22b19237b63f1c8c40da49ae
5eb68969dd3cf28193ba6a3704fe2f28...)
....
for 10 times insert a record in multimedia and one in events table
...
(33.0ms)  COMMIT
   (0.3ms)  BEGIN
   (0.4ms)  SET PROFILING=1
   (1.3ms)  SELECT SQL_NO_CACHE 1 FROM `devices` WHERE (`devices`.`mac
` = BINARY '00606E91E51E' AND `devices`.`id` != 19) LIMIT 1
   (0.7ms)  UPDATE `devices` SET `elem_photo_id` = 413408, `updated
_at` = '2012-03-30 07:45:12' WHERE `devices`.`id` = 19
   (34.5ms)  COMMIT
Rendered events/save_photo.html.erb (0.2ms)
Completed 200 OK in 1957ms (Views: 10.2ms | ActiveRecord: 1466.6ms)`

Моя первая проблема - это разница по общему времени и сумме между временем просмотра и временем активной записи.

После этого это время заносится в журнал сервера, поэтому это время выполнения запроса.Если я возьму время в клиенте от отправки запроса до получения ответа, то это 3,6 секунды!Зачем?Я не думаю, что в локальной сети требуется 2 секунды для передачи 200k!

1 Ответ

1 голос
/ 30 марта 2012

между запросом отправки клиента и ответом отправки сервера происходит много вещей

чтобы назвать несколько:

  1. клиент разрешает днс (обычно это кешируется)
  2. клиент инициирует http-соединение
  3. клиент фактически публикует данные
  4. любой сервер, который у вас есть, принимает пост-запрос и ставит его в очередь для обработки вашим стеком rails
  5. запрос проходит через все промежуточное ПО стойки, которое у вас есть до того, как вы по-настоящему нажмете свой контроллер
  6. ваш запрос обрабатывается контроллером и генерируется ответ
  7. ответ затем передается клиенту и браузеру, анализирует и отображает его

то, что вы видите в журналах вашего сервера, вероятно, только пункт 6, все остальное зависит от настроек вашего приложения и свойств вашего ответа (HTML с большим количеством CSS, JavaScript, изображений и т. Д.)

относительно вашей проблемы с разницей во времени в этой строке:

Completed 200 OK in 1957ms (Views: 10.2ms | ActiveRecord: 1466.6ms)

подробное потребление времени (в скобках) не полностью детализировано. ему не хватает времени GC (которое, вероятно, было вызвано, если вы отправляете файлы в виде параметров в формате yaml), также не хватает времени, затраченного на фильтры до и на само действие.

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