[PLUG] Linux process scheduling
Jason R. Martin
nsxfreddy at gmail.com
Thu Feb 16 00:19:18 UTC 2006
On 2/15/06, Larry Brigman <larry.brigman at gmail.com> wrote:
> On 2/15/06, Jason R. Martin <nsxfreddy at gmail.com> wrote:
> > On 2/15/06, Larry Brigman <larry.brigman at gmail.com> wrote:
> > > On 2/15/06, Terry Griffin <griffint at pobox.com> wrote:
> > > > Larry Brigman inquired:
> > > > > I have a problem that I have spent at least two days searching on google
> > > > > and
> > > > > not found a solution.
> > > > >
> > > > > Problem background.
> > > > >
> > > > > I want to have a process wake up every x time period and send a network
> > > > > packet.
> > > > > Doing this is not hard but what seems hard to me is that I need this x
> > > > > period to be
> > > > > close to the same every time. Minor variations are allowed and can be
> > > > > compensated
> > > > > in the program. Basically keep a constant packet rate, whatever rate
> > > > > is required
> > > > >
> > > > > When using select or nanosleep (stock kernel 2.6.15-1.1830_FC4smp), I get
> > > > > wild
> > > > > variations of output. Example: request sleep for 2.4 msec. get
> > > > > 7.9msec.; then have
> > > > > to send three packets to make up for the time the process did not send
> > > > > because it
> > > > > was sleeping.
> > > > >
> > > > > The original program that I was using is iperf but when I want to use
> > > > > two different rates
> > > > > using two copies of the program running at the same time they conflict
> > > > > as the program
> > > > > is using a spin loop to get the timing correct. I replace this spin
> > > > > loop with nanosleep
> > > > > and the program output is no longer constant.
> > > > >
> > > > > The really strange thing is when I increase the packet rate (decrease
> > > > > the sleep period)
> > > > > the programs using nanosleep or select don't get as much error ( 1
> > > > > msec. request get
> > > > > 980 usec. to 1020 usec.).
> > > > >
> > > > > The programs use posix threads (which is NPTL) and don't do any
> > > > > special calls for
> > > > > scheduling or priority settings.
> > > > >
> > > >
> > > > Try:
> > > > pthread_attr_init()
> > > > pthread_attr_setschedpolicy() with a policy of SCHED_RR.
> > > > pthread_create() using the attribute initialized above.
> > > >
> > > > The process will have to be started as root for this to work,
> > > > but after the new thread is running you may setuid() to a
> > > > not-root user and retain the SCHED_RR policy.
> > > >
> > > > Man pages: pthread_attr_init(3), pthread_create(3), and setuid(2).
> > > >
> > >
> > > Tried SCHED_RR and SCHED_FIFO. No help.
> > > Is there a default process time slice (tick) that can be adjusted down?
> > >
> > > Would a low latency/preemptive kernel make a difference?
> >
> > Perhaps HZ is set too low on your system? There was a fairly recent
> > change to allow HZ to be configurable (2.6.15? 14? don't
> > remember...), so perhaps you need to set it back to 1000.
> >
>
> Can you change that value on the kernel without a re-compile?
No, it is a .config option. If you have the .config for your current
kernel you can just search for CONFIG_HZ to see what it is set to.
Jason
More information about the PLUG
mailing list