Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mmaping巨大文件,然后使用cgroup限制内存_C_Linux_Mmap_Cgroups - Fatal编程技术网

mmaping巨大文件,然后使用cgroup限制内存

mmaping巨大文件,然后使用cgroup限制内存,c,linux,mmap,cgroups,C,Linux,Mmap,Cgroups,作为一个更大实验的一部分,我正在尝试用mmap测试一些东西。我正在尝试mmap一个大文件(比如20GB),然后对整个mmap阵列执行一些写入操作。正如我现在所理解的,如果我的程序试图将数据写入20GB文件的所有块,内核将尝试为我的程序分配20GB的RAM。这运行得很好,因为我的机器有超过32GB的RAM,而且大部分都没有使用 但是,我还试图在程序运行时使用linux cGroup限制程序的内存 最初,我运行创建mmap的程序,没有任何内存限制。20GB内存按预期要求提供。但是,当程序运行时,我想

作为一个更大实验的一部分,我正在尝试用mmap测试一些东西。我正在尝试mmap一个大文件(比如20GB),然后对整个mmap阵列执行一些写入操作。正如我现在所理解的,如果我的程序试图将数据写入20GB文件的所有块,内核将尝试为我的程序分配20GB的RAM。这运行得很好,因为我的机器有超过32GB的RAM,而且大部分都没有使用

但是,我还试图在程序运行时使用linux cGroup限制程序的内存

最初,我运行创建mmap的程序,没有任何内存限制。20GB内存按预期要求提供。但是,当程序运行时,我想将自己的内存限制(比如1GB)写入程序运行的cgroup,如下所示:
echo 100000000>/var/cgroup/mycgroup/memory.limit(以字节为单位)


这样,进程为mmap保留的其余19GB会发生什么情况?它是否立即被内核回收?如果是这样的话,我仍然在运行的程序会发生什么情况,它希望能够从mmaped数组中保持读写操作?有没有一种方法可以使正在运行的程序在被内核占用内存时读/写磁盘

快速浏览一下源代码就可以发现,使用EBUSY将限制降低到当前使用量以下的尝试将失败。你测试过吗?这确实是我观察到的,但对我来说,它有时有效,有时失败。我不知道为什么它有时会使我能够将内存限制降低到使用率以下。有没有其他可行的方法可以减少运行时的内存消耗?我想这取决于你所说的“消耗”是什么意思。例如,如果另一个进程需要大量内存,那么内核可以简单地将映射中的一些脏页写回底层文件,并将这些页提供给另一个进程。因此,从这个意义上讲,用于映射的内存一开始并不是真正“消耗”的。如果您想鼓励内核更快地刷新页面,可以使用
madvise()。假设我启动了一个有20GB文件支持的mmap内存且没有内存限制的程序。内核将分配20GB的RAM,以便定期将此RAM刷新到磁盘。我想要的是能够将这个内存减少到5GB,这样剩余的15GB就可以被内核回收。15GB内存中的脏页应立即刷新到磁盘。如果我的程序想使用内核刚刚回收的15GB内存,它必须收回5GB内存中的其他部分,以便为它腾出空间。快速浏览一下源代码表明,使用EBUSY将限制降低到当前使用率以下的尝试将失败。你测试过吗?这确实是我观察到的,但对我来说,它有时有效,有时失败。我不知道为什么它有时会使我能够将内存限制降低到使用率以下。有没有其他可行的方法可以减少运行时的内存消耗?我想这取决于你所说的“消耗”是什么意思。例如,如果另一个进程需要大量内存,那么内核可以简单地将映射中的一些脏页写回底层文件,并将这些页提供给另一个进程。因此,从这个意义上讲,用于映射的内存一开始并不是真正“消耗”的。如果您想鼓励内核更快地刷新页面,可以使用
madvise()。假设我启动了一个有20GB文件支持的mmap内存且没有内存限制的程序。内核将分配20GB的RAM,以便定期将此RAM刷新到磁盘。我想要的是能够将这个内存减少到5GB,这样剩余的15GB就可以被内核回收。15GB内存中的脏页应立即刷新到磁盘。如果我的程序想要使用内核刚刚回收的15GB内存,它必须收回5GB内存的其他部分,以便为它腾出空间。