标签: unified-memory

Spark执行内存监控

我想要的是能够监视Spark 执行内存,而不是SparkUI中可用的存储内存。我的意思是,执行内存不是执行者内存

通过执行内存,我的意思是:

执行随机,连接,排序和聚合时,此区域用于缓冲中间数据。该区域的大小是通过spark.shuffle.memoryFraction(default0.2)配置的。根据:Spark 1.6中的统一内存管理

在寻找答案之后,我什么都没找到,只有未解决的StackOverflow问题,仅与存储内存相关的答案或类型模糊的答案使用GangliaCloudera控制台等。

似乎对堆栈溢出有此信息的需求,但没有一个令人满意的答案。这是搜索监视Spark内存时StackOverflow的一些重要帖子

监视Spark执行和存储内存利用率

监视Spark作业的内存使用情况

SPARK:如何监视Spark群集上的内存消耗?

Spark-监视实际使用的执行程序内存

如何通过Spark应用程序监视内存和CPU使用情况?

如何通过Spark应用程序获取内存和CPU使用率?

问题

Spark版本> 2.0

  1. 是否可以监视Spark作业的执行内存?通过监视,我的意思是至少看到已使用/可用,就像在SparkUI的“执行程序”选项卡中为每个执行程序查看存储内存一样。是还是不是?

  2. 我可以用SparkListeners(@JacekLaskowski吗?)历史服务器怎么样?还是唯一的办法就是通过外部工具?Graphana,Ganglia,还有其他人吗?如果是外部工具,您能否指向教程或提供一些更详细的指南?

  3. 我看到了此SPARK-9103跟踪spark的内存使用情况,似乎尚无法监视执行内存。同样,这似乎与SPARK-23206其他内存调整指标有关

  4. 是否Peak Execution memory可靠估计任务中执行内存的使用/占用?例如,如果一个阶段UI表示某个任务在峰值使用1 Gb,而每个执行者我有5 cpu,是否意味着我需要每个执行者至少有5 Gb执行内存来完成一个阶段?

  5. 我们还可以使用其他代理来了解执行内存吗?

  6. 有没有办法知道执行内存何时开始消耗到存储内存中?当我的缓存表从SparkUI的“存储”选项卡中消失或仅保留一部分时,是否意味着它已被执行内存驱逐?

memory memory-management apache-spark unified-memory

11
推荐指数
1
解决办法
4194
查看次数

我们可以将"普通"GPU内存复制到"统一"内存吗?

我们有两个GPU内存,一个用cuMalloc普通设备内存分配,另一个用cuMallocManaged统一内存分配.它们之间可以复制吗?如果我们使用驱动程序API,我应该使用什么方向?

float* normalMem, unifiedMem;
cuMalloc(&normalMem, 100);
cuMallocManaged(&unifiedMem, 100);
cuMemcpyD2D(unifiedMem, normalMem, 100); // ? D2D? or D2H? or else?
Run Code Online (Sandbox Code Playgroud)

cuda unified-memory

5
推荐指数
1
解决办法
514
查看次数

具有映射内存、统一虚拟寻址和统一内存的 GPU 内存超额认购

我正在考虑在 GPU 上处理数据的可能性,这对于 GPU 内存来说太大了,我有几个问题。

如果我理解正确的话,使用映射内存,数据驻留在主内存中,并且仅在访问时才传输到 GPU,因此分配超出 GPU 内存的数据应该不成问题。

UVA与映射内存类似,但数据可以存储在CPU和GPU内存中。但是 GPU 是否有可能在充满自己的数据的情况下访问主内存(与映射内存一样)?这种情况下会不会发生内存溢出呢?我读到,使用映射内存,数据直接进入本地内存,而无需先传输到全局内存,在这种情况下,不应该有任何溢出。这是真的吗?如果是的话,UVA 也是如此吗?

在 CUDA 6.0 中,UM 不允许超额订阅 GPU 内存(并且通常不允许分配比 GPU 多的内存,即使在主内存中也是如此),但在 CUDA 8.0 中这成为可能(https://devblogs .nvidia.com/parallelforall/beyond-gpu-memory-limits-unified-memory-pascal/)。我做对了吗?

cuda gpgpu mapped-memory unified-memory cuda-uva

2
推荐指数
1
解决办法
2040
查看次数

CUDA统一内存可以由另一个CPU线程写入吗?

我正在编写一个程序,该程序从摄像机检索图像并使用CUDA处理它们。为了获得最佳性能,我将CUDA统一内存缓冲区传递给图像获取库,该库在另一个线程中写入该缓冲区。

这会导致各种各样奇怪的结果,使程序无法在我无法访问的库代码中挂起。如果我使用普通的内存缓冲区,然后复制到CUDA,则此问题已解决。因此,我开始怀疑可能不允许从另一个线程进行写操作,并且像我一样用Google搜索时,找不到明确的答案。

那么是否允许从另一个CPU线程访问统一内存缓冲区?

multithreading cuda unified-memory

2
推荐指数
1
解决办法
123
查看次数

使用统一内存时 CUDA 中出现意外的读取访问冲突错误

我有一个对象说d_obj在统一内存上有一些成员,在设备内存上有一些明确的成员。然后我调用一个 CUDA 内核来获取对象并使用它。我想立即让 CPU 在内核调用后立即对统一内存上的成员做一些事情,但失败了。在这里,我使用短代码重现我的问题:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"    
#include <stdio.h>

#define CHECK_CUDA(call)                                            \
{                                                                   \
const cudaError_t error = call;                                     \
if (error != cudaSuccess)                                           \
{                                                                   \
printf("ERROR:: File: %s, Line: %d, ", __FILE__, __LINE__);         \
printf("code: %d, reason: %s\n", error, cudaGetErrorString(error)); \
exit(EXIT_FAILURE);                                                 \
}                                                                   \
}

class MyClass
{
public:
    MyClass(int n_) : n(n_) { }
    void allocateMeOnDevice() {
        CHECK_CUDA(cudaMalloc((void**)&vec, n * sizeof(float)));
    }
    int n;
    float* vec;
};

__global__ void kernel(MyClass* obj) { …
Run Code Online (Sandbox Code Playgroud)

cuda unified-memory

0
推荐指数
1
解决办法
52
查看次数