https://github.com/puma/puma

在开发和产品环境下,Puma是一个简单,快速,多线程,并高并发highly concurrent HTTP1.1server for Ruby/Rack程序。


什么是多线程? multithreading

指从软件或者硬件上实现多个线程并发执行的技术。从而整体提升处理效能。

软件多线程:即使处理器只能运行一个线程,但操作系统可以通过快速在不同线程之间进行切换,由于间隔时间很小,给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。

多任务可以由多进程完成,也可以由一个进程内的多线程完成。

进程是由若干线程组成的,一个进程至少有一个线程。

单进程单线程:一个人在一个桌子上吃菜;

单进程多线程:多个人在一个桌子上吃菜;容易发生争抢,即资源共享就会发生冲突争抢。

多进程单线程:多个人在各自的桌子上吃菜;


gem 'puma', '~> 3.11'

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。推荐把你的连接池放到这个块中,见

puma(5300✨) Rails的一个多线程,高并发处理的web server的更多相关文章

  1. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

  2. 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入

    说起采集,其实我是个外行,以前拔过阿里巴巴的客户数据,在我博客的文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子) 中,介绍过采集用的工具,其实很Low的,分析 ...

  3. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  4. ExecutorService 建立一个多线程的线程池的步骤

    ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...

  5. Java多线程高并发学习笔记(一)——Thread&Runnable

    进程与线程 首先来看百度百科关于进程的介绍: 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的 ...

  6. java web开发 高并发处理

    转自:http://blog.csdn.net/zhangzeyuaaa/article/details/44542161 java处理高并发高负载类网站中数据库的设计方法(java教程,java处理 ...

  7. Windows服务器高并发处理IOCP(完成端口)详细说明

    一. 完成端口的优点 1. 我想只要是写过或者想要写C/S模式网络服务器端的朋友,都应该或多或少的听过完成端口的大名吧,完成端口会充分利用Windows内核来进行I/O的调度,是用于C/S通信模式中性 ...

  8. akka框架——异步非阻塞高并发处理框架

    akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...

  9. 多线程高并发编程(3) -- ReentrantLock源码分析AQS

    背景: AbstractQueuedSynchronizer(AQS) public abstract class AbstractQueuedSynchronizer extends Abstrac ...

随机推荐

  1. 使用stringstream格式化字符串

    stringstream所在头文件为<sstream> 一般有如下常用功能: 1.安全格式化字符串 stringstream常用来安全的格式化若干个字符串,数值到一个缓冲区, 而不用担心溢 ...

  2. [golang note] 数组切片

    数组 √ golang数组包含的每个数据称为数组元素(element),数组包含的元素个数被称为数组长度(length). √ golang数组的长度在定义后不可更改,并且在声明时可以是一个常量或常量 ...

  3. Font: a C++ class

    Font: a C++ class        This class is used in Fractal Generator.    Avi Examples The header fileFon ...

  4. Linux系统——磁盘管理

    磁盘结构 (1)硬盘的物理结构 磁头:每面一个磁盘 盘片:硬盘有多个盘片,每个盘片2面 (2)硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇形区存放512字节的数据 磁道:统一盘片不同半径的同心 ...

  5. 斐迅面试记录—Http协议中的Header

    HTTP Request的Header信息 1.HTTP请求方式 如下表: 说明:  主要使用到“GET”和“POST”. 实例: POST /test/tupian/cm HTTP/1.1 分成三部 ...

  6. (译)Windows Azure:移动后端开发的主要更新

    Windows Azure:移动后端开发的主要更新 这周我们给Windows Azure释出了一些很棒的更新,让云上的移动应用开发明显的简单了.这 些新功能包括: 移动服务:定制API支持移动服务:G ...

  7. 安卓 和 IOS 的icon 尺寸

    安卓 36*36 48*48 72*72 96*96 IOS Icon.png – 57×57 iPhone (ios5/6) Icon@2x.png – 114×114 iPhone Retina  ...

  8. 什么是Socket?简单点,通俗易懂的?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  9. HttpWebRequest 返回BadRequest(400) 同时返回Response

    今天用Fiddler分析安卓APP的一个登陆功能的时候,账号和密码错误会返回相应的消息,并且状态码是400. 正常用法: /// <summary> /// 读取返回的内容 /// < ...

  10. 20145216史婧瑶《Java程序设计》第三次实验报告

    实验三 敏捷开发与XP实践 实验内容 使用git上传代码,两个人进行小组合作,队友下载代码并修改再重新上传. 实验步骤 一. 使用git上传代码 1.找到需要push的文件所在文件夹,右键点击Git ...