GitLab 为什么需要 Unicorn

上一回我们主要讲解了 GitLab-workhorse 组件的智能代理功能,从这一回起将开始介绍最核心也最复杂的组件:Unicorn(GitLab Rails),上次也说了这个组件主要处理动态网页和 api 接口

此篇文章先介绍 Unicorn 的作用,光是这个就能讲很多内容了

Unicorn 是使用多进程模型的 Ruby web 服务器,遵循 Rack 协议。如果要类比 java web 开发技术栈的话,Rails 应用相当于 Spring MVC 框架应用,Unicorn web 服务器相当于 tomcat

GitLab 的 Rails 应用程序(即 gitlab-ce)是在 Unicorn 服务器内运行的,使用 Unicorn 的原因是: Unicorn 能为 Rails 应用提供并发处理客户端请求的能力,并且提供了更强的容错处理

Unicorn 的多进程模型能很好地利用服务器多核 CPU 的资源,以提供更好的并发能力。当 Unicorn 启动时,Unicorn 的主进程,即 master 进程,会以 fork 的方式创建一系列 worker 进程。Unicorn 通过一个 master 进程来管理多个 worker 进程,其中 master 进程不负责处理客户端的 HTTP 请求,多个 worker 进程监听同一组套接字以处理客户端请求

实际上,worker 进程可能会挂掉或者超时(超时是指,如果 master 进程发现某个 worker 进程耗费太长时间在处理一个请求,master 进程将以发送信号(SIGKILL, kill -9)终止 worker 进程)

  1. # unicorn_stderr.log 日志,以下表示id 为 10 的 worker 的进程超时,master 进程杀掉后又重启了新进程,重启前后 pid 是不一致的

  2. [2015-06-05T10:58:08.660325 #56227] ERROR -- : worker=10 PID:53009 timeout (61s > 60s), killing

  3. [2015-06-05T10:58:08.699360 #56227] ERROR -- : reaped #<Process::Status: pid 53009 SIGKILL (signal 9)> worker=10

  4. [2015-06-05T10:58:08.708141 #62538] INFO -- : worker=10 spawned pid=62538

  5. [2015-06-05T10:58:08.708824 #62538] INFO -- : worker=10 ready

  6. 复制代码

不管 worker 进程会以哪种方式终止,master 进程总会创建全新的 worker 进程替代原 worker 进程,整个过程不会丢弃用户的请求

gitlab-ce 本身是内存泄漏的应用。由于 Unicorn 在运行过程会 fork 大量的 worker 进程,内存泄漏会显现在长时间运行的进程中,如 worker 进程(master 进程因为不频繁处理用户请求而几乎没有内存泄漏的现象)。而 Unicorn 本身并没有提供自动重启 worker 进程的功能,为解决这个问题就出现了 unicorn-worker-killer ,具体查看 github.com/kzk/unicorn…

GitLab 使用了 unicorn-worker-killer 以让这些进程的内存泄漏得以管控:Unicorn worker 进程在每处理 16 个请求后将进行内存自检,如果 worker 进程占用的内存大小超过了预设定的值,Unicorn master 进程将会自动将此 worker 进程替换掉,整个过程不会影响任何请求的处理

  1. # unicorn_stderr.log 日志,以下表示 worker 进程的当前占有内存超过约 250M,于是对此 worker 进程执行重启替换的操作

  2. [2015-06-05T12:07:41.828374 #125918] WARN -- : #<Unicorn::HttpServer:0x00000002734770>: worker (pid: 125918) exceeds memory limit (256413696 bytes > 254802235 bytes)

  3. [2015-06-05T12:07:41.828472 #125918] WARN -- : Unicorn::WorkerKiller send SIGQUIT (pid: 125918) alive: 23 sec (trial 1)

  4. [2015-06-05T12:07:42.025916 #117565] INFO -- : reaped #<Process::Status: pid 125918 exit 0> worker=4

  5. [2015-06-05T12:07:42.034527 #127549] INFO -- : worker=4 spawned pid=127549

  6. [2015-06-05T12:07:42.035217 #127549] INFO -- : worker=4 ready

  7. 复制代码

综上所述,GitLab 使用 Unicorn 的目的:

  1. 充分利用服务器多核 CPU 以并发处理客户端请求
  2. 可用性:一个进程的异常不会致使整个 GitLab 应用瘫痪;
  3. 管理 Rails 应用的内存泄漏

当然它也带来了一些问题:

  1. 使用多进程就不得不面临吃内存的难题,同时使得 unicorn 的 worker 进程数量较受限制
  2. 多进程阻塞式 IO 难以接受慢客户端造成的性能损失(想象所有的 worker 进程都正在处理慢客户端,如果客户端还在慢慢地读取 worker 进程准备好的响应信息,那 worker 进程就没办法处理下一个请求),因此一般情况下需通过反向代理服务器(如 nginx 服务器,或 gitlab-workhorse 等)才能解决慢客户端的问题(worker 进程把处理好的响应消息交给反向代理服务器缓冲区,由反向代理服务器继续和客户端慢慢纠缠,自己继续处理下一个请求,这样 Unicorn 的吞吐量自然就不会受影响了)
  3. Unicorn 的设计与 GitLab 的 git-over-http/https 业务不兼容,即通过 HTTP/HTTPS 对 Git 存储仓库进行访问(git clone/push 等)。git-over-http/https 本身是相对比较耗时的操作,而 unicorn 服务器如果为了满足此业务而调大请求的超时参数显然是不合适的

附录

参考链接

面向信仰编程 浅谈 Unicorn 的多进程模型

How GitLab uses Unicorn and unicorn-worker-killer

Understanding Unicorn and unicorn-worker-killer

转载于:https://juejin.im/post/5cf6832c51882520724c84ff

GitLab系列3 Unicorn相关推荐

  1. Gitlab系列八之重置管理员密码

    gitlab web登入密码忘记以后可以用如下方式修改密码 [root@gitlat-test gitlab]# gitlab-rails console production Loading pro ...

  2. Gitlab安装使用及汉化配置

    一.GitLab简介 GitHub是2008年由Ruby on Rails编写而成,与业界闻名的Github类似;但要将代码上传到GitHub上面,而且将项目设为私有还要收费.GitLab是一个用于仓 ...

  3. 详解线上gitlab服务搭建(字数2w+)

    目录 一.GitLab是什么? 1.GitLab的功能 2.GitLab和Git区别 3.GitLab的优势 二.GitLab安装1.环境配置 2.环境要求 #系统层 #Ruby versions # ...

  4. GitLab安装说明

    GitLab,是一个使用 Ruby on Rails 开发的开源应用程序,与Github类似,能够浏览源代码,管理缺陷和注释,非常适合在团队内部使用. gitlab是基于Ruby on Rails的, ...

  5. gitlab mysql devel_服务器搭建gitlab+mysql+nginx+redis+Jekins

    centos7.8 (本来要搭建一个持续集成的个人博客来,可惜想用的服务器被用来干其他的了,计划夭折,就差持续集成和域名解析备案了) 1.添加用户 useradd -d /home/usr -m us ...

  6. 安装gitlab并汉化

    官方安装教程: https://www.gitlab.cc/downloads/#centos6 1,默认安装的是英文版,后面说怎么汉化. 2,默认安装登录需要重置root密码.可以自己单独设置一个复 ...

  7. CentOs7安装gitlab(转!)

    沧浪之水清兮,可以濯吾缨; 沧浪之水浊兮,可以濯吾足. -------------------<渔夫>引自<大江大河:水书记> 转自:https://www.cnblogs.c ...

  8. 在centos6.5中安装 GitLab 全过程和问题记录

    在centos6.5中安装 GitLab 全过程和问题记录 如果你想省事,使用最新版本的gitlab,请下载一键安装包,一键安装 脚本:https://bitnami.com/stack/gitlab ...

  9. Gitlab环境快速部署(RPM包方式安装)

    之前梳理了一篇Gitlab的安装CI持续集成系统环境---部署Gitlab环境完整记录,但是这是bitnami一键安装的,版本比较老.下面介绍使用rpm包安装Gitlab,下载地址:https://m ...

最新文章

  1. 01.轮播图之二 :tableView 轮播
  2. *LOJ#2085. 「NOI2016」循环之美
  3. Leetcode 剑指 Offer 13. 机器人的运动范围 (每日一题 20210906)
  4. 试编写算法,设任意n个整数存放于数组A[1...n]中,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))
  5. 图灵奖得主Bengio:深度学习让AI得以推理和想象,不会被取代
  6. css 图片自适应_img图片自适应object-fit
  7. 帆软报表设计器菜单栏介绍之二文件菜单
  8. 训练AI太辛苦?OpenAI新方法:不如让AI之间互教吧
  9. Java实战之管家婆记账系统(24)——项目总结
  10. iphone8强制重启进入恢复模式进入DFU模式[2021-11-05]
  11. 作业4—文法和语言总结与梳理
  12. springmvc+vue ssm 医院预约挂号系统#毕业设计
  13. YOLOv5改进之八:非极大值抑制NMS算法改进Soft-nms
  14. (收藏)让你平步青云的十个谈话技巧
  15. “只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔
  16. 【Chapter 3: Process】
  17. android在线预览excel文件格式,Android打开doc、xlsx、ppt等office文档解决方案
  18. 【PowerBI】onmicrosoft.com邮箱已经不能注册 Power BI 账号
  19. android 天气 没有广告,收集几款无广告的纯净天气App
  20. Oracle数据库的自动锁介绍

热门文章

  1. excel设定备选值
  2. 【python知识】win10下如何用python将网页转成pdf文件
  3. 大数据开发最火技术Kafka背后的“黑科技”
  4. 梧桐树王牌产品金玉满堂增额终身寿险下架在即,资产焦虑就买它
  5. 调用聚合数据新闻头条API接口
  6. 能让3D打印自动支撑和减少压力积累的云软件
  7. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
  8. NO.90——京东用户购买意向预测之数据预处理
  9. 23.卷积神经网络实战-ResNet
  10. 如何有效提高营销型企业官网客户成交率?