首页 > 解决方案 > 向量变量在 Intel sgx 的 enclave 中可以占用多少内存(MB)?

问题描述

我想在 sgx enclave 中迁移PageRank算法。该算法使用向量来保存边缘关系和矩阵。

vector<size_t> num_outgoing; // number of outgoing links per column
vector< vector<size_t> > rows; // the rowns of the hyperlink matrix
map<string, size_t> nodes_to_idx; // mapping from string node IDs to numeric
map<size_t, string> idx_to_nodes; // mapping from numeric node IDs to string
vector<double> pr; // the pagerank table

当存储少于 9000 条边时,应用程序运行良好。一旦增加到 10000 个或更多边,应用程序就会崩溃,并抛出未处理的异常enter image description here 。我也在飞地外运行相同的代码,它在存储 90000 条边时运行良好。

通过调试,我发现应用程序在以下位置失败。

if (rows.size() <= max_dim) {
    max_dim = max_dim + 1;
    rows.resize(max_dim);
    if (num_outgoing.size() <= max_dim) {
        num_outgoing.resize(max_dim);
    }
}

但是,一旦变量 'rows' 拥有 13896 个元素,就不能将其调整得更大。我很困惑“行”只占用大约 300kb,而“num_outgoing”只占用大约 100kb。它远小于允许的大小。enclave 应用程序总共有 128MB 空间。

我的飞地配置文件如下所示。我尝试更改 StackMaxSize 的值,但是,它似乎没用。

<EnclaveConfiguration>
    <ProdID>0</ProdID>
    <ISVSVN>0</ISVSVN>
    <StackMaxSize>0x400000</StackMaxSize>
    <HeapMaxSize>0x100000</HeapMaxSize>
    <TCSNum>1</TCSNum>
    <TCSPolicy>1</TCSPolicy>
    <DisableDebug>0</DisableDebug>
    <MiscSelect>0</MiscSelect>
    <MiscMask>0xFFFFFFFF</MiscMask>
    <EnableKSS>0</EnableKSS>
    <ISVEXTPRODID_H>0</ISVEXTPRODID_H>
    <ISVEXTPRODID_L>0</ISVEXTPRODID_L>
    <ISVFAMILYID_H>0</ISVFAMILYID_H>
    <ISVFAMILYID_L>0</ISVFAMILYID_L>
</EnclaveConfiguration>

输入边沿的格式如下所示。第一个数字是“from”节点,第二个数字是“to”节点

1 0
2 0
3 1
4 3
5 4
6 0
7 1
8 0
9 1
10 0

我想知道如何配置飞地以使其允许更大的向量变量?win10和ubuntu都存在这个问题。

标签: c++vectorvisual-studio-2017sgxenclave

解决方案


一切似乎你的内存不足。内存限制(堆栈和堆)在配置文件中使用StackMaxSizeand设置HeapMaxSize(有关详细信息,请参阅开发人员参考)。EPC 的大小(128MB 或 256MB)与它无关。在这里,您不受 EPC 大小的限制,而是受堆和堆栈的限制。

增加堆栈大小不会改变任何事情,因为动态分配的内存驻留在堆上。反过来,您应该查看最大堆大小。目前,您将其设置为0x100000(=1MB),这很快就会被您的数据用完。尝试增加它,看看你是否可以容纳更大的向量。

我认为在 Windows 上,您的 enclave 必须完全适合 EPC,但在 Linux 上,您可以创建数十 GB 的 enclave。请注意,一旦您的 (Linux) enclave 内存使用量超过约 90 MB,您将开始注意到 EPC 分页,并且随之而来的是巨大的性能下降。


推荐阅读