RFC: patch to trigger thread stats output from cyclictest with SIGHUP
John,
Steven suggested a feature for cyclictest that I'd actually been whining about (internally anyway). During long rteval runs there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Of course if we get this going then we need to figure out how to wire it into rteval as well :).
Clark
src/cyclictest/cyclictest.c +19 -2
@@ -199,6 +199,11 @@ static char **traceptr;static int traceopt_count;static int traceopt_size; +static struct thread_param **parameters; +static struct thread_stat **statistics; + +static void print_stat (struct thread_param *par,int index,int verbose); +static int latency_target_fd =-1 ;static int32_t latency_target_value =0 ;
@@ -1368,6 +1373,19 @@ static int check_timer(void)static void sighand (int sig) { +if (sig ==SIGHUP ) { +int i; +int oldquiet = quiet; + + quiet =0 ; +printf ("#---------------------------\n" ); +printf ("# cyclictest current status:\n" ); +for (i =0 ; i < num_threads; i++) +print_stat (parameters[i], i,0 ); +printf ("#---------------------------\n" ); + quiet = oldquiet; +return ; + } shutdown =1 ;if (refresh_on_max)pthread_cond_signal (&refresh_on_max_cond);
@@ -1503,8 +1521,6 @@ int main(int argc, char **argv)sigset_t sigset;int signum =SIGALRM ;int mode; -struct thread_param **parameters; -struct thread_stat **statistics;int max_cpus =sysconf (_SC_NPROCESSORS_CONF);int i, ret =-1 ;int status;
@@ -1642,6 +1658,7 @@ int main(int argc, char **argv)signal (SIGINT , sighand);signal (SIGTERM , sighand); +signal (SIGHUP , sighand); parameters =calloc (num_threads,sizeof (struct thread_param *));if (!parameters)
Quoted 9 lines · Clark Williams
John,
Steven suggested a feature for cyclictest that I'd actually been whining about (internally anyway). During long rteval runs there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Is USR1 already in use for something? That would be consistent with how things like dd use USR1 signal - to report interim stats.
P.
--
Quoted 60 lines
Of course if we get this going then we need to figure out how to wire it into rteval as well :).
Clark
src/cyclictest/cyclictest.c +19
-2@@ -199,6 +199,11 @@ static char **traceptr;static int traceopt_count;static int traceopt_size; +static struct thread_param **parameters; +static struct thread_stat **statistics; + +static void print_stat (struct thread_param *par,int index,int verbose); +static int latency_target_fd =-1 ;static int32_t latency_target_value =0 ;@@ -1368,6 +1373,19 @@ static int check_timer(void)static void sighand (int sig) { +if (sig ==SIGHUP ) { +int i; +int oldquiet = quiet; + + quiet =0 ; +printf ("#---------------------------\n" ); +printf ("# cyclictest current status:\n" ); +for (i =0 ; i < num_threads; i++) +print_stat (parameters[i], i,0 ); +printf ("#---------------------------\n" ); + quiet = oldquiet; +return ; + } shutdown =1 ;if (refresh_on_max)pthread_cond_signal (&refresh_on_max_cond);@@ -1503,8 +1521,6 @@ int main(int argc, char **argv)sigset_t sigset;int signum =SIGALRM ;int mode; -struct thread_param **parameters; -struct thread_stat **statistics;int max_cpus =sysconf (_SC_NPROCESSORS_CONF);int i, ret =-1 ;int status;@@ -1642,6 +1658,7 @@ int main(int argc, char **argv)signal (SIGINT , sighand);signal (SIGTERM , sighand); +signal (SIGHUP , sighand); parameters =calloc (num_threads,sizeof (struct thread_param *));if (!parameters)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Quoted 12 lines · Paul Gortmaker
Quoted 9 lines · Clark Williams
John,
Steven suggested a feature for cyclictest that I'd actually been
whining about (internally anyway). During long rteval runs
there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Quoted 4 lines
Is USR1 already in use for something? That would be consistent with how things like dd use USR1 signal - to report interim stats.
P.
+1 ... I was just about to say exactly the same.
- --
kind regards,
David Sommerseth
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iEYEARECAAYFAlE+DCsACgkQIIWEatLf4Hc4lACdHs1Cuv4u1tJxkoDOfmKXSCiL s/gAn1XHwrcn2jiNF2Q+0EC22aj+j1Ah
=nME1
-----END PGP SIGNATURE-----
Quoted 16 lines · On Mon, 11 Mar 2013 17:54:05 +0100 David Sommerseth <[email protected]> wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1Quoted 12 lines · Paul Gortmaker
Quoted 9 lines · Clark Williams
John,
Steven suggested a feature for cyclictest that I'd actually been
whining about (internally anyway). During long rteval runs
there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Quoted 8 lines
Quoted 4 lines
Is USR1 already in use for something? That would be consistent with how things like dd use USR1 signal - to report interim stats.
P.
+1 ... I was just about to say exactly the same.
Good points. As I recall SIGHUP is usually used to force a re-read of configs (which doesn't really apply here).
Here's a revised version using SIGUSR1:
src/cyclictest/cyclictest.c +19 -2
@@ -199,6 +199,11 @@ static char **traceptr;static int traceopt_count;static int traceopt_size; +static struct thread_param **parameters; +static struct thread_stat **statistics; + +static void print_stat (struct thread_param *par,int index,int verbose); +static int latency_target_fd =-1 ;static int32_t latency_target_value =0 ;
@@ -1368,6 +1373,19 @@ static int check_timer(void)static void sighand (int sig) { +if (sig ==SIGUSR1 ) { +int i; +int oldquiet = quiet; + + quiet =0 ; +printf ("#---------------------------\n" ); +printf ("# cyclictest current status:\n" ); +for (i =0 ; i < num_threads; i++) +print_stat (parameters[i], i,0 ); +printf ("#---------------------------\n" ); + quiet = oldquiet; +return ; + } shutdown =1 ;if (refresh_on_max)pthread_cond_signal (&refresh_on_max_cond);
@@ -1503,8 +1521,6 @@ int main(int argc, char **argv)sigset_t sigset;int signum =SIGALRM ;int mode; -struct thread_param **parameters; -struct thread_stat **statistics;int max_cpus =sysconf (_SC_NPROCESSORS_CONF);int i, ret =-1 ;int status;
@@ -1642,6 +1658,7 @@ int main(int argc, char **argv)signal (SIGINT , sighand);signal (SIGTERM , sighand); +signal (SIGUSR1 , sighand); parameters =calloc (num_threads,sizeof (struct thread_param *));if (!parameters)
Quoted 63 lines · Clark Williams
John,
Steven suggested a feature for cyclictest that I'd actually been whining about (internally anyway). During long rteval runs there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Of course if we get this going then we need to figure out how to wire it into rteval as well :).
Clark
src/cyclictest/cyclictest.c +18
-2@@ -199,6 +199,11 @@ static char **traceptr;static int traceopt_count;static int traceopt_size; +static struct thread_param **parameters; +static struct thread_stat **statistics; + +static void print_stat (struct thread_param *par,int index,int verbose); +static int latency_target_fd =-1 ;static int32_t latency_target_value =0 ;@@ -1368,6 +1373,19 @@ static int check_timer(void)static void sighand (int sig) { +if (sig ==SIGHUP ) { +int i; +int oldquiet = quiet; + + quiet =0 ; +printf ("#---------------------------\n" ); +printf ("# cyclictest current status:\n" ); +for (i =0 ; i < num_threads; i++) +print_stat (parameters[i], i,0 ); +printf ("#---------------------------\n" ); + quiet = oldquiet; +return ; + } shutdown =1 ;if (refresh_on_max)pthread_cond_signal (&refresh_on_max_cond);@@ -1503,8 +1521,6 @@ int main(int argc, char **argv)sigset_t sigset;int signum =SIGALRM ;int mode; -struct thread_param **parameters; -struct thread_stat **statistics;int max_cpus =sysconf (_SC_NPROCESSORS_CONF);int i, ret =-1 ;int status;
src/cyclictest/cyclictest.c int main(int argc, char **argv) · line 1664
Quoted 7 lines
src/cyclictest/cyclictest.c +1
-0@@ -1642,6 +1658,7 @@ int main(int argc, char **argv)signal (SIGINT , sighand);signal (SIGTERM , sighand); +signal (SIGHUP , sighand); parameters =calloc (num_threads,sizeof (struct thread_param *));if (!parameters)
Where's your SOB Clark? I'm assuming that you and not Steve are the author. I can add this to my development dir for people to try.
Thanks
John
Quoted 78 lines · On Tue, 12 Mar 2013 13:10:43 +0100 (CET) John Kacur <[email protected]> wrote:
Quoted 63 lines · Clark Williams
John,
Steven suggested a feature for cyclictest that I'd actually been whining about (internally anyway). During long rteval runs there's really no feedback available if you want to know how the run is progressing. Steven suggested sending SIGHUP and dumping the current state. Below is a patch that seems to work for cyclictest; just wanted to get some feedback on whether this would be acceptable behaviour.
Of course if we get this going then we need to figure out how to wire it into rteval as well :).
Clark
src/cyclictest/cyclictest.c +18
-2@@ -199,6 +199,11 @@ static char **traceptr;static int traceopt_count;static int traceopt_size; +static struct thread_param **parameters; +static struct thread_stat **statistics; + +static void print_stat (struct thread_param *par,int index,int verbose); +static int latency_target_fd =-1 ;static int32_t latency_target_value =0 ;@@ -1368,6 +1373,19 @@ static int check_timer(void)static void sighand (int sig) { +if (sig ==SIGHUP ) { +int i; +int oldquiet = quiet; + + quiet =0 ; +printf ("#---------------------------\n" ); +printf ("# cyclictest current status:\n" ); +for (i =0 ; i < num_threads; i++) +print_stat (parameters[i], i,0 ); +printf ("#---------------------------\n" ); + quiet = oldquiet; +return ; + } shutdown =1 ;if (refresh_on_max)pthread_cond_signal (&refresh_on_max_cond);@@ -1503,8 +1521,6 @@ int main(int argc, char **argv)sigset_t sigset;int signum =SIGALRM ;int mode; -struct thread_param **parameters; -struct thread_stat **statistics;int max_cpus =sysconf (_SC_NPROCESSORS_CONF);int i, ret =-1 ;int status;src/cyclictest/cyclictest.c int main(int argc, char **argv) · line 1664
Quoted 7 lines
src/cyclictest/cyclictest.c +1
-0@@ -1642,6 +1658,7 @@ int main(int argc, char **argv)signal (SIGINT , sighand);signal (SIGTERM , sighand); +signal (SIGHUP , sighand); parameters =calloc (num_threads,sizeof (struct thread_param *));if (!parameters)Where's your SOB Clark? I'm assuming that you and not Steve are the author. I can add this to my development dir for people to try.
Quoted 3 lines
Thanks
John
I haven't even committed this to my tree yet :). I was actually toying with the idea of having an option to setup a fifo what would allow you to get the stats without having to screen-scrape stdout. Was thinking about adding a -F/--fifo option where you tell cyclictest where to put the fifo:
# cyclictest --numa -p95 -m -F /tmp/cyclictest.fifo
Then you could just cat the fifo and get a snapshot, or your program could open and read it. Still turning this over in my head though.
Clark