2012-03-30 2 views
1

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

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

Моя первая проблема заключается разница по общему времени и сумма между видами времени и времени ActiveRecord.

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

+0

http://stackoverflow.com/questions/10103476/http-post-time-different-by-activerecord-and-view-time#comment12943299_10103476 кто-то может мне помочь? – Dabidi

ответ

1

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

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

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

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

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

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

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

+0

mmmm .... ok .... я полагаю, что ..... но я бы установил даже о моем sqtup ... но я не знаю, где я ищу. Существует ли руководство по этому поводу? например, я не заинтересован в DNS ..... – Dabidi

+0

все зависит от того, какой http-сервер вы используете (nginx/apache/etc), что служит вашему рельсовому приложению (единорог/тонкий/пассажир/и т. Д.), Какие средние у вас есть «rake middleware».и в вашем приложении я думаю, что самый простой способ - просто записывать временные метки во всем мире и видеть, где потрачено время. или вы можете использовать perftools.rb gem для фактического профилирования своего приложения. – keymone

+0

я использую apache2 сервер, пассажир и команду грабли промежуточной вернуть мне: использование ActionDispatch :: Статической использования Rack :: Замок использование # использование Rack :: Продолжительность использование Rack :: MethodOverride использование Rails :: Rack :: Logger использование ActionDispatch :: ShowExceptions использование ActionDispatch :: RemoteIp использование Rack :: SendFile использование ActionDispatch :: Reloader использование ActionDispatch :: Callbacks использование ActiveRecord :: ConnectionAdapters :: ConnectionManagement использовать ActiveRecord :: QueryCache использовать ActionDispatch :: Cookies использования ActionDispatch :: Session :: CookieStore – Dabidi