代码之家  ›  专栏  ›  技术社区  ›  Chris Johnson Thomas M. DuBuisson

不使用交换分配最大缓冲区

  •  12
  • Chris Johnson Thomas M. DuBuisson  · 技术社区  · 15 年前

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

    5 回复  |  直到 15 年前
        1
  •  9
  •   Nordic Mainframe    15 年前

    在linux下,可以使用mlock()/mlockall()在物理内存中保留一个地址范围,防止它被调出。使用mlock的进程需要一些特权来完成这个任务,“manmlock”提供了详细信息。我不确定最大的mlock'able块(它可能不同于看似“free”的块),所以二进制搜索可能会有所帮助(锁定一个范围,如果失败,则减小区域大小等…)

    另一方面,对于固态驱动器来说,110MB/s并不是一个真正的问题。一个写速度为280MB/s的60gbssd售价约为200美元。只需将传感器数据复制到一个小的写入缓冲区中,并将其流式传输到SSD。

        2
  •  3
  •   Tomek Szpakowicz    14 年前

        3
  •  0
  •   adamk    15 年前

    如果你 malloc 所需的内存量并以该速度写入时,由于所有页错误(即,将虚拟内存的每个页映射到物理内存,其中还可能包括调出其他进程的内存),仍然会对性能造成影响。

    为了避免这种情况,你可以 memset 在开始从传感器读取之前,将整个分配的缓冲区设置为0,以便将所有需要的虚拟内存映射到物理内存。

    如果你只使用可用的 身体的 记忆,你不应该遭受任何交换。使用更多会导致其他进程的内存被交换到磁盘上-如果这些进程是空闲的,则不会造成任何问题。如果它们处于活动状态(即偶尔使用内存),则会发生一些交换—交换速率可能比硬盘带宽低得多。您使用的内存越多,活动进程的内存将被交换出去,并且会发生更多的HD活动—此时,您可以使用的最大内存量以及良好的性能几乎是反复试验的结果。

    如果使用的内存超过了可用的物理内存,那么肯定会导致以写入内存的速度进行交换,这是无法避免的。

        4
  •  0
  •   Dummy00001    15 年前

    确定要分配多少内存的最佳方法是什么?

    由于虚拟内存的使用方式,不可交换的内核内存,几乎不可能确定应用程序可以访问多少已安装的内存。

    我是否仅限于分配比报告的可用内存稍小的块,

    不幸的是,报告的空闲内存并不是真正的“空闲物理内存”。

    或者我可以更直接地与linux虚拟内存管理器接口吗?

    mmap()

    但是,我还需要确保没有磁盘交换

    在Linux内核开发的步伐中,知识很快就会过时,所以请对我在这里说的话持保留态度。您可以尝试使用以下内容:

    1. SysV共享内存。一般不交换。看到了吗 man shmget

    2. 内存文件系统。至少在早期的2.6内核中,内存被固定到RAM上,因此不可交换。要将其用作内存,请在tmpfs上创建一个文件, write()