Grave o usuário / sistema / tempo real de um processo no Linux / Bash com maior precisão

2

O que estou procurando é algo nos moldes de /usr/bin/time , no entanto, isso geralmente não tem precisão suficiente.

Estou executando um programa em C (que eu posso editar e recompilar) e preciso monitorar o usuário / sistema / tempo real, uso do processador, pico de memória, etc.

No entanto, o tempo de execução normal está além da precisão do comando time . time fornece precisão em milissegundos, no entanto, a precisão em nanossegundos é preferida. Décimo de milisegundo pode funcionar, mas eu divago.

O que eu tenho agora é um script bash simples que registra a hora de início em nanossegundos, executa o programa e, em seguida, registra a hora de término em nanossegundos e, em seguida, informa a diferença. Isso é ótimo para o tempo Real (relógio de parede), mas não tão bom para o tempo de execução, porque essa é uma máquina multiusuário.

Notas: Estou restrito ao Bash como shell; a máquina está executando o CentOS 6.4; Estou aberto a soluções em C que não exigem a instalação de nenhum software novo.

    
por Devon Finninger 02.05.2014 / 05:58

1 resposta

0

Você pode fazer isso usando systemtap . De um dos exemplos em seu site:

general/stopwatches.stp - See the amount of wall clock time a process spends in various states keywords: TIME

The stopwatch.stp script illustrates how to use multiple stopwatches record how much wallclock time a process spends in kernel- and user-space. On exit the script prints out the time in seconds, milliseconds, microseconds, and nanoseconds. Note that this output of this script is not directly comparable to the time command because time records the time that the process is actually active in kernel- and user-space.

# stap stopwatches.stp -c "sleep 1"

Código daquele exemplo reproduzido aqui para ser completo:

#! /usr/bin/env stap
# Copyright (C) 2012 Red Hat, Inc.
# by William Cohen <[email protected]>
#
# exercise the stopwatch tapset

probe begin
{
  start_stopwatch("wall");
  /* The next two lines assumes that target is running and in user-space. */
  start_stopwatch("user");
  stop_stopwatch("system")
}

probe syscall.*
{
   if (pid() != target()) next
   stop_stopwatch("user")
   start_stopwatch("system")
}

probe syscall.*.return
{
   if (pid() != target()) next
   start_stopwatch("user")
   stop_stopwatch("system")
}

probe end
{
  stop_stopwatch("wall")
  stop_stopwatch("user")
  stop_stopwatch("system")

  w = read_stopwatch_us("wall")
  u = read_stopwatch_us("user")
  s = read_stopwatch_us("system")
  printf ("wall clock                 %12dus\n", w);
  printf ("wall clock in user-space   %12dus\n", u);
  printf ("wall clock in kernel-space %12dus\n", s);

   delete_stopwatch("wall")
   delete_stopwatch("user")
   delete_stopwatch("system")
 }
    
por 02.05.2014 / 11:33

Tags