Peter Williams wrote:
> Al Boldi wrote:
> > Peter Williams wrote:
> >> Al Boldi wrote:
> >>> Peter Williams wrote:
> >>>> Al Boldi wrote:
> >>>>>>>> Control parameters for the scheduler can be read/set via files
> >>>>>>>> in:
> >>>>>>>>
> >>>>>>>> /sys/cpusched/<scheduler>/
> >>>>>
> >>>>> The default values for spa make it really easy to lock up the
> >>>>> system.
> >>>>
> >>>> Which one of the SPA schedulers and under what conditions? I've been
> >>>> mucking around with these and may have broken something. If so I'd
> >>>> like to fix it.
> >>>
> >>> spa_no_frills, with a malloc-hog less than timeslice. Setting
> >>> promotion_floor to max unlocks the console.
> >>
> >> OK, you could also try increasing the promotion interval.
> >
> > Seems that this will only delay the lock in spa_svr but not inhibit it.
>
> OK. But turning the promotion mechanism off completely (which is what
> setting the floor to the maximum) runs the risk of a runaway high
> priority task locking the whole system up. IMHO the only SPA scheduler
> where it's safe for the promotion floor to be greater than MAX_RT_PRIO
> is spa_ebs. So a better solution is highly desirable.
Yes.
> I'd like to fix this problem but don't fully understand what it is.
> What do you mean by a malloc-hog? Would it possible for you to give me
> an example of how to reproduce the problem?
Can you try the attached mem-eater passing it the number of kb to be eaten.
i.e. '# while :; do ./eatm 9999 ; done'
This will print the number of bytes eaten and the timing in ms.
Adjust the number of kb to be eaten such that the timing will be less than
timeslice (120ms by default for spa). Switch to another vt and start
pressing enter. A console lockup should follow within seconds for all spas
except ebs.
Thanks!
--
Al
#include <stdio.h>
#include <sys/time.h>
unsigned long elapsed(int start) {
static struct timeval s,e;
if (start) return gettimeofday(&s, NULL);
gettimeofday(&e, NULL);
return ((e.tv_sec - s.tv_sec) * 1000 + (e.tv_usec - s.tv_usec) / 1000);
}
int main(int argc, char **argv) {
unsigned long int i,j,max;
unsigned char *p;
if (argc>1)
max=atol(argv[1]);
else
max=0x60000;
elapsed(1);
for (i=0;((i<max/1024) && (p = (char *)malloc(1024*1024)));i++) {
for (j=0;j<1024;p[1024*j++]=0);
fprintf(stderr,"\r%d MB ",i+1);
}
for (j=max-(i*=1024);((i<max) && (p = (char *)malloc(1024)));i++) {
*p = 0;
}
fprintf(stderr,"%d KB ",j-(max-i));
fprintf(stderr,"eaten in %lu msec (%lu MB/s)\n",elapsed(0),i/(elapsed(0)?:1)*1000/1024);
return 0;
}
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]