fifo 管道大小是否受磁盘缓存分配空间的限制?

fifo 管道大小是否受磁盘缓存分配空间的限制?

在 Linux CentOS 7 上,我使用 mkfifo 创建的命名 fifo 管道来处理在多处理器磁盘服务器(配备 132GB RAM 和 20TB RAID 磁盘的 Dell R730xd)上运行的进程对之间传递的数据。

为了在连接到管道的两个进程之间拥有一些数据缓冲区,当我打开管道时,我还将其大小设置为某个大值(比如 128MB)。

为了允许较大的管道​​尺寸,我必须设置:

/proc/sys/fs/pipe-max-size = 134217728
/proc/sys/fs/pipe-user-pages-soft = 0 (i.e. no limit)

然后在我的代码中使用(来自 Perl 脚本的示例)

fcntl(\*FD, F_SETPIPE_SZ, int($size))

偶尔,设置管道大小的操作会失败,并显示“无法分配内存”消息。我注意到,当服务器上的磁盘活动非常频繁时,就会发生这种情况。查看 /proc/meminfo 后,我发现缓存内存占用了服务器的大部分内存,只剩下几 MB 的 MemFree。一旦磁盘活动平息,缓存内存就会慢慢减少,过一会儿,管道大小操作就会重新开始工作。

我的问题是:

  1. 为什么管道大小与缓存内存冲突?缓存内存难道不应该在有人需要时立即释放吗(例如,我在启动新进程时没有遇到任何问题)?
  2. 如何限制可用于磁盘缓存的最大内存量?我猜将其限制为 100GB 而不是 132GB 不会对磁盘​​性能产生很大影响,而且这会为我的管道留下足够的内存……

在此先感谢您的帮助。

相关内容