Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Mar 2013 20:27:27 -0400
From:      Rod Person <rodperson@rodperson.com>
To:        freebsd-hackers@freebsd.org
Subject:   Help porting Linux app - getting Free Memory and Real Memory
Message-ID:  <5156316F.9050202@rodperson.com>

next in thread | raw e-mail | index | archive | help
Hi All,

I'm working on a port I maintain and the code has drastically changed. 
Everything is going we except that the program gives warnings that there
isn't enough free memory on the system to perform certain actions.

The program uses Linux call to /proc/meminfo to get this information.
I've worked it out that I should be using the sysctl function to get
this information.  I wrote this code that seems to give the information
that I need, but it does not seem to match up with calling
[CMD=""]sysctl[/CMD] from the command line.

#include <stdio.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#include <sys/limits.h>
#include <vm/vm_param.h>

struct vmtotal getVMinfo(){
  struct vmtotal vm_info;
  int mib[2];
 
  mib[0] = CTL_VM;
  mib[1] = VM_TOTAL;

  size_t len = sizeof(vm_info);
  sysctl(mib, 2, &vm_info, &len, NULL, 0);

  return vm_info;
}

int getSysCtl(int top_level, int next_level){
    int mib[2], ctlvalue;
    size_t len;

    mib[0] = top_level;
    mib[1] = next_level;
    len = sizeof(ctlvalue);

    sysctl(mib, 2, &ctlvalue, &len, NULL, 0);   
   
    return ctlvalue;
}


int main(void){
    int realmem = getSysCtl(CTL_HW, HW_REALMEM);
    int usermem = getSysCtl(CTL_HW, HW_USERMEM);
    int pagesize =     getSysCtl(CTL_HW, HW_PAGESIZE);
   
    printf("Real Memory: %i\n",realmem);
    printf("User Memory: %i\n",usermem);
    printf("Page Size: %i\n",pagesize);
       
    struct vmtotal vmsize = getVMinfo();
    printf("Total VM Memory: %i\n",vmsize.t_vm);
    printf("Total Real Memory: %i\n",vmsize.t_rm);
    printf("shared real memory: %i\n",vmsize.t_rmshr);
    printf("active shared real memory: %i\n",vmsize.t_armshr);
    printf("Total Free Memory pages: %i\n",vmsize.t_free);
}

gives me the following output:

    Real Memory: 1006632960
    User Memory: -1004396544
    Page Size: 4096
    Total VM Memory: 269489480
    Total Real Memory: 153927
    shared real memory: 6015
    active shared real memory: 5736
    Total Free Memory pages: 1497516


But the command sysctl vm.vmtotal

outputs:
    vm.vmtotal:
    System wide totals computed every five seconds: (values in kilobytes)
    ===============================================
    Processes:        (RUNQ: 1 Disk Wait: 0 Page Wait: 0 Sleep: 89)
    Virtual Memory:        (Total: 1078017644K Active: 4167380K)
    Real Memory:        (Total: 617380K Active: 516236K)
    Shared Virtual Memory:    (Total: 38944K Active: 28844K)
    Shared Real Memory:    (Total: 24652K Active: 23536K)
    Free Memory:    5987760K


I see that if I use the formula [B](Total Free Pages * Page
Size)/1024[/B], I get a number extremely close to the Free Memory number
of the command line output, but I'm not sure if that is correct.

Any suggestions?

Thanks

Rod





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5156316F.9050202>