c++ - 向量变量在 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都存在这个问题。
解决方案
一切似乎你的内存不足。内存限制(堆栈和堆)在配置文件中使用StackMaxSize
and设置HeapMaxSize
(有关详细信息,请参阅开发人员参考)。EPC 的大小(128MB 或 256MB)与它无关。在这里,您不受 EPC 大小的限制,而是受堆和堆栈的限制。
增加堆栈大小不会改变任何事情,因为动态分配的内存驻留在堆上。反过来,您应该查看最大堆大小。目前,您将其设置为0x100000
(=1MB),这很快就会被您的数据用完。尝试增加它,看看你是否可以容纳更大的向量。
我认为在 Windows 上,您的 enclave 必须完全适合 EPC,但在 Linux 上,您可以创建数十 GB 的 enclave。请注意,一旦您的 (Linux) enclave 内存使用量超过约 90 MB,您将开始注意到 EPC 分页,并且随之而来的是巨大的性能下降。
推荐阅读
- c# - 如何使用枚举作为字符串检索数据(EF Core)
- angular - Angular4 提供的服务在公共函数中未定义
- r - 在 R 中整理数据以按组添加变量(列)和观察值(行)
- kubernetes - 如何更改 Grafana 中的间隔时间以监控 Kubernetes?
- javascript - Javascript(无 JQUERY)切换 Div
- web-applications - 后端和前端开发人员。这些是什么?
- javascript - 通过 URL 多行的 JavaScript MySql INSERT 语句
- bash - 格雷普 | sed -i 等效于 Windows
- html - 如果用户是移动设备,我将如何删除图片
- c# - 如何“无法将类型'int'隐式转换为'string'类型”错误?