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
- BLCR Administrator's Guide: http://mantis.lbl.gov/blcr/doc/html/BLCR_Admin_Guide.html
- BLCR User's Guide: http://mantis.lbl.gov/blcr/doc/html/BLCR_Users_Guide.html
- BLCR Frequently Asked Questions: http://mantis.lbl.gov/blcr/doc/html/FAQ.html
Marcelo Veiga Neves < marcelo.veiga at gmail.com >
