在 CentOS 上增加管道内部缓冲区大小
Posted
技术标签:
【中文标题】在 CentOS 上增加管道内部缓冲区大小【英文标题】:Increase pipe internal buffer size on CentOS 【发布时间】:2012-04-29 21:34:22 【问题描述】:我正在使用异步管道进行进程间通信(为了简化,我删除了错误检查)
int pipe_fd[2];
pipe(pipe_fd);
int fdflags = fcntl(pipe_fd[1], F_GETFL, 0);
fdflags |= O_NONBLOCK;
fcntl(pipe_fd[1], F_SETFL, fdflags);
我正在寻找一种增加管道内部缓冲区大小的方法。 我知道可以使用 Kernel >= 2.6.35 通过以下方式:
fcntl(fd, F_SETPIPE_SZ, size);
或写信至:
/proc/sys/fs/pipe-max-size
但我正在使用内核 2.6.18 开发 CentOS 5。 是否可以使用 Kernel 2.6.18 增加管道内部缓冲区大小?如果是,该怎么做?
【问题讨论】:
【参考方案1】:在 CentoS 5 的内核上,管道固定为 64 KB
【讨论】:
【参考方案2】:除非您只想在 C 代码中执行此操作,否则一种选择是在设置限制后运行程序的包装器 shell 脚本中使用 ulimit -p。
【讨论】:
-p The pipe size in 512-byte blocks (this may not be set)
。此外,ulimit 显示的值是保证写入是原子的最大大小。在 CentoS 5 的内核上,管道固定为 64 KB。
事实上我想知道shell是如何做到这一点的。我猜“可能未设置”涵盖了操作系统不支持更改管道大小的情况。
好的,我将重新编译内核以更改管道大小【参考方案3】:
/proc/sys/fs/pipe-max-size sets the limit for fcntl F_SETPIPE_SZ
只是改变/proc/sys/fs/pipe-max-size
没有区别
ulimit -p
也没用
你必须实际使用fcntl F_SETPIPE_SZ
据我所见pipe-max-size
默认为 1MB,对于任何疯狂的管道需求来说应该绰绰有余
【讨论】:
能否修改 /proc/sys/fs/pipe-max-size 以将最大管道限制增加到 1MB 以上?我有一个疯狂的需求,我需要它大于 1MB :)以上是关于在 CentOS 上增加管道内部缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章