量化交易系统搭建之四:进程管理优化

量化交易系统搭建之四:进程管理优化

本文将简要介绍如何使用supervisor优化进程管理、依赖关系等运维优化。

特别鸣谢:ticaleen在技术上的指导和帮助。

01

优化进程管理

在量化交易系统搭建系列中(「量化交易平台搭建」之「建立全天候市场监测程序」),介绍了如何让Python程序在云服务器24*7运行。但在运行时,程序可能因为内存耗尽、运行出错等原因停止运行,而nohup无法进行自动重启。因此,本文将介绍能令程序后台运行、且更加易于管理的进程管理程序——Supervisor。

Supervisor是一套通用的进程管理程序,它不仅能和nohup一样能将进程变为后台程序(24*7运行),还能做到监控进程状态,异常退出时能自动重启等nohup完成不了的功能。

Supervisor的运行框架主要由supervisord、supervisorctl等四个部分组成,其中:

supervisord:是supervisor的服务端,它负责管理所有子进程(child programs),能根据配置文件创建子进程,并在进程报错时重启。该服务端需要配置文件,通常被放在/etc/supervisord.conf下。

supervisorctl:负责管理客户端,用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程等。

Web server:提供了网页交互页面,用户通过设置supervisord配置文件[inet_http_server]部分后,登录网页来管理进程

XML-RPC interface:XML-RPC接口,通过XML-RPC服务来对子进程进行管理和监控。

最终展示效果如下,用户不仅可以直观看到进程的ID pid,还有直接可以对进程进行操作(重启restart或者停止stop)。

设置supervisor进程管理的步骤分几个步骤:

一、新建相关路径

首先,用户需要登录云服务器并作为管理员运行以下代码来创建路径:

sudo -i   #进入sudo管理员模式,可以按control + d 或输入exit退出管理员模式#创建路径sudo mkdir -p /opt/supervisor/config/conf.d/  #存放所有.conf的子进程mkdir /var/run/supervisor/mkdir /opt/supervisor/log/

准备superviosr的服务端文件supervisord.conf

新建supervisord的服务端配置文件,之后可以将该文件放在/etc/下。文件中,[inet_http_server]下的username和password可以选择性删除(即不需要登录用户名和密码即可看到):

其中,[unix_http_server]和[supervisord]主要用来supervisord启动后的配置文件,[inet_http_server]主要是关于http网页端的端口设置;[include]用来记录所有子进程配置文件的所在地。

[unix_http_server]file=/var/run/supervisor/supervisor.sock ; (the path to the socket file)[supervisord]logfile=/opt/supervisor/log/supervisord.log ; (main log file;default $CWD/supervisord.log)pidfile=/var/run/supervisor/supervisor.pid ; (supervisord pidfile;default supervisord.pid)childlogdir=/opt/supervisor/log/            ; (AUTO child log dir, default $TEMP)[inet_http_server] ; inet (TCP) server disabled by defaultport=0.0.0.0:9001 ; ip_address:port specifier, *:port for all ifaceusername=<username>        ; default is no username (open server)password=<password>       ; default is no password (open server)[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL for a unix socket[include]files = /opt/supervisor/config/conf.d/*.conf

supervisord.conf文件

三、设置每个子进程的*.conf配置文件

以市场监测为例,创建monitor.conf配置文件:

[program:monitor]              ;monitor是子进程的名字command=python3 monitor.py     ;指令,运行python程序directory=/home/ubuntu/monitor ;python文件所在地autostart=trueautorestart=trueredirect_stderr=truelogfile_backups=2

将monitor.conf文件移动到supervisord.conf设置的路径下(即supervisord.conf中[include]下路径),并将supervisord.conf移动到/etc/路径下。

sudo mv monitor.conf /opt/supervisor/config/conf.d/sudo mv supervisord.conf /etc/cd /etc

四、运行并管理进程

在sudo模式下,首先尝试能否运行monitor.py文件(有可能存在依赖缺失)。之后,前往superviosrd.conf所在路径(例如/etc/),并启动supervisor:

/usr/bin/supervisord -c supervisord.conf #启动/usr/bin/supervisorctl -c supervisord.conf status  #查看子进程的状态

其他一些有用的命令为:

/usr/bin/supervisorctl -c supervisord.conf restart monitor #启动名为monitor的program/usr/bin/supervisorctl -c supervisord.conf stop all #停止所有program/usr/bin/supervisorctl -c supervisord.conf reload #如果更新了一些.conf文件,可以自动刷新更新

五、网页界面显示

值得注意的是,由于aws的防火墙限制,[inet_http_server]下的9001端口需要人工设置可被访问,方法是:

步骤1:前往AWS console,选择被设置的ec2 instance,点击安全组

步骤2:点击「编辑入站规则」

步骤3:添加规则,类型选择「自定义TCP」,端口范围输入「9001」

步骤4:前往网址:<公共ip>:9001,输入账户和密码

步骤5:查看子进程状态

02

依赖关系管理

在此前系列(「量化交易平台搭建」之「建立全天候市场监测程序」),简单介绍了在新建服务器后,需要安装一些安装包,首先便是pip3,最简单的安装方法是:

sudo apt updatesudo apt install python3-pip

当把一套程序部署在新的服务器上时,往往需要事先安装好所有依赖关系。一个简单的方法是,实现将运行Python程序所有的依赖保存到requirements.txt中,之后一键全部安装。首先,将所有需要的安装包保存在requirements.txt下:

ccxtpandassqlalchemysqlalchemy_utilsmysql-connector-pythonsupervisor

并在服务器中执行:

pip3 install -r requirements.txt

03

总结

综上,本文介绍了如何优化进程管理,介绍了如何将superviosr应用在现有的程序,并实现了24*7运行的同时,可以自动重启进程,并介绍了通过网页管理进程的可视化方法。此外,本文还介绍了方便程度一键安装依赖的方法,进一步提升了环境的搭建效率。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注