Linux下评估程序运行时间及内存占用情况的简便方法

Linux下评估程序运行时间及内存占用情况的简便方法

Sason@CSDN


从一篇英文论文中看到用于简易评估程序运行时间及内存占用情况的方法,查找资料后记录如下。

本文末尾附输出内存使用情况的函数。


1.评估程序运行时间:

Linux下进行C程序开发时,可使用getrusage()函数进行程序运行时间的简易评估。

使用usage.ru_utime进行用户CPU时间(user CPU time)评估,对于系统CPU时间(system CPU time)评估使用usage.ru_stime.

如果程序运行于内核模式(kernel mode),使用ru_stime, 否则使用ru_utime.

getrusage()函数的说明:http://man7.org/linux/man-pages/man2/getrusage.2.html

StackOverFlow的讨论:http://stackoverflow.com/questions/10509660/getting-getrusage-to-measure-system-time-in-c


代码示例:

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>

int main() {
  struct rusage usage;
  struct timeval start, end;
  int i, j, k = 0;

  getrusage(RUSAGE_SELF, &usage);
  start = usage.ru_utime;   //usage.ru_stime
  for (i = 0; i < 10000; i++) {
    /* Double loop for more interesting results. */
    for (j = 0; j < 10000; j++) {
      k += 20;
    }
  }
  getrusage(RUSAGE_SELF, &usage);
  end = usage.ru_utime;   //usage.ru_stime

  printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
  printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
  return 0;
}


2. 评估内存占用情况

察看/proc/[PID]/statm, 其中[PID]是进程的PID号.

推荐阅读:http://elinux.org/Runtime_Memory_Measurement

来自http://www.lindevdoc.org/wiki//proc/pid/statm的解释:

The /proc/pid/statm file describes the memory usage of a process with the specified PID.

It is a single-line text file with following entries separated by whitespace:
    Total process size (like VmSize in /proc/pid/status)
    Resident set size (like VmRSS in /proc/pid/status)
    Number of shared pages
    Number of code pages, not including shared libraries[1]
    Currently unused and always 0 (used to be number of library pages before kernel 2.6)
    Number of data and stack pages together[2]
    Currently unused and always 0 (used to be number of dirty pages before kernel 2.6)

这些输出参数的解释:

Size (total pages) 任务虚拟地址空间的大小 VmSize/4

Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4

Shared(pages) 共享页数 0

Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4

Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4

Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

dt(pages) 脏页数量


增加上个例子中的循环次数,运行后,察看内存占用情况:

admin@admin:~$ cat /proc/3292/statm
501 70 57 1 0 41 0

admin@admin:~$ cat /proc/3292/status
Name:    measuretime
State:    R (running)
Tgid:    3292
Pid:    3292
PPid:    2693
TracerPid:    0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize:    256
Groups:    4 24 27 30 46 109 124 1000
VmPeak:        2108 kB
VmSize:        2004 kB    //等于total pages * 4 = 501 * 4 = 2004
VmLck:           0 kB
VmPin:           0 kB
VmHWM:         280 kB
VmRSS:         280 kB   //等于resident pages * 4 = 70 * 4 = 280
VmData:          28 kB    //VmData + VmStk = 164  164 / 4 = 41 (Drs pages)
VmStk:         136 kB
VmExe:           4 kB
VmLib:        1804 kB
VmPTE:          12 kB
VmSwap:           0 kB
Threads:    1
SigQ:    0/15994
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000000000
SigIgn:    0000000000000000
SigCgt:    0000000000000000
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
CapBnd:    ffffffffffffffff
Cpus_allowed:    f
Cpus_allowed_list:    0-3
Mems_allowed:    1
Mems_allowed_list:    0
voluntary_ctxt_switches:    1
nonvoluntary_ctxt_switches:    41173


打印内存使用情况的函数:

void printMemoryUsage() {
    char buf[30];
    snprintf(buf, 30, "/proc/%u/statm", (unsigned)getpid());
    FILE* pf = fopen(buf, "r");
    if (pf) {
        unsigned size; //       total program size
      //unsigned resident;//   resident set size
      //unsigned share;//      shared pages
      //unsigned text;//       text (code)
      //unsigned lib;//        library
      //unsigned data;//       data/stack
      //unsigned dt;//         dirty pages (unused in Linux 2.6)
        if ( fscanf(pf, "%u" /* %u %u %u %u %u"*/, &size/*, &resident, &share, &text, &lib, &data*/)  > 0);
        cout << (size / 1024.0) << " MB mem used\n";
        //DOMSGCAT(MSTATS, std::setprecision(4) << size / (1024.0) << "MB mem used");
    }
    fclose(pf);
}

欢迎来到我的CSDN博客:http://blog.csdn.net/anshan1984/


 


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux 服务器资源评估公式主要是用于评估服务器的硬件资源是否足够满足用户的需求。以下是一个简单的评估公式: 1. CPU 资源评估:通过查看服务器的 CPU 核心数和频率,估算服务器的处理能力。常用的公式是: (CPU 核心数)×(每核心频率)= CPU 总频率 (CPU 总频率)/(每个请求的平均处理时间)= 并发请求数量 2. 内存资源评估评估服务器的内存容量是否足够存储和处理用户请求。常用的公式是: (每个请求的内存占用量)× (并发请求数量)= 要求的总内存容量 3. 存储资源评估评估服务器的存储容量是否足够存储用户数据。常用的公式是: (每个用户数据的平均大小)× (用户数量)= 存储需求 4. 网络资源评估评估服务器的网络带宽是否足够传输用户数据。常用的公式是: (每个请求的平均数据量)× (并发请求数量)= 需要的网络带宽 以上公式只是一个初步的评估方法,实际评估时还需要考虑服务器的负载均衡、缓存优化等因素。此外,还需要结合实际业务场景和预期的系统性能要求来进行资源评估。 总之,服务器资源评估公式应该是一个综合考虑各项硬件资源和实际需求的方法,以确保服务器能够稳定运行并满足用户的需求。 ### 回答2: Linux 服务器资源评估公式是指根据服务器的配置和使用情况,来评估服务器所需的资源。这些资源包括CPU、内存、磁盘空间和网络带宽等。 首先,对于CPU资源评估,可以使用每个核心的利用率来衡量。通过CPU使用率和负载均衡来确定服务器是否需要更多的CPU资源。如果CPU使用率持续高于80%且负载均衡过高,就可能需要增加CPU资源。 其次,对于内存资源评估,可以通过监测内存使用率和交换空间使用情况来确定是否需要增加内存。如果内存使用率高且交换空间持续使用,就可能需要增加内存。 再次,对于磁盘空间评估,需要考虑服务器上的数据量和文件大小。通过检查磁盘使用率和数据增长率,来确定是否需要增加磁盘空间。如果磁盘使用率快速增长且接近满载,就需要增加磁盘空间。 最后,对于网络带宽评估,可以通过监测网络流量和带宽使用率来确定是否需要增加带宽。如果网络流量太大且带宽使用率持续高于80%,就可能需要增加带宽。 综上所述,Linux 服务器资源评估公式需要考虑CPU、内存、磁盘空间和网络带宽等因素,并通过监测相关指标来确定是否需要增加相应的资源。对这些指标进行连续监控和评估,可以及时对服务器进行资源调整,以保证服务器的正常运行和性能优化。 ### 回答3: Linux服务器资源评估公式是用于评估服务器所需资源的公式。 服务器资源评估的目的是确定服务器所需的处理能力和存储能力,以确保服务器能够正常运行,并满足用户的需求。 一般来说,服务器的资源评估公式包括以下几个方面: 1. CPU资源评估:根据服务器所需处理的请求量和请求类型,以及所需的处理速度,可以使用公式:CPU资源 = 平均请求率 * 平均请求处理时间。 2. 内存资源评估:根据服务器所需处理的数据量和访问模式,以及所需的内存大小,可以使用公式:内存资源 = 平均数据量 * 平均访问时间。 3. 存储资源评估:根据服务器所需存储的数据量和访问模式,以及所需的存储空间,可以使用公式:存储资源 = 平均数据量 * 平均存储时间。 4. 网络资源评估:根据服务器所需传输的数据量和传输模式,以及所需的网络带宽,可以使用公式:网络资源 = 平均数据量 * 平均传输时间。 在实际应用中,根据具体情况,可以进一步细化和调整这些公式,考虑服务器的负载均衡、容错能力、安全性等因素。 通过对服务器资源进行评估,可以帮助管理员合理规划服务器硬件配置,提高服务器的性能和稳定性,满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值