primefaces写在unixsockets?

我试图selectpipe道UNIX机制的Unix套接字
两者都支持select()epoll()函数,这很好。

现在,pipe道有一个4kB(截至今天)“primefaces”写,这是由Linux内核保证。
unix套接字的情况下是否存在这样的特性? 我找不到任何明确说明这一点的文件。

假设我使用UNIX套接字,并从客户端写入x个字节的数据。 我确定这些x字节将被写入服务器端的套接字时,我的服务器的select()裂缝?

在同一个主题上,使用SOCK_DGRAM确保写入是primefaces的(如果这样的保证是可能的话),因为数据报应该单一明确定义的消息?
那么使用SOCK_STREAM作为传输模式会有什么不同呢?

提前致谢。

管道

是的,非阻塞容量通常是4KB,但为了最大的可移植性,使用PIPE_BUF常量可能会更好。 另一种方法是使用非阻塞I / O。

更多的信息比你想知道的man 7 pipe

Unix数据报套接字

在数据报套接字上使用send函数系列写入确实是原子的 。 在Linux的情况下,它们也是可靠的,并保持排序。 (这使得最近引入的SOCK_SEQPACKET有点让我困惑)关于man 7 unix大量信息。

最大的数据报大小是依赖于套接字的。 使用SO_SNDBUF上的getsockopt/setsockopt访问它。 在Linux系统上,它的范围在2048到wmem_max之间,默认为wmem_default 。 例如在我的系统上, wmem_default = wmem_max = 112640 。 (你可以从/proc/sys/net/core读到)最相关的文档是在SO_SNDBUF选项周围的man 7 socket 。 我建议你自己读一下,因为它描述的容量倍增行为起初可能有点混乱。

流和数据报之间的实际区别

流套接字只工作连接。 这大多意味着他们一次只能与一个同伴交流。 作为流,他们不能保证“消息的界限”。

数据报套接字断开连接。 他们可以(理论上)一次与多个同行进行交流。 他们保留消息边界。

[我想新的SOCK_SEQPACKET介于:连接和边界保持。]

在Linux上,两者都是可靠的,并保留消息顺序。 如果您使用它们来传输流数据,它们往往表现相似。 所以只要使用与你的流程匹配的那个,让内核为你处理缓冲。

原始基准比较流,数据报和管道:

 # unix stream 0:05.67 socat UNIX-LISTEN:u OPEN:/dev/null & until [[ -S u ]]; do :;done time socat OPEN:large-file UNIX-CONNECT:u # unix datagram 0:05.12 socat UNIX-RECV:u OPEN:/dev/null & until [[ -S u ]]; do :;done time socat OPEN:large-file UNIX-SENDTO:u # pipe 0:05.44 socat PIPE:p,rdonly=1 OPEN:/dev/null & until [[ -pp ]]; do :;done time socat OPEN:large-file PIPE:p 

这里没有统计学意义。 我的瓶颈可能是阅读大文件。

假设我使用UNIX套接字,并从客户端写入x个字节的数据。 我确定这些x字节将被写入服务器端的套接字时,我的服务器的select()裂缝?

如果您使用的是AF_UNIX SOCK_STREAM套接字,则不存在这样的保证,即在一个write/send()数据在接收端可能需要多个read/recv()调用。

在同一个主题上,使用SOCK_DGRAM确保写入是原子的(如果这样的保证是可能的话),因为数据报应该是单一明确定义的消息?

另一方面, AF_UNIX SOCK_DGRAM套接字需要保留数据报的边界并且是可靠的。 如果send()不能自动传输数据报,你应该得到EMSGSIZE错误。 不知道write()会发生什么,因为手册页并没有说它可以报告EMSGSIZE(尽管手册页有时并没有列出返回的所有错误)。 我会尝试溢出与大型数据报接收方的缓冲区,以查看哪些错误完全send/write()报告。

在管道上使用UNIX套接字的一个优点是更大的缓冲区大小。 我不记得pipe的内核缓冲区的限制是什么,但我记得没有足够的内存缓冲区,不能增加它(这是一个硬编码的内核常量)。 fast_producer_process | slow_consumer_process 由于管道缓冲区大小不足, fast_producer_process > file && file > slow_consumer_processfast_producer_process > file && file > slow_consumer_processfast_producer_process > file && file > slow_consumer_process数量级。