I have no idea what HZ is used on my kernel, but i think i understand the problem now. I still can reproduce it with this: double t, ct, ts; ct = nsec()*1e-6; t = ct + msec; for(;;){ ts = t - ct; sleep(ts); ct = nsec()*1e-6; if(t <= ct){ t += msec; } } The problem is that when sleep is a little bit too fast on every round, t will never catch up with ct. so it sleeps shorter and shorter until t - ct < 1. It all works when changing t += msec to t = ct + msec. It may still do a zero sleep, but the error will not add up. making new kernel... -- cinap