代码之家  ›  专栏  ›  技术社区  ›  Timmmm

测量函数调用期间的最大内存使用量

  •  0
  • Timmmm  · 技术社区  · 6 年前

    我有一个Linux /Mac C++库,它以函数调用的形式执行一系列的步骤。我想测量每个步骤中的最大内存使用量。

    我是 对一些特别的解决方案感兴趣,比如启动另一个线程来查询内存使用情况、运行分析器等。

    到目前为止我已经找到 getrusage() 在Mac和Linux上存在,并返回最大内存使用量,但是在每次函数调用后似乎无法重置此最大值。

    有没有办法克服这个限制?

    编辑: 说清楚,我不想征用 malloc() / free() 把所有的事情都记录下来。我想要一个适合运行生产代码的解决方案。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Michael Veksler    6 年前

    这个 malloc free 电话不仅仅是简单的包装纸 sbrk mmap 系统调用。这使得 getrusage 返回与调用不一致的内容 马洛克 自由的 . 在考虑将任何东西返回到系统之前,这些函数的任何非常重要的实现都将在流程本身中管理一个自由列表。

    程序调用 自由的 (或) delete 因此,内存不会立即返回到操作系统(可能永远不会)。这个 自由的 -如果任务调用,则可以重用ED内存 马洛克 ,但不通过其他过程。这使得 地质学 从操作系统的角度来看是正确的,但从程序的角度来看是不正确的。

    在Linux上,您可以使用 mallinfo()

    #include <malloc.h>
    #include <cinttypes>
    std::size_t memsize()
    {
        auto data = mallinfo();
        return data.arena - data.fordblks + data.hblkhd;
    }
    

    在这里, memsize() 将返回从程序角度分配的字节数。它考虑了各种分配技术,例如 SBRK MMAP ,并将舍入和开销视为 malloc() (和) new )

    有了OSX,事情就不那么明朗了。你可以看看 source code of apple's malloc() 特别是在 mstats 在评论中指出:

    /*
     * A Glibc-like mstats() interface.
     *
     * Note that this interface really isn't very good, as it doesn't understand
     * that we may have multiple allocators running at once.  We just massage
     * the result from malloc_zone_statistics in any case.
     */
    

    这看起来不太有希望,而且:

    #include <malloc/malloc.h>
    #include <cinttypes>
    std::size_t memsize()
    {
        auto data = mstats();
        return data.bytes_used;
    }
    

    根据我的实验,看起来不是很好。但这可能比什么都没有要好,或者仅仅依靠 地质学 . 我想你在OSX上运气不好,除非有人能纠正我。

        2
  •  0
  •   Timmmm    6 年前

    我浏览了一下Linux源代码,发现 this :

            /*
             * Writing 5 to /proc/pid/clear_refs resets the peak
             * resident set size to this mm's current rss value.
             */
    

    我还没试过,但看起来很有希望。

    编辑:已将其添加到 this commit

    编辑2:我已经查看了MacOS内核源代码-相应的值存储在 resident_max . 不幸的是,似乎没有重置它的功能。

    编辑3:在Linux上,您可以使用 malloc_info() 然而,似乎没有一种方法可以重置它。它还依赖于您使用 glibc .

    推荐文章