Execução de tarefas em lote e obtenção de um resumo de uso de memória de pico para cada trabalho

2

Eu quero executar um lote de tarefas e depois ter um resumo informando qual era o requisito de pico de memória para cada trabalho. A execução dos trabalhos em um gerenciador de perfis, como valgrind , não é aceitável porque isso tornaria as tarefas mais lentas. Para um trabalho em execução, consegui ler o valor de VmPeak em / proc / JOBPID / status, onde JOBPID é o PID do processo de um trabalho. Mas eu preciso obter o requisito máximo de memória de todos os tempos do trabalho, portanto, eu precisaria obter o valor de VmPeak quando o processo do trabalho estiver prestes a terminar, caso contrário, eu usaria o pico de memória até o momento em que eu lesse VmPeak, que poderia aumentar depois que eu li. Portanto, a menos que haja uma maneira de ler o valor de VmPeak de um processo que tenha terminado, essa abordagem não parece útil. Alguma outra idéia de como obter a quantidade máxima de memória alocada para um processo desde o momento em que foi iniciada até o momento em que foi concluída?

    
por davitenio 24.05.2009 / 12:44

3 respostas

0

Eu estava esperando por uma solução ao longo das linhas de usar um script de gancho que poderia ser acionado quando o processo de um trabalho fosse concluído e que suspenderia brevemente o processo para inspecionar o valor do VmPeak. Modificando o código-fonte de cada trabalho, eu provavelmente poderia facilmente fazer algo semelhante escrevendo um manipulador de saída (usando algo como atexit função). Mas eu não queria tocar na fonte.

A solução que usei foi basicamente o que Kyle Brandt propôs , ou seja, provar o pico de uso da memória a cada poucas unidades de tempo e determinar o máximo desta maneira. Embora eu não tenha que escrever isso sozinho. Eu encontrei uma pequena ferramenta que basicamente faz exatamente isso, chamada memtime .

    
por 25.05.2009 / 18:59
1

A resposta do VmPeak parece uma boa para mim ... Você pode acrescentar vmpeak a um arquivo a cada x segundos e depois encontrar o valor mais alto. Ou, a cada x segundos, execute algo como: VmPeak = curVmPeak if (curVmPeak > VmPeak) .

    
por 24.05.2009 / 14:36
1

Você já tentou substituir a criança ceifadora para o seu programa de mestrado? Você provavelmente tem acesso às estatísticas do processo em que está interessado antes de colher a criança morta.

Minha última aposta seria sobrepor a chamada exit () da libc com sua própria biblioteca compartilhada e fazer com que seu procedimento relate essas estatísticas para você.

    
por 25.05.2009 / 21:47

Tags