摘要:正如你可能在一开始就注意到的那样 —— 这可能会导致在持久连接上的一些暂时的死锁。
由于是初始的拥塞窗口,发送端被允许传送两个包:A 和 B
在这个数据交换过程中,由于 Nagel 和延迟 ACK 之间的死锁引入了 200ms 的延迟。
正如你可能在一开始就注意到的那样 —— 这可能会导致在持久连接上的一些暂时的死锁。
由于是初始的拥塞窗口,发送端被允许传送两个包:A 和 B
在这个数据交换过程中,由于 Nagel 和延迟 ACK 之间的死锁引入了 200ms 的延迟。
Nagle 算法是当时真正的救世主,而且目前仍然具有极大的价值。但在大多数情况下我们不会在我们的网站上使用它,因此可以通过添加 TCP_NODELAY 标志来安全地关闭它。
sendfile
正常来说当要发送一个文件时需要下面的步骤:
这涉及到两个上下文切换(读,写),并使相同对象的第二个副本成为不必要的。正如你所看到的,这不是最佳的方式。值得庆幸的是还有另一个系统调用,提升了发送文件(的效率),它被称为:sendfile(2)(想不到吧!居然是这名字)。这个调用在文件 cache 中检索一个对象,并传递指针(不需要复制整个对象),直接传递到 socket 描述符,Netflix 表示,使用 sendfile(2) 将网络吞吐量从 6Gbps 提高到了 30Gbps。
然而,sendfile(2) 有一些注意事项:
在 nginx 中打开它tcp_nopush
tcp_nopush 与 tcp_nodelay 相反。不是为了尽可能快地推送数据包,它的目标是一次性优化数据的发送量。
在发送给客户端之前它将强制等待包达到最大长度(MSS),而且这个指令只有在 sendfile 开启时才起作用。
看起来 tcp_nopush 和 tcp_nodelay 是互斥的。但是,如果所有 3 个指令都开启了,nginx 会:
我应该使用多少进程?