This project is archived and is in readonly mode.
Rails Metal with ActiveRecord, Too slow
Reported by Diegorv | February 5th, 2009 @ 12:42 PM | in 2.x
Rails Metal, work too slow, when use AR.
Tests running in a Imac 2.6ghz - 4gb ram, with the last version of rails 2.3 in production environment working with Mysql(pool: 5)
I'm trying a simple example with metal and activerecord.
inside: app/metal/poller.rb
# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
class Poller
def self.call(env)
if env["PATH_INFO"] =~ /^\/poller/
@post = Post.find(1)
[200, {"Content-Type" => "text/html"}, @post.title]
else
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
end
end
end
When i try in console: ab -n 100 -c 5 http://127.0.0.1:3000/poller
Results are too slow, take a look:
Benchmarking 127.0.0.1 (be patient).....done
Server Software:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /poller
Document Length: 19 bytes
Concurrency Level: 5
Time taken for tests: 100.113 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 11900 bytes
HTML transferred: 1900 bytes
Requests per second: 1.00 #/sec
Time per request: 5005.638 [ms] (mean)
Time per request: 1001.128 [ms] (mean, across all concurrent requests)
Transfer rate: 0.12 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 3 4905 703.8 5005 5009
Waiting: 2 4904 703.7 5004 5007
Total: 4 4906 703.7 5005 5009
Percentage of the requests served within a certain time (ms)
50% 5005
66% 5006
75% 5006
80% 5006
90% 5006
95% 5007
98% 5008
99% 5009
100% 5009 (longest request)
When i try with a controller way:
class TesteController < ApplicationController
def index
@post = Post.find(1)
render :text => @post.title
end
end
And i run: ab -n 100 -c 5 http://127.0.0.1:3000/teste
Results are more fast than in metal, much more:
Benchmarking 127.0.0.1 (be patient).....done
Server Software:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /teste
Document Length: 19 bytes
Concurrency Level: 5
Time taken for tests: 0.210 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 26200 bytes
HTML transferred: 1900 bytes
Requests per second: 476.65 #/sec
Time per request: 10.490 [ms] (mean)
Time per request: 2.098 [ms] (mean, across all concurrent requests)
Transfer rate: 121.96 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 5 10 1.2 10 16
Waiting: 5 10 1.2 10 16
Total: 6 10 1.2 10 16
Percentage of the requests served within a certain time (ms)
50% 10
66% 10
75% 10
80% 10
90% 11
95% 14
98% 14
99% 16
100% 16 (longest request)
-diegorv:~ diegorv$
I don't know if is expected, but i think its a problem.
I can think in:
- Mysql pools problem
- Metal needs load AR libs in each find()
- Metal open 1 connection for request, which cause too many conections
Other tests:
Rails metal, 1 request - 1 concurrency
ab -n 1 -c 1 http://127.0.0.1:3000/poller
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /poller
Document Length: 19 bytes
Concurrency Level: 1
Time taken for tests: 0.001 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 119 bytes
HTML transferred: 19 bytes
Requests per second: 746.83 [#/sec] (mean)
Time per request: 1.339 [ms] (mean)
Time per request: 1.339 [ms] (mean, across all concurrent requests)
Transfer rate: 86.79 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 1 1 0.0 1 1
Waiting: 1 1 0.0 1 1
Total: 1 1 0.0 1 1
Controller, 1 request - 1 concurrency
ab -n 1 -c 1 http://127.0.0.1:3000/teste
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /teste
Document Length: 19 bytes
Concurrency Level: 1
Time taken for tests: 0.003 seconds
Complete requests: 1
Failed requests: 0
Write errors: 0
Total transferred: 262 bytes
HTML transferred: 19 bytes
Requests per second: 367.51 [#/sec] (mean)
Time per request: 2.721 [ms] (mean)
Time per request: 2.721 [ms] (mean, across all concurrent requests)
Transfer rate: 94.03 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 3 3 0.0 3 3
Waiting: 3 3 0.0 3 3
Total: 3 3 0.0 3 3
script/about
About your application's environment
Ruby version 1.8.6 (universal-darwin9.0)
RubyGems version 1.3.1
Rails version 2.3.0
Active Record version 2.3.0
Action Pack version 2.3.0
Active Resource version 2.3.0
Action Mailer version 2.3.0
Active Support version 2.3.0
Application root /Users/diegorv/rails/2.3/metal
Environment development
Database adapter mysql
Database schema version 20090205122220
Comments and changes to this ticket
-
josh February 5th, 2009 @ 09:32 PM
- State changed from new to wontfix
Looks like your connection pool deadlocked. Make sure you check in your connections after you are done.
ActiveRecord::Base.clear_active_connections!
-
af001 May 5th, 2011 @ 02:55 AM
- Importance changed from to
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>