干货 | 你是不是也有多进程管理的困惑呢?

简介: 进程是执行中的程序,就类比于一出舞台剧的整个表演过程;进程动态性的实质是进程实体的执行过程;进程独立性是指每个进程都有自己的PCB;进程的并发性是内存中可以允许存在多个进程实体,并且可以同时运行一段时间。

1、问题引出——多进程应用场景

场景一:
将关系型、非关系型数据的数据同步到ES中。
但是数据库中的表有多个,
一种方案是:一个配置文件中 if else 的方式配置多个表;
另外一种方案是:多个配置文件,多个进程并行执行。
如下图所示:

image.png

场景二:
kafka多个通道的数据借助kafka_connector 或者logstash_input_kafka同步到ES中,
如下图所示:
image.png

这时候,根据通道的处理分成如下1,2两部分:
1、kafka stream对实时数据流的数据清洗、转换操作,有几个通道就至少有几个进程;
2、kafka_connector对处理后的数据实时同步,有几个通道至少有几个进程;
3、为了提高同步的时效性,通用的方案是增加kafka的topic的分片数,这时对应的进程数有会增多。

2、多进程困惑

困惑1:需要大量重复操作。
个位数内的进程数还能接受,二十个甚至更多个进程的重复操作会很繁琐。
比如,针对N个进程的操作:
1)更新jar包,多个进程需要拷贝N次;如果各业务进程jar包名称不一致,需要改名N次。
2)重启业务,多个进程需要挨个重启N次。
困惑2:多进程管理很不直观、很繁琐。
困惑3:不能第一时间获取某个进程的宕掉信息。
困惑4:进程宕掉后,不能自动重启。
困惑5:不能定义进程的优先级。

3、常用的解决方案?

定制开发,脚本实现。
开发要点:
1)进程文件名称尽量有规律。
2)进程名尽量统一、有规律,便于计数排错。
统计进程数计数举例:
ps -ef | grep 进程名 | grep -v ‘color’ |wc -l
3)定时任务crontab + sendmail预警。
通过脚本对进程进行监控,如果进程数变化,则通过邮件预警。
4)脚本循环检测+定时重启。

即便如此,仍然不够高效。
有没有可视化、批量操作、自动重启、自动邮件预警的管理工具呢?

4、有没有更高效的方案呢?

实践证明有的。
后台进程管理工具Supervisor + superlance(Supervisor 的增强插件工具集)。

5、多进程管理工具Supervisor

Supervisor是一个Python编写的客户端/服务器工具,允许用户在类UNIX操作系统上控制大量进程。
用途:

  • 进程监控
  • 进程守护
  • 进程管理

官网地址:http://supervisord.org/

6、Superlance增强插件工具集

Superlance是一套用于监视和控制在Supervisor下运行的进程的插件工具集。

  • 1)httpok——此插件旨在用作主管事件侦听器,通过HTTP GET请求到达配置的URL,如果请求失败或超时,httpok将重新启动“挂起”子进程。
  • 2)crashmail——此插件旨在用作监督者事件侦听器,订阅PROCESS_STATE_EXITED事件。当进程意外进入EXITED退出状态时,它向用户发送电子邮件。这点,解决了我得困惑!
  • 3)memmon——此插件旨在用作主管事件侦听器,它监视配置的子进程的内存使用情况,并在超过配置的最大大小时重新启动它们。
  • 4)crashmailbatch——与crashmail类似,当进程意外死亡时,crashmailbatch会发送电子邮件警报。区别在于,在配置的时间间隔内生成的所有警报都会一起批处理以避免发送太多电子邮件。
  • 5)fatalmailbatch——当进程无法启动太多次时,这个插件会发送电子邮件警报,使supervisord放弃重试。在配置的时间间隔内生成的所有致命的开始事件都会一起批处理以避免发送太多的电子邮件。
  • 6)crashsms——除了通过电子邮件网关发送SMS警报外,它与crashmailbatch类似。消息格式化为适合SMS(短信)。

官网地址:http://superlance.readthedocs.io/en/latest/

7、sendEmail 命令行工具

sendEmail是一个轻量级,命令行的SMTP邮件客户端。
SendEmail是用Perl编写的,它的独特之处在于它不需要任何模块。
它具有直观灵活的一组命令行选项,使其易于学习和使用。

官网地址:http://caspian.dotconf.net/menu/Software/SendEmail/

8、Supervisor等工具集部署流程

步骤1:安装supervisior
启动方法:
[root@localhost xx]# supervisord -c /etc/supervisord.conf

步骤2:安装superlance
我们主要使用superlance的监控+发送邮件的功能。

步骤3:安装SendMail
核心:借助SendMail发送邮件。

基于步骤1——步骤3的核心配置如下:


[program:exec_test]
command=java -jar /home/test/banlance_test.jar
directory= /home/test
numprocs=1 ; 
autorestart=true
autostart=true
redirect_stderr=true ; 
stdout_logfile=/var/log/supervisor/app_test_stdout.log
stderr_logfile=/var/log/supervisor/app_test_stderr.log
loglevel=info


[eventlistener:crashmail-exited]
command=crashmail -p exec_test -s "sendEmail -f send@163.com -t recv@qq.com -s smtp.163.com 
-u '进程预警' -o message-content-type=html -o message-charset=utf8 -xu send@163.com 
-xp mima -m '业务流进程 异常退出!'" -m recv@qq.com
events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR
redirect_stderr=false

注意:[eventlistener:crashmail-exited]下的 -p 后面跟的就是[program:exec_test]配置的进程名称。
这样就能实现对exec_test的进程监控。

SendMail核心参数解读:

-f ttlsafrom@163.com 发件人邮箱
-s smtp.163.com 发件人邮箱的smtp服务器
-u “我是邮件主题” 邮件的标题
-o message-content-type=html 邮件内容的格式,html表示它是html格式
-o message-charset=utf8 邮件内容编码
-xu ttlsafrom@163.com 发件人邮箱的用户名
-xp 123456 发件人邮箱密码
-m “我是邮件内容” 邮件的具体内容

至此,以前复杂多进程的管理,改成一个配置文件就能搞定。
如果新增文件,只需要在supervisord新增对应的进程监控+邮件预警配置即可。

9、supervisior 可视化效果

image.png

截图中只有一个进程,多个进程会多行排列展示。

10、小结

文章中没有给出一步步的部署步骤,这些步骤资料网上都能查到。
主要给出解决问题的思路和官网链接。
你有没有更好的多进程解决方案,欢迎留言讨论。

参考:

http://www.alphadevx.com/a/455-Installing-Supervisor-and-Superlance-on-CentOS
http://www.ttlsa.com/linux/use-sendemail/
https://blog.csdn.net/baidu_zhongce/article/details/49151385


作者:铭毅天下
转载请标明出处,原文地址:
https://blog.csdn.net/laoyang360/article/details/80792245

相关文章
|
消息中间件 算法 Unix
Linux系统编程(进程基础知识讲解)
Linux系统编程(进程基础知识讲解)
142 3
|
2月前
|
消息中间件 算法 调度
深入浅出操作系统:进程管理的艺术
【10月更文挑战第23天】在数字世界的幕后,操作系统扮演着不可或缺的角色,而进程管理则是其核心魔法之一。本文将带你探索操作系统中进程管理的奥秘,从进程的诞生到成长,再到最终的消亡,揭示它如何协调资源、响应中断,并保证多任务的顺畅执行。通过直观的比喻和生动的故事,我们将简化复杂的概念,让每一位读者都能轻松理解这一技术的核心原理。准备好跟随我们的脚步,深入操作系统的灵魂深处,一探进程管理的艺术吧!
45 1
|
5月前
|
Linux
揭秘Linux心脏:那些让你的编程事半功倍的主要系统调用
【8月更文挑战第31天】Linux中的系统调用是操作系统提供给应用程序的接口,用于请求内核服务,如文件操作、进程控制等。本文列举了22种主要系统调用,包括fork()、exec()、exit()、wait()、open()、close()、read()、write()等,并通过示例代码展示了如何使用fork()创建新进程及使用open()、write()、close()操作文件。这些系统调用是Linux中最基本的接口,帮助应用程序与内核交互。
73 1
|
5月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
50 1
|
8月前
|
存储 Ubuntu Unix
【操作系统原理】—— 进程管理
【操作系统原理】—— 进程管理
|
8月前
|
Linux 调度 C语言
|
调度
操作系统概论学习(进程管理)
操作系统概论学习(进程管理)
68 0
|
8月前
|
消息中间件 存储 算法
=====B102第二章进程管理==== (4)
2.5 进程通信   进程通信,是指进程之间的信息交换,其所交换的信息量少者是一个状态或数值,多者则是成千上万个字节。进程之间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。在进程互斥中,进程通过只修改信号量来向其他进程表明临界资源是否可用。在生产者—消费者问题中,生产者通过缓冲池将所生产的产品传送给消费者。
61 0
|
8月前
|
消息中间件 存储 算法
=====B102第二章进程管理==== (2)
2.1.5 进程控制块 进程控制块的作用   为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块 PCB,PCB是进程实体的一部分,是操作系统中最重要的记录型数据结
79 0
|
8月前
|
调度 UED
=====B102第二章进程管理==== (1)
2.1 进程的基本概念   在未配置OS的系统中,程序的执行方式是顺序执行,也就是说必须在一个程序执行完后,才允许另一个程序执行;在多道程序环境下,则允许多个程序并发执行。程序的这两种执行方式间有着显著的不同。也正是程序并发执行的这种特征,才导致了在操作系统中引入了进程的概念。
63 0

相关课程

更多