C 如何在服务器中支持1TB的内存?
我的C语言(linux)应用程序至少需要1TB的内存。 8 TB是最好的。 如何在服务器中支持这样的内存容量? 一种方法是构建我自己的PCI卡,并安装128 GB DDR4模块,这是目前市场上最大的可用模块。但是我必须重写所有malloc()调用和数组变量的所有寻址。这在C中是否可以以透明的方式实现?我能想到的唯一方法是仅为阵列使用PCI express分配的内存,要访问它们,我必须以这种方式重写所有函数: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
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
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)?哦,不,我的公司和这些家伙竞争,我不能使用亚马逊。还有其他云提供商——只是看起来像是