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>