TCP伺服器上KEEPALIVE RCVBUF TCP NODELAY選項應在哪個socket上設定?

時間 2021-06-03 09:21:32

1樓:wipan

好問題,strace了一把Apache httpd, 都設定在listen socket上了。

[pid 17080] 1510156861.965023 setsockopt(4, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0

[pid 17080] 1510156861.965038 setsockopt(4, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0

[pid 17080] 1510156861.965051 setsockopt(4, SOL_IPV6, IPV6_V6ONLY, [0], 4) = 0

[pid 17080] 1510156861.965065 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0

[pid 17080] 1510156861.965080 bind(4, , 28) = 0

[pid 17080] 1510156861.965098 listen(4, 511) = 0

Accepted socket在writev()呼叫之前都沒有設定socket屬性。

[pid 17083] 1510156864.389908 accept4(4, , [28], SOCK_CLOEXEC) = 9

[pid 17083] 1510156864.409665 getsockname(9, , [28]) = 0

[pid 17083] 1510156864.409693 fcntl(9, F_GETFL) = 0x2 (flags O_RDWR)

[pid 17083] 1510156864.409705 fcntl(9, F_SETFL, O_RDWR|O_NONBLOCK) = 0

[pid 17083] 1510156864.409719 gettimeofday(, NULL) = 0

[pid 17083] 1510156864.409732 gettimeofday(, NULL) = 0

[pid 17083] 1510156864.409745 read(9, "GET / HTTP/1.1\r\nHost:

54.222.253.

48\r\nUser-Agent: curl/7.51.

0\r\nAccept: */*\r\n\r\n", 8000) = 77

...查了一下socket屬效能不能繼承,stackoverflow 這篇也沒說明白。

2樓:陳碩

你可以用 getsockopt() 來驗證兩種方法是否等效。《Unix 網路程式設計》 第 3 版第 7 章說:

The following socket options are inherited by a connected TCP socket from the listening socket (pp. 462–463 of TCPv2): SO_DEBUG, SO_DONTROUTE,SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, SO_RCVBUF, SO_RCVLOWAT, SO_SNDBUF, SO_SNDLOWAT, TCP_MAXSEG, andTCP_NODELAY.

This is important with TCP because the connected socket is not returned to a server by accept until the three-way handshake is completed by the TCP layer. To ensure that one of these socket options is set for the connected socket when the three-way handshake completes, we must set that option for the listening socket.

如果你沒有特殊的理由,我建議你不要自己設定 rcvbuf/sndbuf,因為 Linux 核心本來會自動調整 buffer 大小,但是你設定之後就變成了固定大小(原始碼裡搜 SOCK_RCVBUF_LOCK 和 SOCK_SNDBUF_LOCK)。

另外,我查了一下 BSD 4.4 的原始碼,SO_KEEPALIVE 是可以繼承的(https://

)。 TCP_NODELAY 直到 2002 年發布的 FreeBSD 4.5 才被繼承(http://

fxr.watson.org/fxr/sour

ce/netinet/tcp_syncache.c?v=FREEBSD11#L860

)。Re: BSD/OS and TCP_NODELAY in slapd (ITS#760)。在 Linux 上,是全繼承的 http://

elixir.free-electrons.com

/linux/v4.13/source/net/core/sock.c#L1647

。還找到乙個舊帖子: New sockets formed on a listening socket do not inherit properties ,不過它說的是 O_NONBLOCK,man accept 也證實了這個說法。

雲伺服器在架構上和傳統的伺服器有什麼區別嗎?

點生 在使用上幾乎沒有什麼區別。區別主要在於雲伺服器基於規模化物理伺服器集群提供虛擬化的IT基礎設施,這樣做的目的就是為了達到傳統伺服器做不到的快速彈性伸縮,按需資源排程,高可用性,自動化程度高。好處在於非常契合網際網路服務快 穩 大 省特點,你無需再操心IT基礎設施問題,可以把省下來的資源投入解決...

伺服器租借

掛機寶 你這個我最有經驗了!你前期不用這麼好的,先用入門版的,使用者量大了在提高併發,在公升級伺服器也不遲。現在雲伺服器都是可以彈性公升級的。省下來的錢買排骨不香麼。一句話該公升級配置的時候我們就公升級,不該公升級我一毛都不出!你說呢 天上雲CDN 關鍵是看自己需求,在根據需求選擇配置。以免浪費不必...

香港伺服器和美國伺服器有哪些區別?

蘇州晨智教育科技有限公司 很多使用者在選擇雲伺服器的時候,會疑惑美國雲伺服器和香港雲伺服器應該這麼選擇,到底選擇美國的好還是香港的好。1 從配置上 配置上雲伺服器引數都是一樣的,包括 CPU 記憶體 硬碟 頻寬,從硬體上看雲伺服器配置是差不多的,使用者只需要按照自己需求選擇對應配置。2 從地區上 美...