【问题标题】:Is getrusage broken in Linux (2.6.30)Linux (2.6.30) 中的 getrusage 是否损坏
【发布时间】:2011-11-04 13:40:18
【问题描述】:

这段代码

 void print_usage(char * msg)
{
    struct rusage usage;
    getrusage(RUSAGE_SELF, &usage);
    printf("Limits: %s\n", msg);
    printf("  %s, %li\n",  " maximum resident set size "    , usage.ru_maxrss  );
    printf("  %s, %li\n",  " integral shared memory size "  , usage.ru_ixrss   );
    printf("  %s, %li\n",  " integral unshared data size "  , usage.ru_idrss   );
    printf("  %s, %li\n",  " integral unshared stack size " , usage.ru_isrss   );
    printf("  %s, %li\n",  " page reclaims "                , usage.ru_minflt  );
    printf("  %s, %li\n",  " page faults "                  , usage.ru_majflt  );
    printf("  %s, %li\n",  " swaps "                        , usage.ru_nswap   );
    printf("  %s, %li\n",  " block input operations "       , usage.ru_inblock );
    printf("  %s, %li\n",  " block output operations "      , usage.ru_oublock );
    printf("  %s, %li\n",  " messages sent "                , usage.ru_msgsnd  );
    printf("  %s, %li\n",  " messages received "            , usage.ru_msgrcv  );
    printf("  %s, %li\n",  " signals received "             , usage.ru_nsignals);
    printf("  %s, %li\n",  " voluntary context switches "   , usage.ru_nvcsw   );
    printf("  %s, %li\n",  " involuntary context switches " , usage.ru_nivcsw  );

}

许多字段只报告零,即使我在相当大的程序中使用它(在 jvm 启动之后)

   maximum resident set size , 0
   integral shared memory size , 0
   integral unshared data size , 0
   integral unshared stack size , 0
   page reclaims , 2514
   page faults , 0
   swaps , 0
   block input operations , 0
   block output operations , 0
   messages sent , 0
   messages received , 0
   signals received , 0
   voluntary context switches , 137
   involuntary context switches , 1

非零字段为“*vcsw”、“*flt”。

所有*rss*swapmsg**block*signals 都为零。

有什么东西坏了吗?

Linux 是 x86 2.6.30。

【问题讨论】:

    标签: c linux linux-kernel getrusage


    【解决方案1】:

    是的,它部分损坏了。并非所有字段都由内核填充。 http://www.kernel.org/doc/man-pages/online/pages/man2/getrusage.2.html

    工作领域:

       ru_utime
       ru_stime
       ru_maxrss (since Linux 2.6.32)
       ru_minflt
       ru_majflt
       ru_inblock (since Linux 2.6.22)
       ru_oublock (since Linux 2.6.22)
       ru_nvcsw (since Linux 2.6)
       ru_nivcsw (since Linux 2.6)
    

    未使用的字段:

       ru_ixrss (unmaintained)
       ru_idrss (unmaintained)
       ru_isrss (unmaintained)
       ru_nswap (unmaintained)
       ru_msgsnd (unmaintained)
       ru_msgrcv (unmaintained)
       ru_nsignals (unmaintained)
    

    【讨论】:

    • 那么,应该使用什么函数来跟踪 Linux 下的内存使用情况?
    • 类似system("cat /proc/pid/stat") 的东西(或手动打开并读取/proc/pid/ 中的文件,例如mapssmaps), as ps` 使用。另外,maxrss 在较新的内核中工作。另外,还有一个malloc_stats 和外部跟踪器。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多