Bill Allombert on Mon, 13 Nov 2000 20:03:16 +0100 (MET)


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: *** the PARI stack overflows !!!


>
>If there is no serious shortage of swap space, you may shamelessly
>run gp with something like -s 50000000 .  This will reserve that
>many bytes of virtual memory  (and thus block that much swap space
>from being used by other processes),  but it will not take up any
>physical RAM unless and until it actually needs it.  (NB this state-
>ment is Solaris-specific;  on other platforms your mileage may vary.
>Contact me directly via my work address in the Reply-To if you have
>Solaris-specific questions arising from this.)

Under Linux things are a little different.

You may allocate as much memory as total of real memory(swap+RAM) minus
the amount of allocated memory.
For example on my machine with 64Mb+128Mb swap I can launch 3 gp -s100M

At this time the memory is not truly allocated. A certain number of
virtual memory pages (a page is typically 4kb ) are created and link
to a zero page with the flag "copy on write". No memory is used until
you write on the page.  Then the page became a real page and the
writing is done.  However a page is never automatically freed by this
process.

A nice trick to do under Linux

$ gp -s 50M
? {big computation}
? allocatemem(0) \\ free page
? allocatemem(50*10^6) \\ realloc page
? {new computation}

You are sure to never use more memory than neccessary, while having a
sort of automatic stack growth.

The big caveats is that a lot of functions use the stack size to
determine if they must garbage collect, so a big stack lead to less
conservative garbage collecting. I thing that PARI should use another
value. Say, a flag -w "wanted_stack_size" to gp and use
wanted_stack_size and not stacksize. The problem with this approach is
what to do when with are between wanted_stack_size and not stacksize ?

You can say the amount of memory of program use with 'ps aux'

USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
bill      3200  0.0  6.3 132604 4032 pts/5   S    19:46   0:00 gp -s 130M
bill      3201  0.0  6.3 132604 4032 pts/7   S    19:46   0:00 gp -s 130M
bill      3225  9.5  6.3 122836 4032 pts/8   S    19:56   0:00 gp -s 120M

VSZ is the virtual memory allocated
RSS is the real memory used.

You can see a GP process use only 4Mb after startup

yellowpig% cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:  64991232 63877120  1114112 35131392  1339392 15491072
Swap: 131567616 18644992 112922624
MemTotal:     63468 kB
MemFree:       1088 kB
MemShared:    34308 kB
Buffers:       1308 kB
Cached:       15128 kB
SwapTotal:   128484 kB
SwapFree:    110276 kB

I hope this will help Linux users to use stack size for the best.

Cheers, Bill.