在不使用交换的情况下分配最大缓冲区

Chr*_*son 12 c c++ linux virtual-memory

在Linux下的C/C++中,我需要分配一个大的(几千兆字节)内存块,以便存储连接到以太网端口的传感器的实时数据和大约110MB/s的流数据.我想分配尽可能多的内存,以最大化我可以存储的数据序列的长度.但是,我还需要确保不会进行磁盘交换,因为产生的延迟和磁盘访问带宽有限会导致传感器(非常有限)的缓冲区溢出.

确定要分配多少内存的最佳方法是什么?我仅限于分配比报告的可用内存稍小的块,还是可以更直接地与linux虚拟内存管理器连接?

Nor*_*ame 9

好吧,在linux下你可以使用mlock()/ mlockall()来保持物理内存中的地址范围并防止它被换出.使用mlock的过程需要一些特权来执行此操作,"man mlock"具有详细信息.我不确定最大的mlock'able块(它可能与看似"免费"的块有所不同),所以可能二进制搜索可能有所帮助(锁定范围,如果失败则减小区域的大小等等.)

另一方面,对于固态硬盘来说,110MB/s并不是真正的问题.一个60GB的SSD,写入速度为280MB/s,在拐角处的成本约为200美元.只需将传感器数据复制到一个小的写入缓冲区中,然后将其传输到SSD.