C 如何在服务器中支持1TB的内存?

C 如何在服务器中支持1TB的内存?,c,memory,server,C,Memory,Server,我的C语言(linux)应用程序至少需要1TB的内存。 8 TB是最好的。 如何在服务器中支持这样的内存容量? 一种方法是构建我自己的PCI卡,并安装128 GB DDR4模块,这是目前市场上最大的可用模块。但是我必须重写所有malloc()调用和数组变量的所有寻址。这在C中是否可以以透明的方式实现?我能想到的唯一方法是仅为阵列使用PCI express分配的内存,要访问它们,我必须以这种方式重写所有函数: put(huge_array,index,&data); get(huge_a

我的C语言(linux)应用程序至少需要1TB的内存。 8 TB是最好的。 如何在服务器中支持这样的内存容量? 一种方法是构建我自己的PCI卡,并安装128 GB DDR4模块,这是目前市场上最大的可用模块。但是我必须重写所有malloc()调用和数组变量的所有寻址。这在C中是否可以以透明的方式实现?我能想到的唯一方法是仅为阵列使用PCI express分配的内存,要访问它们,我必须以这种方式重写所有函数:

put(huge_array,index,&data); 
get(huge_array,index,&data);

就像C++中的GET()和()()方法一样。但是我的应用程序不是C++,它是C.< 我还有什么其他选择,不会花我很多钱+我的衬衫

这在C中是否可以以透明的方式实现

是的。在Linux中有一个很好的技巧,我相信它是从Solaris继承而来的,您可以编写自己的分配器,将其放入单独的共享库中,然后执行以下操作

> LD_PRELOAD=mylib.so ./myapp
另一种可能的解决方案是使用mallochooks,[check here](),但该解决方案是特定于Linux/GLIBC的

更新

看看

这在C中是否可以以透明的方式实现

是的。在Linux中有一个很好的技巧,我相信它是从Solaris继承而来的,您可以编写自己的分配器,将其放入单独的共享库中,然后执行以下操作

> LD_PRELOAD=mylib.so ./myapp
另一种可能的解决方案是使用mallochooks,[check here](),但该解决方案是特定于Linux/GLIBC的

更新


看一看

如果你能将你的工作并行化,AWS有3.8X大型实例,每个244 GiB,每小时2.66美元(在美国东部地区,其他地区的价格可能不同)*

相反,如果您不着急,您可以使用内存较少但交换容量为1+TiB的服务器,而无需更改malloc


如果您可以将您的工作并行化,AWS有r3.8X大型实例,每个244 GiB,每小时2.66美元(在美国东部地区,其他地区的价格可能不同)*

相反,如果您不着急,您可以使用内存较少但交换容量为1+TiB的服务器,而无需更改malloc



这不是一个服务器构建问题,不是一个编程问题吗?一个拥有1 TB内存的服务器将非常昂贵。我认为当前Intel Xeon E7 v2服务器的最大容量为6 TB。如果需要修改GLIBC,则需要编程问题假设服务器以64位模式运行,为什么需要对操作系统进行任何更改以支持1 TB的ram?我投票结束这个问题,除非OP证明这个问题不能转化为分布式内存模型。这不是一个服务器构建问题,不是一个编程问题吗?一个拥有1 TB内存的服务器将非常昂贵。我认为当前Intel Xeon E7 v2服务器的最大容量为6 TB。如果需要修改GLIBC,则需要编程问题假设服务器以64位模式运行,为什么需要对操作系统进行任何更改以支持1 TB的ram?除非OP证明问题无法转化为分布式内存模型,否则我将投票结束这个问题。这是否支持MOVTDQA或类似指令的对齐规则?因为如果它没有对齐到128位,我将得到一个SEGFAULT。似乎我必须用get()和put()函数重写所有变量的寻址,否则,CPU将如何寻址通过PCI express总线的内存地址?@Nulik为什么需要重写寻址?无论接口是什么(get、malloc),如果数据在应用程序地址空间中,它对应用程序都应该是透明的。因为您正在编写分配器,所以无论您提供什么对齐方式,都是如此。@Nulik分配器的另一个选项是使您的卡看起来像内存映射文件,并提供
mmap
接口和分配。如果分配高于某个可配置的限制Papadeux,GLIBC malloc将使用mmap,因为malloc()使用系统调用将物理内存分配给虚拟地址。使用PCI Express总线进行内存分配,将无法提供有效地址。地址将在PCI卡上,而不是物理内存位置。@Nulik Aha!知道了。但应用程序将如何处理此地址?它不在应用程序地址空间中,因此像
ptr+=10000000
和取消引用
*ptr
之类的操作将产生SEGFAULT。您有多少实际内存(连接到内存控制器的RAM)?这是否支持MOVTDQA或类似指令的对齐规则?因为如果它没有对齐到128位,我将得到一个SEGFAULT。似乎我必须用get()和put()函数重写所有变量的寻址,否则,CPU将如何寻址通过PCI express总线的内存地址?@Nulik为什么需要重写寻址?无论接口是什么(get、malloc),如果数据在应用程序地址空间中,它对应用程序都应该是透明的。因为您正在编写分配器,所以无论您提供什么对齐方式,都是如此。@Nulik分配器的另一个选项是使您的卡看起来像内存映射文件,并提供
mmap
接口和分配。如果分配高于某个可配置的限制Papadeux,GLIBC malloc将使用mmap,因为malloc()使用系统调用将物理内存分配给虚拟地址。使用PCI Express总线进行内存分配,将无法提供有效地址。地址将在PCI卡上,而不是物理内存位置。@Nulik Aha!知道了。但应用程序将如何处理此地址?它不在应用程序地址空间中,因此像
ptr+=10000000
和取消引用
*ptr
之类的操作将产生SEGFAULT。你们有多少真正的内存(连接到内存控制器上的RAM)?哦,不,我的公司和这些家伙竞争,我不能使用亚马逊。还有其他云提供商——只是看起来像是