• 服务本身应该还好 m$ 对中国市场还是很重视的 gov 不是还拿到了windows 的源码么 主要是墙高了 或者国家从安全层面考虑 要求私有代码必须落地国内

  • 在我举的例子当中, 当进行数据库事务的时候 本机的 CPU 是闲置的状态, 这个时候切换上下文是会提高cpu 效率的, 而这种情况的变种我觉得还经常会发生(瓶颈在数据库). 所以我会对您那个公式有点不同意见

  • 简化一下情况

    假设运行后端的服务器只有1核的CPU

    之后开一个 PUMA , puma 跑20 个线程,

    现在有大量数据库事务的任务,每个事务执行需要1s,

    再假设除了执行数据库, 其他操作小于1ms 的响应

    如果pool的大小是2, 那么是不是此时就只能并发两个请求?

    是否能等效理解为 在执行事务的时候, 此时服务器的cpu 是空闲状态, 但是却因为数据库连接池的问题不能进行服务?

    如果此时连接池开到20, 将puma 的线程池满

    似乎就可以进入20个并发了

    或者我的理解有问题, 有一些概念上的错误?

  • 这个线程池个数设置方式 应该比较靠谱.

    特例是, 在puma 的一个 thread 里并行用到了一个以上的连接. 但是似乎我也没想到这种情况的场景.

    而且算法是在 puma max threads的情况下的, 一般压力不会那么大

  • 看上去都是数据库?

    加大点 pool 比如 30 - 50 试试 ?

  • 😆 不能老让小姐姐们玩 postman 不是么......

    最后还是决定牺牲一点性能, 在 rails-api 上 继续写传统 view, 复杂点的就 webpacker react 跑一下凑凑热闹

    在pv 没到10m 之前 性能损失在20% 以下都还能接受

  • 我试试 @kayakjiang

  • 理论上你可以让puma 承担所有工作, 只是说 puma 是基于 ruby 的 , 效率没有基于 nginx 的高

    比如你开一个puma 进程, 进程再跑20个线程

    但是很有可能你一个网站就有超过5个静态资源, 之后只要有4个访问并发, 你puma 的线程数就占完了, 新访问就没办法进来了

    而nginx 首先在处理静态资源的情况下效率就比puma 高很多, 对 wait 的处理也非常好, 对于静态资源, 几千个并发随便来,

    同时就算puma 资源耗完了, nginx 也可以先将连接进入wait 状态, 等待 puma 可以接受新资源了, 再进行转发

    再就是一些跟网站本身没有多大联系的功能, 比如 SSL证书, 或者多个网站部署到同一个ip 等等, 要说用puma 可以不可以实现, 也可以, 但是复杂性大大增强了, 耦合性也急速的膨胀. 然而对于这种东西, nginx 处理起来驾轻就熟, 直接上配置就好了

    总结下来, 就是专业的事情, 专业的工具来干. 用螺丝刀也可以钉钉子, 但是如果有锤子, 还是上锤子比较好

  • 邮件写的已经要delay了

  • 印象中猎聘是在八里庄那边 没想到也是用的 rails 啊

  • 不算不算 😁

  • 哎呀 露脸了

  • 内存泄漏真的是超级超级难查

    楼主辛苦了

  • 感谢刘老板赐教

  • 在官网上没找到相关内容呢 这个我还真不是太了解

  • 不要把分析N个公司作为一次原子操作,

    建议把分析一个公司, 变为一次原子操作

    用那种加权方式 比如 A 客户等级是 100 B 客户等级是 10 , 之后A 客户的一个企业分析权值就是100, B的一个企业分析一次分析就是10

    之后一个true 循环这个大数组, 每循环一次, 数组里所有权值 + 1 , 之后再把权值最大的任务执行掉, 拿出去.

    这里的重点, 是每检测循环一次, 数组所有的权值+1

    这样, 具有最高权值的任务就会优先执行, 低权值的数据, 也会因为遍历次数的增长, 而变成高权值的数据, 不至于在这个循环里没有执行的机会

  • 我这刚试了 有呀

  • bwg 用户路过, 好像bwg 不需要开80 端口

    http://23.105.196.112/
    Connecting to 23.105.196.112:80... connected.
    HTTP request sent, awaiting response... 301 Moved Permanently
    

    证明 nginx 上 80 端口已经可以正常访问了

    至于 ip 配置 443, 我这没听过给ip 签名的, 理论上证书是给域名签名的, 而不是给ip地址签名, 证书的 CA 那块不会过吧

    我个人建议新手可以用 nginx + puma 的方式 至少不用编译 nginx ,免得带来各种麻烦

    nginx 的配置你可以参考下 capistrano puma (https://github.com/seuros/capistrano-puma)

    里面有一个 nginx 的自动配置 cap production puma:nginx_config

    要是纯新手, 只要使用 ubuntu apt安装的nginx, 不需要做其他配置

    看到新人学习 rails 真好

  • 只有一个废弃的项目用了 render file

  • 有两台机器实际上, A 和 B 都有Puma, A 有 nginx

    A的 nginx 的 upstream 分别到 A和B 的PUMA 上

    我也觉得2000多还好,

    local_port 不改也有2w-3w, 目前肯定是够用

    主要还是怂

    因为这个项目的业务逻辑关系, 流量特别不稳定, 经常瞬发10x平日流量, 我怕到瓶颈再想办法就比较麻烦了

    其实我觉得开一下 tcp_tw_reuse 应该问题不是太大, 就算占满了都有解

    总之 感谢 @early @quakewang

  • upstream api_production {
      server 172.16.0.13:3001 fail_timeout=0;
      server 172.16.0.12:3001 fail_timeout=0;
      keepalive 500;
    }
    
    server {
      listen 80;
    
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header X-Forwarded-Proto http;
    
      listen 443 ssl;
      ssl_certificate         /root/.acme.sh/fullchain.cer;
      ssl_certificate_key     /root/.acme.sh/key;
      add_header Strict-Transport-Security "max-age=31536000";
    
    
      root /var/www/api/current/public;
      try_files $uri/index.html $uri;
    
    location /api {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    
        proxy_pass http://api_production;
    
      }
    
      location / {
        rewrite ^/(.*)$ /api/$1 last;
        proxy_pass  http://api_production;
      }
    
  • 这个开过, 开过常用的16 和 500 没有什么明显的效果似乎

  • 主要都是 puma 端口上的 TIME_WAIT

    tcp        0      0 172.16.0.13:3001        172.16.0.13:58594       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:34790       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:57166       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:34378       TIME_WAIT
    tcp        0      0 172.16.0.13:46242       172.16.0.12:3000        TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:60220       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:32940       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:59416       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:57810       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:35356       TIME_WAIT
    tcp        0      0 172.16.0.13:33226       172.16.0.13:3001        TIME_WAIT
    tcp        0      0 172.16.0.13:443         223.104.94.24:53306     TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:35066       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:58744       TIME_WAIT
    tcp        0      0 172.16.0.13:46138       172.16.0.12:3000        TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:60702       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:35518       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:60944       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:57132       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:60464       TIME_WAIT
    tcp        0      0 172.16.0.13:47050       172.16.0.12:3000        TIME_WAIT
    tcp        0      0 172.16.0.13:443         117.136.63.83:14588     TIME_WAIT
    tcp        0      0 172.16.0.13:50070       172.16.0.12:3000        TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:34458       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:33596       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:35192       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:60730       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:59854       TIME_WAIT
    tcp        0      0 172.16.0.13:3001        172.16.0.13:59854       TIME_WAIT
    
  • 哈哈 在medium 也看过一篇 https://medium.com/@coorasse/goodbye-sprockets-welcome-webpacker-3-0-ff877fb8fa79

    只不过 rails 6 就默认 webpacker 了

  • 阿里云默认不开放25端口