1/17/2008

Thin :有可能超越 Mongrel 的 App Server

介紹

在Zed Shaw 離開了 Mongrel 之後,每個使用者人心惶惶,不知道 Rails 的 App Server 會不會出大問題。這時候,彷彿在跟 Zed 說「Rails 社群不會被打敗」,Thin 出現了。

Thin 是一個 Mashup App Server ,採用了作者認為 Ruby 當中數一數二好的 Lib
  • Mongrel Parser:Mongrel 速度跟安全性的根本
  • Events Machine:快速,穩定的 Network IO Lib
  • Rack:Webserver 跟 Ruby 之間的 Interface
這幾個強大的 Lib,整合在一起分工合作,讓 Thin 成為安全,穩定,快速,好擴充的 Web Server。

當然,快速是他第一個優點。在他的測試中, Thin 超越了 Mongrel 跟 Event-Driven Mongrel。
JavaEye 網友的測試也發現,不論是 Ruby 1.8 ,Ruby 1.9,Thin 的速度也是超越 Mongrel 。Ruby 1.9 裡面 req/s 居然是 4154 : 1313 的可怕差距
Mongrel 1000 100 1313.19 0
Thin 1000 100 4154.67 0

安裝方式

用 gem 安裝即可
gem i thin
要執行 thin ,就是在 Rails 的根目錄下執行
thin start
可惜沒有 Cluster 版本,不過,對岸網友已經寫了一個應急的 rake file,只可惜沒有指定 Port 的 command,所以我稍微修改一下成為這樣
namespace :thin do

namespace :cluster do

desc 'Start thin cluster'
task :start => :environment do
`cd #{RAILS_ROOT}`
(ENV['SIZE'] ? ENV['SIZE'].to_i : 4).times do |i|
Thread.new do
port = ENV['PORT'].to_i + 1
str = "thin start -d -p#{port} -Ptmp/pids/thin-#{port}.pid"
str += " -e#{RAILS_ENV}"
puts "Starting server on port #{port}..."
`#{str}`
end
end
end

desc 'Stop thin cluster'
task :stop => :environment do
`cd #{RAILS_ROOT}`
Dir.new("#{RAILS_ROOT}/tmp/pids").each do |file|
Thread.new do
if file.starts_with?("thin-#{port_range}")
str = "thin stop -Ptmp/pids/#{file}"
puts "Stopping server on port #{file[/\d+/]}..."
`#{str}`
end
end
end
end

end
end
將這個東西貼在 Rails 根目錄的 Rakefile ,將它貼在最後面,然後執行下面指令啟動
rake thin:cluster:start RAILS_ENV=production SIZE=10 PORT=4000
灰色的代表可以自己填寫的選項,包含 Rails 啟動的 enviroment,執行幾個 thin ,還有從哪個 Port 開始 listen。有用過 mongrel_cluster 應該都很清楚。停止就是
rake thin:cluster:stop
他會砍掉 tmp/pids/thin- 開頭的 pid file。

5 則留言:

Lin Jen-Shin (godfat) 提到...
作者已經移除這則留言。
thegiive 提到...

哪裡有 -s ? 這是我的 mac 下面的 thin

>thin
Command required
Usage: thin [options] start|stop

Server options:
-o, --host HOST listen on HOST (default: 0.0.0.0)
-p, --port PORT use PORT (default: 3000)
-e, --env ENV Rails environment (default: development)
-c, --chdir PATH listen on HOST (default: current dir)
-d, --daemonize Daemonize
-l, --log-file FILE File to redirect output
(default: log/thin.log)
-P, --pid-file FILE File to store PID
(default: tmp/pids/thin.pid)
-t, --timeout SEC Request or command timeout in sec
(default: 60)
-u, --user NAME User to run daemon as (use with -g)
-g, --group NAME Group to run daemon as (use with -u)

Common options:
-h, --help Show this message
-v, --version Show version

匿名 提到...

剛剛看了一下,在windows下的0.5.2版是有-s這個參數
-s,
--servers NUM

Number of servers to start
set a value >1 to start a cluster

Lin Jen-Shin (godfat) 提到...
作者已經移除這則留言。
Kai Chen 提到...

今天忽然发现自己是对岸网友,呵呵。。。

共同学习。。。