slow post request RoR

给你一囗甜甜゛ 提交于 2020-01-05 04:21:28

问题


I've a problem with a slow post request in a RoR app. the project is a distribuited system wher the client send a lot of photos and the server save those in DB. I use MySql server 5.1, both client and the server are in the same local network and they are programmer in RoR.... the client send 10 photo in a single request. the 10 photos are send in an array structure in yaml format. the request is:

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

and the log says:

`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)`

My first problem is the difference by total time and the sum between views time and activerecord time.

After that this times are in the log of the server, so those are the execution time of the request. If I take the time, in the client, from send request to receive respond, it's 3,6 seconds! Why? I don't think that in local network are needed 2 second to transfer 200k!


回答1:


there's a lot of things happening between client sending request and server sending response

to name a few:

  1. client resolves dns(usually it's cached)
  2. client initiates http connection
  3. client actually posts the data
  4. whatever server you have there accepts post request and enqueues it to be processed by your rails stack
  5. request goes through all the rack middlewares you have before actually hitting your controller
  6. your request is processed by controller and response is generated
  7. response is then transferred to client and browser parses and renders it

what you see in your server logs is probably only point 6, everything else depends on your app setup and properties of your response(html with lots of css, javascripts, images, etc)

regarding your problem with time differences in this line:

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

detailed time consumption(in parenthesis) is not entirely detailed. it is missing GC time(which probably was invoked if you send files as yaml-formatted parameters), it is also missing time spent in your before filters and action itself.



来源:https://stackoverflow.com/questions/9943295/slow-post-request-ror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!