I got frusted a bit by this problem (smsd using incredible much cpu
even when idle) so I ran smsd through valgrind (well, callgrind).
It looks like tons of time is spend in an usleep(100); (yes, hundred).
I always thought that Linux would just round it up to the next
scheduling interval but it looks like that is a busy loop these days?
I changed it from 100us to 10ms and now the cpu usage dropped from on
average > 8% to < 1%. And that is on a "Intel(R) Core(TM) i7-3930K CPU
@ 3.20GHz".
Really something that communicates with a device at 19.2kBps should
not use that much cpu.
So please apply.
Thanks.
Oh and I think there maybe other possibilities of optimizing smsd left.
Regards,
Folkert van Heusden
www.smartwinning.info
diff -uNrBbd smstools-3.1.15.org/src/extras.c smstools-3.1.15/src/extras.c
--- smstools-3.1.15.org/src/extras.c 2013-11-08 10:16:02.000000000 +0100
+++ smstools-3.1.15/src/extras.c 2014-11-17 14:01:44.915072505 +0100
@@ -1436,7 +1436,7 @@
struct timezone tz;
unsigned long long now;
- do
+ for(;;)
{
gettimeofday(&tv, &tz);
now = (unsigned long long)tv.tv_sec *1000000 +tv.tv_usec;
@@ -1444,10 +1444,11 @@
if (terminate == 1)
return 1;
- if (now < target_time)
- usleep(100);
+ if (now >= target_time)
+ break;
+
+ usleep(10000);
}
- while (now < target_time);
return 0;
}