用于游戏应用程序的带有 criu 或 docker 的实时检查点
Live checkpoint with criu or docker for game applications
我在使用 criu 和 docker 进行实时检查点和恢复方面遇到问题。
目前我正在使用 ubuntu 16.04,我想实现一个功能
让用户检查他们当前的游戏应用程序状态。
例如,用户可以在玩游戏时随时检查点。
但是,当我尝试在sfml编写的游戏中使用criu dump时失败了。
更具体地说,我在ubuntu 16.04下使用了一个用sfml和criu 2.x编写的游戏。当我开始游戏时,我尝试使用criu提供的转储功能如下:
criu dump -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --external unix[33323] --external unix[33326] --external unix[33316] --external unix[33317]
似乎 criu 内存和文件转储不支持对某些特定设备(例如视频卡)进行实时检查点,路径为:/dev/dri/card0
。
因此,我修改了 criu 源代码,使其跳过某些设备
当遇到一些不受支持的设备时:
criu/parse_proc.c, line 721
但是,当我尝试使用以下命令恢复时发生错误:
criu restore -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --inherit-fd fd[10]:socket:[33326] --inherit-fd fd[3]:socket:[33316] --inherit-fd fd[7]:socket:[33317] --inherit-fd fd[8]:pipe:[33323] --inherit-fd fd[9]:pipe:[33323]
错误消息说:
Error (criu/files.c:1477): Can't fstat inherit fd 10: Bad file
descriptor
我认为 docker 也无法处理它,因为它的实时检查点机制是建立在 criu 之上的。
我想知道是否有任何可能的方法来处理它或
有人在 docker 之前做过这样的事情吗?
谢谢
使用 Docker CLI 进行检查点和恢复更容易,问题也更少。
你可以试试:https://forums.docker.com/t/docker-checkpoint-restore-on-another-host/27427/2 and https://github.com/docker/cli/blob/master/experimental/checkpoint-restore.md
具体来说,docker中的实验模式必须启用。检查点:
sudo docker checkpoint create --checkpoint-dir=<dir-checkpoint-files> <container-ID> <checkpoint-name>
恢复:
sudo docker create --name <container-name> <container-image>
sudo docker start --checkpoint=<checkpoint-name> --checkpoint-dir=<dir-checkpoint-files> <container-name>
我尝试使用 criu 进行检查点和恢复;但是,它引起了很多像你这样的问题。
我在使用 criu 和 docker 进行实时检查点和恢复方面遇到问题。
目前我正在使用 ubuntu 16.04,我想实现一个功能 让用户检查他们当前的游戏应用程序状态。 例如,用户可以在玩游戏时随时检查点。 但是,当我尝试在sfml编写的游戏中使用criu dump时失败了。
更具体地说,我在ubuntu 16.04下使用了一个用sfml和criu 2.x编写的游戏。当我开始游戏时,我尝试使用criu提供的转储功能如下:
criu dump -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --external unix[33323] --external unix[33326] --external unix[33316] --external unix[33317]
似乎 criu 内存和文件转储不支持对某些特定设备(例如视频卡)进行实时检查点,路径为:/dev/dri/card0
。
因此,我修改了 criu 源代码,使其跳过某些设备
当遇到一些不受支持的设备时:
criu/parse_proc.c, line 721
但是,当我尝试使用以下命令恢复时发生错误:
criu restore -D img -t 2833 --shell-job --tcp-established --ext-unix-sk --inherit-fd fd[10]:socket:[33326] --inherit-fd fd[3]:socket:[33316] --inherit-fd fd[7]:socket:[33317] --inherit-fd fd[8]:pipe:[33323] --inherit-fd fd[9]:pipe:[33323]
错误消息说:
Error (criu/files.c:1477): Can't fstat inherit fd 10: Bad file descriptor
我认为 docker 也无法处理它,因为它的实时检查点机制是建立在 criu 之上的。 我想知道是否有任何可能的方法来处理它或 有人在 docker 之前做过这样的事情吗?
谢谢
使用 Docker CLI 进行检查点和恢复更容易,问题也更少。 你可以试试:https://forums.docker.com/t/docker-checkpoint-restore-on-another-host/27427/2 and https://github.com/docker/cli/blob/master/experimental/checkpoint-restore.md
具体来说,docker中的实验模式必须启用。检查点:
sudo docker checkpoint create --checkpoint-dir=<dir-checkpoint-files> <container-ID> <checkpoint-name>
恢复:
sudo docker create --name <container-name> <container-image>
sudo docker start --checkpoint=<checkpoint-name> --checkpoint-dir=<dir-checkpoint-files> <container-name>
我尝试使用 criu 进行检查点和恢复;但是,它引起了很多像你这样的问题。