在開發和產品環境下,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的選項是什麼用途?
把這個gem安裝了,但不加載load。 你bundler時,不會調用require 'mina-puma'命令。何時須要用到這個library,手動加載這個命令。
通常是不但願這個gem加載到全部進程中,只在特定的時候使用。能夠節省主程序的內存和減小startup 時間。
Rails
Puma是Rails的默認server,已經安裝在gemfile中了。
使用rails s會開啓你的服務器:
可是用rails s不能進行額外的options的配置,可使用$ bundle exec puma 代替 :
具體配置選擇看puma -h ,詳細講解見git
部分講解見下:
Configuration
全部配置能夠在config/puma.rb中設置。
例子,若是環境是產品環境則:配置以下信息:
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前運行一些代碼。見👆示例。
還有不少額外配置,現用現學把。