Checkpoint/Restart de Processos no Linux com BLCR

De Wiki do Veiga

Tabela de conteúdo

Introdução

Berkeley Linux Checkpoint/Restart (BLCR) é uma ferramente de checkpointing.

A técnica de checkpointing consiste na criação de um arquivo de descrição de um processo em execução, o qual pode ser utilizado para reconstruir o processo em um momento futuro (restart). Este arquivo contém uma imagem do estado de execução do processo em um dado instante de tempo. Isto possibilita que o processo possa continuar sua execução a partir do ponto onde o checkpoint foi realizado. Devido a esse comportamento, essa técnica é comumente chamada de checkpoint/restart (C/R).

Este texto contém informações de como instalar e utilizar BCLR para realizar checkpoint e restart de um processo. Estes procedimentos foram realizados nos laboratórios do GPPD/UFRGS durante a elaboração da minha dissertação de mestrado.

Instalação e Configuração

Para compilar a BLCR é necessário ter os fontes do kernel do Linux instalados na máquina.

Instalação no Gentoo

A seguir estão os passos para instalação no Gentoo. Neste exemplo, que utiliza as máquinas dos bolsistas da sala 207 do GPPD/UFRGS, a versão do kernel instalado é 2.6.12-gentoo-r10.

$ uname -r    
2.6.12-gentoo-r10
$ ls -l /usr/src/linux
lrwxrwxrwx  1 root root 23 Mar 15 11:56 /usr/src/linux -> linux-2.6.12-gentoo-r10

A última versão de BLCR pode ser obtida em http://ftg.lbl.gov/checkpoint (neste exemplo, utilizou-se a versão 0.4.2). A instalação do pacote foi feita como segue:

$ tar xzf blcr-0.4.2.tar.gz
$ cd blcr-0.4.2
$ ./configure
$ make
% make install

Após a instalação é necessário carregar os módulos do kernel:

% insmod /usr/local/lib/blcr/2.6.12-gentoo-r10/blcr_imports.ko
% insmod /usr/local/lib/blcr/2.6.12-gentoo-r10/blcr_vmadump.ko
% insmod /usr/local/lib/blcr/2.6.12-gentoo-r10/blcr.ko

Instalação no Debian

A seguir estão os passos para instalar a BLCR no Debian. Neste exemplo, utilizou-se os nós do cluster Labtec do GPPD/UFRGS que utilizam a distribuição de Debian. O kernel foi instalado com o programa apt-get. Como o kernel instalado nos nós é pre-compilado e os fontes não estavam disponíveis, optou-se por instalar os headers da mesma versão e utilizar o arquivo /boot/System.map.

Verificação dos requisitos para compilação:

# versao do kernel instalado (e em execucao)
$ uname -r
2.6.8-3-686-smp
# headers instalados
$ ls /usr/src/kernel-headers-2.6.8-3-686-smp/
...
# System.map do kernel instalado
$ ls /boot/System.map-2.6.8-3-686-smp 
/boot/System.map-2.6.8-3-686-smp

Compilação:

$ cd blcr-<VERSION>
$ mkdir builddir
$ cd builddir
$ ../configure --prefix=/home/gppd/veiga/usr/ \
--with-linux=/usr/src/kernel-headers-2.6.8-3-686-smp \
--with-system-map=/boot/System.map-2.6.8-3-686-smp 
$ make
$ make install

Carregando os módulos:

$ sudo /sbin/insmod \
/home/gppd/veiga/usr/lib/blcr/2.6.8-3-686-smp/blcr_imports.ko 
$ sudo /sbin/insmod \
/home/gppd/veiga/usr/lib/blcr/2.6.8-3-686-smp/blcr_vmadump.ko 
$ sudo /sbin/insmod \
/home/gppd/veiga/usr/lib/blcr/2.6.8-3-686-smp/blcr.ko 

Se foi especificado um local para a instalação (--prefix=PREFIX), é necessário configurar algumas variáveis de ambiente.

$ export PATH=$PATH:PREFIX/bin
$ export MANPATH=$MANPATH:PREFIX/man
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:PREFIX/lib

Exemplos de Utilização de BLCR

Existem três formas principais de realizar C/R de um processo.

  • Checkpoint/Restart de um processo qualquer, utilizando cr_run para executar o processo.
  • Checkpoint/Restart de processo utilizando a biblioteca BLCR, sem a necessidade de utilizar cr_run e com o procedimento de C/R iniciado externamente.
  • Checkpoint/Restart de processo utilizando a biblioteca BLCR, sem a necessidade de utilizar cr_run e com o procedimento de C/R iniciado pelo próprio processo.

Checkpoint/Restart de um processo qualquer

#include <stdio.h>
#include <unistd.h>

int main()
{
        int i;

        for(i = 0; ; i++) {
                printf("step=%d\n", i);
                sleep(1);
        }

        return 0;
}

Compilar normalmente:

$ gcc -o test test.c

Executar o programa com cr_run:

$ cr_run ./test

Realizar o checkpoint do processo a partir do PID:

$ ps -A | grep test
$ 17132 pts/0    00:00:00 test
$ cr_checkpoint --term 17132

Reiniciar o programa a partir do arquivo de contexto:

$ cr_restart context.17132

Checkpoint/Restart de processo utilizando a biblioteca BLCR

Também é possível fazer a ligação do programa com a biblioteca BLCR. Isso permite que o programa possa ser executado diretamente, sem a necessidade do cr_run.

$ gcc -o test test.c -lcr -lpthread

Executar o programa sem cr_run:

./test

Realizar o checkpoint do processo a partir do PID:

$ ps -A | grep test
$ 31124 pts/0    00:00:00 test
$ cr_checkpoint --term 31124

Reiniciar o programa a partir do arquivo de contexto:

$ cr_restart context.31124

Checkpoint/Restart iniciado pelo próprio processo

Também é possível realizar requisitar o checkpoint de dentro do programa. O exemplo a seguir mostra como um programa pode realizar checkpoint dele mesmo.

#include <stdio.h>
#include <unistd.h>
#include <libcr.h>

static int my_callback(void *data_ptr) 
{
        int did_restart;

        /* realiza o checkpoint */
        did_restart = cr_checkpoint(0);

        if(did_restart) {
                printf("restart\n");
        } else {
                printf("checkpoint\n");
        }

        return 0;
}

int main()
{
        int i, j, id;
        int handle = 0;

        /* inicializa a libcr */
        if (cr_init() < 0) {
                printf("cr_init() failed!\n");
                return 0;
        }

        /* registra a funcao de callback */
        id = cr_register_callback(my_callback, &handle, CR_THREAD_CONTEXT);

        for(i = 0 ;;) {
                /* requisita um checkpoint */
                cr_request();
                for(j = 0; j < 3; j++) {
                        printf("step=%d\n", i);
                        sleep(1);
                        i++;
                }
        }

        return 0;
}

Compilar e executar normalmente:

$ gcc -o test3 test3.c -lcr -lpthread -Wall
$ ./exe

A cada 3 iterações o programa realizar um checkpoint dele mesmo, salvando informações no arquivo de contexto. Para reinicar o programa:

cr_restart context.1388

Referências


Marcelo Veiga Neves < marcelo.veiga at gmail.com >

Ferramentas pessoais