Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.06.2004, 07:40
common



system ist linux 2.6.foo

ich hab getrusage() in mein programm foo.cpp implementiert, und es laeuft ansich auch
aber
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */

sind generell 0
ist das nun ein zeichen herrausragender performance, oder ist das nicht sauber implementiert

wenn das ein fehler meinerseits sein sollte, wie nutze ich die zahlen sinnvoll, ich hab in einem ircd die folgende umsetzung gefunden

Quellcode:struct rusage  rus;
  time_t         secs;
  time_t         rup;

#ifdef  hz
# define hzz hz
#else
# ifdef HZ
#  define hzz HZ
# else
  int   hzz = 1;
# endif
#endif


  rup = (CurrentTime - me.since) * hzz;
  if (0 == rup)
    rup = 1;
  secs = rus.ru_utime.tv_sec + rus.ru_stime.tv_sec;
  if (0 == secs)
    secs = 1;
                                                                                                                                                            
  rup = (CurrentTime - me.since) * hzz;
  if (0 == rup)
    rup = 1;
                                                                                                                                                         sendto_one(cptr,
             ":%s %d %s :CPU Secs %d:%d User %d:%d System %d:%d",
             me.name, RPL_STATSDEBUG, nick, secs/60, secs%60,
             rus.ru_utime.tv_sec/60, rus.ru_utime.tv_sec%60,
             rus.ru_stime.tv_sec/60, rus.ru_stime.tv_sec%60);

  sendto_one(cptr, ":%s %d %s :RSS %d ShMem %d Data %d Stack %d",
             me.name, RPL_STATSDEBUG, nick, rus.ru_maxrss,
             rus.ru_ixrss / rup, rus.ru_idrss / rup,
             rus.ru_isrss / rup);

  sendto_one(cptr, ":%s %d %s :Swaps %d Reclaims %d Faults %d",
             me.name, RPL_STATSDEBUG, nick, rus.ru_nswap,
             rus.ru_minflt, rus.ru_majflt);
  sendto_one(cptr, ":%s %d %s :Block in %d out %d",
             me.name, RPL_STATSDEBUG, nick, rus.ru_inblock,
             rus.ru_oublock);
  sendto_one(cptr, ":%s %d %s :Msg Rcv %d Send %d",
             me.name, RPL_STATSDEBUG, nick, rus.ru_msgrcv, rus.ru_msgsnd);
  sendto_one(cptr, ":%s %d %s :Signals %d Context Vol. %d Invol %d",
             me.name, RPL_STATSDEBUG, nick, rus.ru_nsignals,
             rus.ru_nvcsw, rus.ru_nivcsw);
um das 2te sendto_one() geht es konkret
in meinen augen macht es wenig sinn rechenoperationen mit 2 struct timeval zu machen ...
ich hab den ircd mal testweise kompiliert, und auch dort sind alle fraglichen werte =0
die ausgabe ist

--- CPU Secs 0:03 User 0:02 System 0:01
--- RSS 0 ShMem 0 Data 0 Stack 0
--- Swaps 0 Reclaims 1104 Faults 731
--- Block in 0 out 0
--- Msg Rcv 0 Send 0
--- Signals 0 Context Vol. 0 Invol 0

wenn da jemand eine erlaeuterung hat die nicht aus nem header kopiert ist oder nen direktlink auf google waere ich sehr dankbar
getrusage ist in google total unterrepraesentiert

zwotes problem ist etwas einfacherer natur -hoffe ich-
wenn man
Quellcode:const char foostruct[]
{
   "bert"
   "lisa"
}
hat, kann man mit
Quellcode:rand()%(sizeof(foostruct)/sizeof(*foostruct))
nen existierenden index fuer das struct gewinnen

nun haben bert und lisa allerdings nicht nur nen namen, sondern auchnoch ne addresse, bert hat sogar noch ne telefonnummer
wir beschraenken die gesamtmoeglichen informationen pro eintrag auf 4
der erste eintrag zeigt auf, wieviel informationen wir ueber den user haben

Quellcode:const char fooextstruct[][5]{
  {
    "3",
    "bert",
    "barstrasse",
    "2342",
    ""
  }
  
  {
    "2",
    "lias",
    "schluchtenweg",
    "",
    ""
  }
}
wie kann man nun ein existierenden index auf ein user mittels rand() bekommen, ohne zu wissen wieviel user in dem struct sind

frage 2 ist trivial da analog, ich zieh sie zurueck

--


Dieser Beitrag wurde am 27.06.2004 um 09:45 von common bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
27.06.2004, 11:46
common



http://www-124.ibm.com/pipermail/jikesrvm-researchers/2004-April/002884.html

linux stellt das idealerweise nicht zur verfuegung

aber im prc kann man des kram auslesen
Quellcode:cat /proc/self/status
Name:   cat
State:  R (running)
SleepAVG:       91%
Tgid:   3019
Pid:    3019
PPid:   24357
TracerPid:      0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 1000 29
VmSize:     3156 kB
VmLck:         0 kB
VmRSS:       412 kB
VmData:      148 kB
VmStk:         8 kB
VmExe:        16 kB
VmLib:      1296 kB
Threads:        1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
etwas kompakter und (hoffentlich) auch den gleichen informationsgehalt findet man in
/proc/self/statm

cat /proc/self/statm
789 103 750 5 0 784 0

wie diese zahlen zu werten sind steht im manual zum proc interface, ich hab das mal als kommentar in den dummy gepastet

kleiner dummy um aus dem proc die stats auszulesen
Quellcode:int my_getrusage(int who, struct rusage *usage)
{
    
/*                
                long   ru_maxrss;        // maximum resident set size
                long   ru_ixrss;         // integral shared memory size
                long   ru_idrss;         // integral unshared data size
                long   ru_isrss;         // integral unshared stack size
*/
/*
              statm  Provides information about memory status in pages.  The columns are:
                      size       total program size
                      resident   resident set size
                      share      shared pages
                      trs        text (code)
                      drs        data/stack
                      lrs        library
                      dt         dirty pages
*/

    FILE *fptr;
    char szProcBuf[1024];
    char *pszLineStart;
    char *pszLineStopp;
    char *pszLine;
    
    int rgMemStats[6];
    int i=0;

    if (!(fptr=fopen("/proc/self/statm","r")))
    {
        printf("Error, safe_getrusage() could not open /proc/self/status for read %s %i \n",__FILE__, __LINE__);
        return -1;

    }
    pszLine = fgets(szProcBuf,1024,fptr);
    printf("LIne is %s\n",szProcBuf);
    pszLineStart = pszLine;
    while(*pszLine != '\n')
    {
        if (*pszLine == ' ')
        {
            *pszLine = '\0';
            pszLineStopp = pszLine;
            rgMemStats[i] = atoi(pszLineStart);
            pszLineStart  = pszLine +1;
//            printf("Value is int |%i|     str |%s|\n",rgMemStats[i],pszLineStart);
            i++;
        }

        pszLine++;
    }
    fclose(fptr);
    getrusage(who,usage);
    usage->ru_maxrss = rgMemStats[1];
    usage->ru_ixrss = rgMemStats[2];
    usage->ru_idrss = rgMemStats[4];
    usage->ru_isrss = rgMemStats[4];

    return 0;
}
beim mapping bin ich mir sehr unsicher, da ich nicht weiss was ungefaehr was entspricht
wenn da jemand ne gute idee hat, kommen lassen
dass ru_idrss == ru_isrss ist mag selten der fall sein, aber ich weiss nicht was dem sonst entspricht

--


Dieser Beitrag wurde am 27.06.2004 um 11:46 von common bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche