首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到内存争用的来源?

如何找到内存争用的来源?
EN

Stack Overflow用户
提问于 2020-12-25 19:20:09
回答 1查看 106关注 0票数 0

我编写了一个程序来进行并行计算,如下所示:

代码语言:javascript
复制
public void multiThreadedRun(int nThreads) throws InterruptedException {
    Thread [] threads = new Thread[nThreads];
    // create and start nThreads ...
    for (int i = 0; i < nThreads; ++i) {
        // ... where each thread runs a task-grabbing loop in this::work.
        threads[i] = new Thread(this::work);
        threads[i].start();
    }

    System.out.println("all threads started, waiting for them to finish....");
    for(int i = 0; i < nThreads; ++i)
        threads[i].join();
    System.out.println("all threads finished.");
}

使用EC2 (使用AWS的Corretto )(使用AWS的Corretto),在c5.24xlarge EC2实例上运行这个程序,具有96核和192 to内存,我用nThreads = 1、8和96计时了上述multiThreadedRun方法的执行时间。运行时间为(相当一致):分别为285秒、63秒和42秒。

因此,与单线程运行相比,8个线程的加速比为4.5x,96个线程的加速比仅为6.8倍。我怎么才能弄清楚是什么限制了加速?

我认为有争议的资源是记忆,因为

这是一个不启动任何I/O的计算任务,应该很容易地适应分配给堆的150‘t的内存(所以我不期望有太多的虚拟内存I/O)。

当在96个线程上运行时,我每隔几秒钟调用一次jstack <pid>,并汇总结果(对于执行work()的96个线程):1844年的示例找到一个处于"RUNNABLE“状态的线程,只有76个在等待监视器。因此,似乎在锁上等待的时间并不多(但也许jstack有抽样偏差?)或者,这种排除锁争用的方法还有其他问题吗?)。

假设这确实是内存问题,如何诊断内存争用的源?

更具体而言:

  • 会有用(比较nThreads = 96运行和nThreads =1或nThreads =8运行的时间)吗?注意,我不是问如何使用分析来加速我的代码,而是想了解比较分析结果是否有助于确定内存争用的位置以及如何。

  • 是否有工具可以查看不同变量在每个缓存层中花费的时间,以及是什么触发缓存刷新?

  • 我对哪些对象导致内存争用有一些猜测。有什么方法来检验这样的假设吗?
EN

回答 1

Stack Overflow用户

发布于 2020-12-26 16:52:58

我想看看perf,看看你的CPU在做什么。如果CPU在争夺内存,那么它们应该有一个较低的IPC,因为它们将在内存访问上处于停滞状态。您可以查看toplev,以深入到实际花费时间的地方,而不会在度量中丢失。

另一个技巧,你可以把它应用到太阳相同的进程与一个固定数目的线程。因此,只有一个进程,两个进程,三个进程等,看看你的系统规模有多好。如果进程是CPU绑定的,我希望在达到50个左右的核心之前,性能几乎是线性增长的。

确保你的程序运行足够长的时间,因为JIT需要时间来热身。所以确保你至少跑几分钟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65451059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档