[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::digital_unix

Title:DIGITAL UNIX(FORMERLY KNOWN AS DEC OSF/1)
Notice:Welcome to the Digital UNIX Conference
Moderator:SMURF::DENHAM
Created:Thu Mar 16 1995
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:10068
Total number of notes:35879

9011.0. "Unable to Allocate Memory" by ZPOVC::COLINTONG () Mon Mar 03 1997 05:47

    Hi,
    
    I am working on a benchmark running FFT. The application keep on
    getting "Not enough space" error when the program try to allocate space
    by the following c code:
    
                for ( i=0; i < 44591; i++ )
    		    calloc(4096, sizeof(COMPLEX *))
    
    I have already change the maxdsiz to 2,000,000,000 and maxssiz to
    335,544,320. In the program, I use setrlimit to make sure that the
    process limit RLIMIT_DATA and RLIMIT_STACK are equal to the maximum.
    
    When I monitor the process, it seems that the program exit when VSS
    exceed 1GB and i=32203. 
    
    I think the calloc call may exceed other limit in the system, can
    anyone advise on that ?
    
    Any suggestions will be appreciated.
    
    Best Regards   
    
    Colin Tong, Singapore Technical Support
T.RTitleUserPersonal
Name
DateLines
9011.1COL01::LINNARTZMon Mar 03 1997 08:407
    what's the size of
    max-per-proc-address-spac (subsys proc)
    and
    vm-maxvas (subsys vm)
    
    I guess it's the latter
    Pit
9011.2Check this write-upNETRIX::&quot;[email protected]&quot;SriThu Mar 06 1997 15:37193
How to increase process virtual memory limits in Digital Unix
=============================================================

The best reference source for all this good stuff is the book titled 
"System tuning and Performance management"


1) Do the following command to see what your current parameters are:

# sysconfig -q proc
max-proc-per-user = 256
max-threads-per-user = 1024
per-proc-stack-size = 2097152
max-per-proc-stack-size = 33554432
per-proc-data-size = 134217728
max-per-proc-data-size = 1073741824
max-per-proc-address-space = 1073741824
per-proc-address-space = 1073741824
autonice = 0
open-max-soft = 4096
open-max-hard = 4096
ncallout = 66084
round-robin-switch-rate = 0
sched-min-idle = 0
sched_min_idle = 0
give-boost = 1
give_boost = 1

# sysconfig -q vm
ubc-minpercent = 10
ubc-maxpercent = 100            (Amount of physical memory, RAM,
                                allowed for disk I/O buffering)
ubc-borrowpercent = 10          (let this one be about 10 to 20)
ubc-maxdirtywrites = 5
ubc-wait-for-io = 1
vm-max-wrpgio-kluster = 32768
vm-max-rdpgio-kluster = 16384
vm-cowfaults = 4
vm-mapentries = 200
vm-maxvas = 1073741824
vm-maxwire = 16777216
vm-heappercent = 7
vm-anonklshift = 17
vm-anonklpages = 1
vm-vpagemax = 16384
vm-segmentation = 1
vm-ubcpagesteal = 24
vm-ubcdirtypercent = 10
vm-ubcseqstartpercent = 50
vm-ubcseqpercent = 10
vm-csubmapsize = 1048576
vm-ubcbuffers = 256
vm-syncswapbuffers = 128
vm-asyncswapbuffers = 4
vm-clustermap = 1048576
vm-clustersize = 65536
vm-zone_size = 0
vm-kentry_zone_size = 16777216
vm-syswiredpercent = 80
vm-inswappedmin = 1
vm-page-free-target = 128
vm-page-free-min = 20
vm-page-free-reserved = 10
vm-page-free-optimal = 74


2) You need to increase the following parameters according to your
   requirements:
        (parameters that start with "max" are hard limits that apply to
         super user also. So if you want to change the limit on the total 
         allocated memory of a user process you would tweak the 
         "per-proc-data-size" parameter)

per-proc-stack-size = 2097152           (Can be as huge as vm-maxvas, but
                                        would  be about 10 times lesser)
max-per-proc-stack-size = 33554432      (Can be as huge as vm-maxvas, but
                                        would  be about 10 times lesser)
per-proc-data-size = 134217728          (Can equal vm-maxvas)
max-per-proc-data-size = 1073741824     (Can equal vm-maxvas)
max-per-proc-address-space = 1073741824 (Can equal vm-maxvas)
per-proc-address-space = 1073741824     (Can equal vm-maxvas) 
vm-kentry_zone_size (You can double the default value, if you get a warning 
                        while running the program that kernel zone_size
                        is smaller for managing the system work-load)
vm-maxvas  (Total virtual address space the system has and a user can access)
            on immediate swap systems., its better close to total amount
            of virtual memory you have., but if your system is specifically
            configured for lazy swap., then you might have a much higher
            value)
vm-maxwire ( Amount of RAM (wired) memory allocated per process
            before it uses swap-space for memory allocation;
           Can go close to the amount of your physical memory, 
            which can be allocated per any process. Your RAM - 30 Meg
            would be a good estimate. Don't change the default value
            if you have less than 48 Meg of RAM on the system)


3) See limit command to figure out what are your current limits.
        ("csh" might rarely reports erroneous values, because of some 
        software correction)

4) Run your program and see if it gets you going!

For Example with 128 MB memory (RAM) and about 300 Meg swap, the
following values give you a rough idea of maximum values you can assign 
with immediate swap mode (having the link /sbin/swapdefault to the primary
swap partition). If you have lazy swap and you believe you never use all
the memory you allocate., you can have proc: sub-system values much higher.
(If you have LOTTA memory (RAM) you might have to double the default
values for the vm-kentry_zone_size!)

When you need to change some parameters., you can do so by incorporating
them into /etc/sysconfigtab file. For EXAMPLE my /etc/sysconfigtab file
is: (note that this is purely an example., not a directive)

vm:
        ubc-maxpercent=100
        ubc-borrowpercent = 10
        vm-maxwire = 104857600
        vm-maxvas = 2134217728
        vm-vpagemax = 16000
        vm-syswiredpercent = 90
        vm-kentry_zone_size = 33554432proc:
        per-proc-stack-size = 222097152
        max-per-proc-stack-size = 222097152
        per-proc-data-size = 1134217728
        max-per-proc-data-size = 2134217728
        max-per-proc-address-space = 2134217728
        per-proc-address-space = 2134217728



NOTE1:
        Please make sure which sub-section which parameter belongs before
        trying to change them. Also, once you change've these values
        in /etc/sysconfigtab file., you need a system re-boot to
        update the system with new values.

NOTE2:  
        If you are allocating large arrays you might want to do the following
        thing as root:

     # dbx -k /vmunix /dev/mem
     (dbx) p stackinc
     32768
     (dbx) a stackinc=0x20000
     131072
     (dbx)quit


NOTE3:
        If you get a message fork/procdup:task create fail code 0x11,
        you need to increase the values (in the file /etc/sysconfigtab)

proc:
max-proc-per-user = 256
max-threads-per-user = 2048

        If you are running large web-server or a database server., you
        might want to push these limits further. Just make sure you 
        have enough "maxusers" parameter set to go with it.
        ( max-proc-per-user should be less than 8 times maxusers 
                ie., max-proc-per-user < 8 * maxusers )
        Also, make sure make sure max-threads-per-user is
        about as large or more than max-proc-per-user.


NOTE4:

        For 2.x and 3.0 and 3.2 series versions of operating systems:
        You might need to incease maxusers parameter in your
        kernel configuration file (/sys/conf/HOSTNAME) and re-build
        the kernel (doconfig -c HOSTNAME) to increase the system
        wide number of processes. After this you need to reboot
        with the newly built kernel. 

        For 4.0 or above versions of operating systems:
        maxusers is configurable via sysconfigtab itself. Check the

        current value by typing "/sbin/sysconfig -q proc"

This parameter is particularly important if
you have lotta memory and lotta users/processes going on the
system. You can check it by:

# echo "p maxusers" | dbx -k /vmunix /dev/mem

(If you don't have enough maxusers values., you might see
a message that task/proc table full messages, or fork, too many
processes, or no more processes)


[Posted by WWW Notes gateway]