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前运行一些代码。见👆示例。 

 

还有不少额外配置,现用现学把。 

相关文章
相关标签/搜索