puma(5300✨) Rails的一個多線程,高併發處理的web server

https://github.com/puma/puma

 

在開發和產品環境下,Puma是一個簡單,快速,多線程,並高併發highly concurrent HTTP1.1server for Ruby/Rack程序。git

 


什麼是多線程? multithreadinggithub

指從軟件或者硬件上實現多個線程併發執行的技術。從而總體提高處理效能。 ruby

軟件多線程:即便處理器只能運行一個線程,但操做系統能夠經過快速在不一樣線程之間進行切換,因爲間隔時間很小,給用戶形成一種多個線程同時運行的假象。這樣的程序運行機制被稱爲軟件多線程。服務器

 

多任務能夠由多進程完成,也能夠由一個進程內的多線程完成。多線程

進程是由若干線程組成的,一個進程至少有一個線程。併發

 

單進程單線程:一我的在一個桌子上吃菜;app

單進程多線程:多我的在一個桌子上吃菜;容易發生爭搶,即資源共享就會發生衝突爭搶。socket

多進程單線程:多我的在各自的桌子上吃菜; tcp


 

 

gem 'puma', '~> 3.11' svg

gem 'mina-puma', '~> 1.1.0', require: false 

 

⚠️require: false的選項是什麼用途?

答案:具體見:stackoverflow 

把這個gem安裝了,但不加載load。 你bundler時,不會調用require 'mina-puma'命令。何時須要用到這個library,手動加載這個命令。

通常是不但願這個gem加載到全部進程中,只在特定的時候使用。能夠節省主程序的內存和減小startup 時間。 

 


 

Rails 

 

Puma是Rails的默認server,已經安裝在gemfile中了。

使用rails s會開啓你的服務器:

=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown : 2018-06-28 11:08:46 +0800 ===
- Goodbye!
Exiting

 

可是用rails s不能進行額外的options的配置,可使用$ bundle exec puma 代替 :

Puma starting in single mode...
* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:9292
Use Ctrl-C to stop
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2018-06-28 11:07:10 +0800 ===
- Goodbye!

 

具體配置選擇看puma -h ,詳細講解見git 

部分講解見下:


Configuration

全部配置能夠在config/puma.rb中設置。

例子,若是環境是產品環境則:配置以下信息:

if ENV['RAILS_ENV'] == 'production'
  app_root = '/data/www/myapp/shared'
  pidfile "#{app_root}/tmp/pids/puma.pid"
  state_path "#{app_root}/tmp/pids/puma.state"
  bind "unix://#{app_root}/tmp/sockets/puma.sock"
  activate_control_app "unix://#{app_root}/tmp/sockets/pumactl.sock"
  daemonize true
  workers 2 在clustered模式 設置多進程數
  threads 8, 16 設置最小/大線程數
  preload_app! 預加載全部程序代碼來forking, 做用是下降總內存的使用。
  stdout_redirect "#{app_root}/log/puma_access.log", "#{app_root}/log/puma_error.log", true
  on_worker_boot do
    ActiveSupport.on_load(:active_record) do
      ActiveRecord::Base.establish_connection
    end
  end
  before_fork do
    ActiveRecord::Base.connection_pool.disconnect!
  end
else
  plugin :tmp_restart
end


Thread Pool

Puma 使用一個線程池子。你能夠設置這個池子最小和最大的線程數。-t 或者 --threads標記。

默認是0:16 。例子: $puma -t 8:32

 

Clustered mode

Puma提供clustered mode. Clustered mode會fork workers 從一個主進程。 每一個子進程仍有它本身的thread pool。 你能夠調節workers的數量,使用-w或者--workers標記。

一個worker就是一個進程。設置workers的數量就是開幾個進程。

 

--preload標記

在配置文件puma.rb中設置preload_app!方法。

 

on_worker_boot 塊 

在配置文件puma.rb中設置這個塊會在boot每一個worker時運行塊中的代碼。

做用是在boot這個程序前,用於創建這個進程,讓你能夠作一些Puma-specific的事情(不想插入到程序中的事),例如去掉一些worker啓動時或發送信息的日誌信息。這個塊能夠屢次調用。

 

若是你預加載 你的程序並使用ActiveRecord。推薦把你的鏈接池放到這個塊中,見👆的代碼實例。

 

before_fork塊 

用於在workers被fork前運行一些代碼。見👆示例。 

 

還有不少額外配置,現用現學把。 

相關文章
相關標籤/搜索