内核中进程内存测量的更新速度/频率有多快?

丹尼

在回答问题时,在Linux上多长时间更新一次proc文件系统?乔纳森·本·阿夫拉罕Jonathan Ben-Avraham)表示,/proc/.../statm一旦您阅读它,它就会立即生效因为阅读它会直接触发内核回调。

这些内核回调读取的数据如何?这是否总是正确的,还是在malloc /新请求的内存和内核之间提供了可供使用的度量值/proc/.../statm

我试图找到一种方法来测量通过malloc分配的对象的当前大小new

运行一个分配一些数据的小型测试程序,/proc/.../statm调用和调用sbrk()似乎不会立即与该进程分配的内存量相关。

有没有办法获取准确的信息?

程序分配64KB和128KB块

$ ./a.out
MALLOC TEST. Size = 131072
0 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1083 201 173 2 0 341 0
1 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1083 211 182 2 0 341 0
2 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1116 215 185 2 0 374 0
3 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1149 216 185 2 0 407 0
4 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1182 217 185 2 0 440 0
5 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1215 218 185 2 0 473 0
6 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1248 219 185 2 0 506 0
7 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1281 220 185 2 0 539 0
8 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1314 221 185 2 0 572 0
9 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1347 222 185 2 0 605 0

$ ./a.out
MALLOC TEST. Size = 65536
0 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 201 174 2 0 325 0
1 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 211 182 2 0 325 0
2 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 215 185 2 0 325 0
3 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 216 185 2 0 373 0
4 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 217 185 2 0 373 0
5 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 218 185 2 0 373 0
6 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 219 185 2 0 421 0
7 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 220 185 2 0 421 0
8 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 221 185 2 0 421 0
9 ALLOC: HEAP SIZE: 589824  MEMORY USAGE (statm): 1211 222 185 2 0 469 0

测试程序

class CfgProfileList
{
public:
    bool obtainSystemProfileList();
    void leakTest();
    void leakObjTest();
    std::set<std::string> mProfileList;
private:
    char dummy[1024 * 1024]; // use up some space
};

class ComUtil
{
public:
    static void printMemoryUsage();

private:
    static unsigned int mHeapOrigin;
};

/* static */
unsigned int ComUtil::mHeapOrigin = 0;

// Print current process memory utilization
/* static */ void
ComUtil::printMemoryUsage()
{
    unsigned int pHeap = (unsigned int)sbrk(0);
    if (mHeapOrigin == 0)
        mHeapOrigin = pHeap;

    printf("HEAP SIZE: %u\t", pHeap - mHeapOrigin);

    char fname[256], line[256];
    sprintf(fname, "/proc/%d/statm", getpid());

    FILE *pFile = fopen(fname, "r");
    if (!pFile)
        return;

    fgets(line, 255, pFile);
    fclose(pFile);
    printf("MEMORY USAGE (statm): %s", line);
}



void
CfgProfileList::leakTest()
{
    char *pointerList[50];
    int  n = 10;
    int  sleep = 1; 
    int  size  = 64 * 1024;

    printf("MALLOC TEST. Size = %d\n", size);

    for (int i = 0; i < n; i++)
    {
        pointerList[i] = (char *)malloc(size);
        printf("%d ALLOC: ", i);
        ComUtil::printMemoryUsage();
        usleep(sleep);
    }
}

int
main(int argc, char **argv)
{
    CfgProfileList pl;
    pl.leakTest();
}
斯蒂芬·基特

对我来说,您的跟踪记录似乎大部分都可以...(请记住,您的代码没有测量到的初始堆。)

MALLOC TEST. Size = 131072

在这里,您正在分配128KB的块,因此分配器可能不会使用sbrk(),而是mmap()

0 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1083 201 173 2 0 341 0
1 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1083 211 182 2 0 341 0

这很奇怪,您的堆增加了,但是程序页面却没有。

2 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1116 215 185 2 0 374 0
3 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1149 216 185 2 0 407 0
4 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1182 217 185 2 0 440 0
5 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1215 218 185 2 0 473 0
6 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1248 219 185 2 0 506 0
7 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1281 220 185 2 0 539 0
8 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1314 221 185 2 0 572 0
9 ALLOC: HEAP SIZE: 135168  MEMORY USAGE (statm): 1347 222 185 2 0 605 0

在这里,每个分配都占用了堆额外的33页或132KB的空间,因此一切正常。

MALLOC TEST. Size = 65536
0 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 201 174 2 0 325 0
1 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 211 182 2 0 325 0
2 ALLOC: HEAP SIZE: 0   MEMORY USAGE (statm): 1067 215 185 2 0 325 0

在这里,您的分配适合初始堆。

3 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 216 185 2 0 373 0
4 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 217 185 2 0 373 0
5 ALLOC: HEAP SIZE: 196608  MEMORY USAGE (statm): 1115 218 185 2 0 373 0

堆增加了192KB,该堆与分配的页面匹配,并且适合三个分配。

6 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 219 185 2 0 421 0
7 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 220 185 2 0 421 0
8 ALLOC: HEAP SIZE: 393216  MEMORY USAGE (statm): 1163 221 185 2 0 421 0

又一样...

9 ALLOC: HEAP SIZE: 589824  MEMORY USAGE (statm): 1211 222 185 2 0 469 0

... 然后再次。

一起跑步strace -e brk,mmap将有助于您了解事物。从这些信息sbrk()/proc准确,不得延误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算哈希的速度有多快?

来自分类Dev

netstat捕获网络快照的速度有多快?

来自分类Dev

使用 FFT 的卷积速度有多快

来自分类Dev

测量OpenCL内核的内存吞吐量

来自分类Dev

在这个基准测试中,Node的速度有多快?

来自分类Dev

Euler专案-haskell程式码的速度有多快?

来自分类Dev

PC迷如何知道旋转速度有多快?

来自分类Dev

std :: swap用于整数类型的速度有多快?

来自分类Dev

Euler专案-haskell程式码的速度有多快?

来自分类Dev

如何减少Ubuntu更新内核的频率?

来自分类Dev

防止Linux内核从进程获取分配的内存

来自分类Dev

测量OpenMPI中进程之间的数据传输

来自分类Dev

内存隔离栅会降低所有CPU内核的速度吗?

来自分类Dev

在Linux进程的虚拟内存空间中使用内核部分有什么用?

来自分类Dev

在Linux进程的虚拟内存空间中使用内核部分有什么用?

来自分类Dev

Clearcase签入的速度如此之慢:签入大量已修改文件的速度有多快?

来自分类Dev

Googe Places API 以 8.62 Mbps 下载速度返回结果的速度应该有多快?

来自分类Dev

如何测量共享内存中boost进程间向量的大小?

来自分类Dev

测量短暂进程的内存使用情况

来自分类Dev

VS的诊断工具会测量总进程内存还是当前进程内存

来自分类Dev

Linux内核0.11中进程0的堆栈

来自分类Dev

给定截止频率的低通滤波器android加速度计测量

来自分类Dev

通过TeraCopy与Windows 7本机复制功能复制文件的速度有多快?

来自分类Dev

我如何知道CPU在POWER8服务器上运行的速度有多快?

来自分类Dev

C#。一直将Byte插入Struct的速度有多快?

来自分类Dev

谷歌浏览器可以知道我输入的速度有多快吗?

来自分类Dev

使用watchOS 2,我可以在iPhone和Apple Watch之间发送UIImage的速度有多快?

来自分类Dev

长度有多快?

来自分类Dev

长度有多快?

Related 相关文章

  1. 1

    计算哈希的速度有多快?

  2. 2

    netstat捕获网络快照的速度有多快?

  3. 3

    使用 FFT 的卷积速度有多快

  4. 4

    测量OpenCL内核的内存吞吐量

  5. 5

    在这个基准测试中,Node的速度有多快?

  6. 6

    Euler专案-haskell程式码的速度有多快?

  7. 7

    PC迷如何知道旋转速度有多快?

  8. 8

    std :: swap用于整数类型的速度有多快?

  9. 9

    Euler专案-haskell程式码的速度有多快?

  10. 10

    如何减少Ubuntu更新内核的频率?

  11. 11

    防止Linux内核从进程获取分配的内存

  12. 12

    测量OpenMPI中进程之间的数据传输

  13. 13

    内存隔离栅会降低所有CPU内核的速度吗?

  14. 14

    在Linux进程的虚拟内存空间中使用内核部分有什么用?

  15. 15

    在Linux进程的虚拟内存空间中使用内核部分有什么用?

  16. 16

    Clearcase签入的速度如此之慢:签入大量已修改文件的速度有多快?

  17. 17

    Googe Places API 以 8.62 Mbps 下载速度返回结果的速度应该有多快?

  18. 18

    如何测量共享内存中boost进程间向量的大小?

  19. 19

    测量短暂进程的内存使用情况

  20. 20

    VS的诊断工具会测量总进程内存还是当前进程内存

  21. 21

    Linux内核0.11中进程0的堆栈

  22. 22

    给定截止频率的低通滤波器android加速度计测量

  23. 23

    通过TeraCopy与Windows 7本机复制功能复制文件的速度有多快?

  24. 24

    我如何知道CPU在POWER8服务器上运行的速度有多快?

  25. 25

    C#。一直将Byte插入Struct的速度有多快?

  26. 26

    谷歌浏览器可以知道我输入的速度有多快吗?

  27. 27

    使用watchOS 2,我可以在iPhone和Apple Watch之间发送UIImage的速度有多快?

  28. 28

    长度有多快?

  29. 29

    长度有多快?

热门标签

归档