reload and restart

很早以前在电脑上插入U盘还需要重启系统,那时候大家都很能忍。后来有了热插拔技术才解决这个难题,这种技术让电子设备可以在不影响操作系统和程序正常运行的情况下重新加载硬件,后来软件上也开始使用这种技术,我们称之为热更新(reload)。

restart很好理解,就是重启,比如重启手机,重启电脑。重启会让系统停止运行。Windows系统重启至少需要半分钟,在这半分钟的时间里你只能盯着屏幕发呆……

这两个看似平淡无奇的命令隐含着无数技术细节。今天说说通过软件实现reload和restart有哪些不为人知的细节。

kill命令

这一切都要从kill命令说起。kill,英语中为杀死的意思,顾名思义就是用来杀死一些东西的命令,程序员们常用来杀死系统中的进程。

插入一则笑话:

程序员的老婆:紫禁城好大
程序员:哪个子进程?快杀了他

kill命令的设计者为如何杀死进程,提供了很多种参数,比如(只介绍两个通用的):

-g 杀死进程组
-w 等待进程死亡

kill命令的重点不在于参数而在于信号,kill命令可以通过发送指定的信号到相应进程,实现外接和进程之间的单向通信。就像遥控器和电视,遥控器可以发送信号给电视,但电视不能发送信号给遥控器。通过kill命令的信号机制就能实现给程序所在的进程发送信号,让程序重启或者更新。

kill信号一共64个,这里只介绍10个:

 1. SIGHUP
 2. SIGINT
 3. SIGQUIT
 4. SIGILL
 5. SIGTRAP
 6. SIGABRT
 7. SIGBUS
 8. SIGFPE
 9. SIGKILL
 10. SIGUSR1

kill命令的使用是`kill -信号 进程编号`,比如`nginx reload` 底层调用的是`kill -USR1 9527` ,其中9527是nginx服务的进程编号,通常存储于nginx.pid文件中。

因为nginx源代码中对`SIGUSR1`信号做了接收和处理,所以通过`kill -USR1 9527`能实现热更新,kill命令写起来很血腥,于是nginx封装了`nginx reload`。

restart VS reload

restart的优缺点:

缺点:restart = stop + start,stop之后服务会中断。

优点:解决内存泄露和资源锁的问题;

reload的优缺点:

缺点:无法解决内存泄露和资源锁的问题;

优点:不中断服务,速度快;

restart的实现细节

nginx程序并不自带restart命令,因为这个命令有风险。一些主流的程序都没有restart命令,比如MySQL,ElasticSearch,php-fpm等等。为什么没有?最后有解答

为了拥有restart命令,很多人会选择注册服务的方式来实现,比如nginx注册成服务之后就能使用`service nginx restart`命令来实现重启,下面是`service nginx restart`命令的源码:

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

代码中有`sleep 1`命令,含义是等待`nginx stop`命令结束后休眠1秒,画重点,这就是主流程序都无法跨过的风险点。

假如`stop`命令运行了2秒才结束,`start`命令会提示端口被占用(处理不好的甚至会出现雪崩)。此时服务已经停止了,但是没启动起来(2秒才结束,1秒的时候运行的起来就是见鬼了)……你心跳加快,马上执行`start`,运气好的话你能成功,此时服务中断5秒。运气不好的话可能服务中断一小时,这一年肯定白干了。

如果运气再背一点,比如集群部署时,60台机器`restart`有10台`stop`超过2秒……是选择回滚代码还是卷铺盖滚回家?

最后,不要嘲笑那些请高僧来给服务器开光的公司,计算机中很多问题就是会莫名其妙发生。对于常用 `service XX restart` 命令的人来说,信仰是很有必要的。

本文分享自微信公众号 - 城边编程(code-log)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java程序猿部落

面试官常问的Nginx的那几个问题?

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器

10020
来自专栏咻咻ing

vue-router的hash和history模式的区别

对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 ...

22220
来自专栏Web技术布道师

推荐9-一看就懂-Docker容器化

docker的英文意思是 码头工人,意思就是搬运东西的意思,其实这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过...

10220
来自专栏前端客栈

前端开发者必备的Nginx知识及应用

Nginx现在几乎是众多大型网站的必用技术,大多数情况下,我们不需要去详细的配置它,但是了解它在应用程序中所担当的角色,以及如何解决这些问题是非常有必要的。下面...

9520
来自专栏杰的记事本

NGINX Server Push服务器推送

Support for HTTP/2 server push is also included in NGINX Plus R15.

8210
来自专栏林小帅的专栏

【踩坑】因为这几行代码,我都快把键盘敲烂了!

在我对项目进行检查后,准备手动进行重启项目服务的时候,发现我对Linux的命令陌生了许多,难过!

13530
来自专栏GetKnowledge+

Nginx简介及安装

Nginx:Nginx ("engine x") ,Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款...

6810
来自专栏GetKnowledge+

Nginx的实际应用

https://download.csdn.net/download/learning_lb/9921929

9520
来自专栏web秀

微信小程序获取用户所在城市

在微信小程序中, 获取用户的地理位置是需要权限的, 如果只是获取用户所在的城市信息, 那只需查看用户ip所在的城市就好了, 下面我们就完成获取用户ip的小程序逻...

26130
来自专栏陌无崖知识分享

Service Mesh体系中的Envoy快速入门

Envoy是一款由Lyft开源的7层代理和通信总线,我们都知道随着微服务的盛行,越来越多的项目中开始使用微服务的理念,当然我们也知道互联网中任何理念或者软件都不...

18810

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励