diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c
index a22e0a0565dabecfa928d2bd6d4c7c5df6c72553..507154673538a4570c058f1af5ecf4db8771871d 100644
--- a/common/utils/T/tracer/utils.c
+++ b/common/utils/T/tracer/utils.c
@@ -7,6 +7,7 @@
 #include <ctype.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <math.h>
 
 void new_thread(void *(*f)(void *), void *data)
 {
@@ -36,6 +37,16 @@ void sleepms(int ms)
   if (nanosleep(&t, NULL)) abort();
 }
 
+void bps(char *out, float v, char *suffix)
+{
+  static char *bps_unit[4] = { "", "k", "M", "G" };
+  int flog;
+  if (v < 1000) flog = 0; else flog = floor(floor(log10(v)) / 3);
+  if (flog > 3) flog = 3;
+  v /= pow(10, flog*3);
+  sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix);
+}
+
 /****************************************************************************/
 /* list                                                                     */
 /****************************************************************************/
diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h
index 086e92b5dcb4cb0e2fd6476132a815b3b018ba6a..3be6cfe1a7f67af65282d7494c7d1a172fc163d7 100644
--- a/common/utils/T/tracer/utils.h
+++ b/common/utils/T/tracer/utils.h
@@ -3,6 +3,7 @@
 
 void new_thread(void *(*f)(void *), void *data);
 void sleepms(int ms);
+void bps(char *out, float v, char *suffix);
 
 /****************************************************************************/
 /* list                                                                     */