ref: https://lwn.net/Articles/853637/
如果對 SO_REUSEPORT 這個能夠提供網路服務吞吐量的 socket options 不陌生的話,那這篇文章強烈推薦看看。
本篇文章是從討論開啟 SO_REUSEPORT 這個選項會出現的一些行為以及可能可以怎麼做
最直得看的應該是留言區本身,有很多不同層級的討論,大家最愛講的 Google SRE 人也都出來分享自己的經驗了。
正常情況下,每個 TCP Port 只能被一個 process 給使用來聽取封包,但是對於一些網路重度使用的系統來說,就算讓該 process 將連線給分散到其他的 process 去處理,該 process 依然可能是系統的效能瓶頸。
Linux Kernel 3.9 後引入的 SO_REUSEPORT 參數就是為了解決這個效能問題而來的,這個參數允許多個 Process 同時使用一個 TCP Port,每當底層有一條新的連線請求時, Kernel 會從眾多的候選人之一中挑選一個可用來處理。
這種情況下,網路應用程式就可以專心處理連線工作,然後實務上同時執行多個 Process 即可。底層的 Kernel 會幫忙做連線的負載分配。
當眾多候選 process 其中之一掛掉了(可能是 crash,也有可能是有意的重啟), kernel 會注意到這個候選人要說掰掰,這候選人處理的所有 connection 都會被移除,比較糟糕的是其他待在 Accept-Queue 那些還沒被建立連線的連線請求也會一併被移除。
作者認為 Kernel 應該要有能力可以轉移那些 Accept-queue 中的連線到其他還工作的候選 process 下去處理,這樣使用者/Client 的連線就不會需要處理太多重連的問題。
文章後面都在探討可行的做法以及這個問題可能會導致什麼問題。
留言區滿熱鬧的,譬如說
1. 有人認為 server 重啟的情況實在太少見,有需要為這麽少見的情況導入這麼複雜的修改到 Kernel 中?
a. 有人回答使用 Let's Encrypt 你可能每幾週就要重啟一次。
b. Google SRE 回答其內部因為調整設定的緣由,幾乎無時無刻都需要重啟服務,不過這問題已經從別的層級去處理掉,所以修改 Kernel 對他們的用途不太大。
2. 有人提出 Nginx 本身有 live migration 的功能,可以將 fd 給轉移到其他的 process 去處理。
a. 有人提出這邊談的是 socket/connection 的層級,這些東西都還沒發生到 userspace process 同時也不是 userspace 應用程式可以接觸處理的。
b. 本文探討的是 bind(), accept(), listen() 這類型 function call 之間 kernel 會幫忙做的事情。
有興趣的別忘了閱讀留言區
「nginx port設定」的推薦目錄:
- 關於nginx port設定 在 矽谷牛的耕田筆記 Facebook 的最佳解答
- 關於nginx port設定 在 哪裡好吃哪裡去:神秘的水原誠 Facebook 的最讚貼文
- 關於nginx port設定 在 常用的Nginx Config 與相關指令教學: 四大步驟入門網站架設 的評價
- 關於nginx port設定 在 用Docker 在AWS EC2 上部署LEMP 網站 - GitHub 的評價
- 關於nginx port設定 在 外部Nginx 與Gitlab Docker Container 並存設定方法 - GitHub ... 的評價
- 關於nginx port設定 在 設定Flask 應用程式uWGSI Nginx - 伺服器配置鍋爐模板(預設 ... 的評價
nginx port設定 在 哪裡好吃哪裡去:神秘的水原誠 Facebook 的最讚貼文
當我們把系統部署在K8S(Kubernates)的環境中 需要設定對外PORT才能對外提供服務 對於這點, 我們只需要在需要開放的容器設定公開, 再選擇負載平衡器就可以了( ) 但你可能會發現 這樣產生的服務只有外部網路的IP, 如果被有心人士取得, 可能會造成資安的問題 所以我們會比較希望將不需要對外的服務利用內部網路做連結 然而這個GKE的介面, 卻沒辦法設定內部網路IP 好在, 這個問題還是可以解決的... 首先呢, 我們可以先進入我們想要設定服務的GKE叢集 點選連結 這裡使用GCP附送的免費Cloud Shell來做操作(類似免費的有限空間Linux) 照理說使用GCP的SDK應該也是可以在本地做, 不過感覺有點麻煩, 使用Cloud Shell應該比較簡單 但這個有使用時間的問題, 一周好像免費50小時?? 之前遇過一次, 不過忘了 點在Cloud Shell中執行 一開始需要授權, 點選授權, 接著就可以進入 其實這個指令是用來切換K8s的群集 以這條命令資料來說, 就是切換位於asia-southeast1-a區域, 專案xxxx的it-test群集 就改成自己需要的群集 顯示切換到it-test成功 輸入kubectl get pod 可以查看目前這個群集部署的系統 以這個部分來說, 水哥部署了一個nginx容器當作測試 那我們需要針對nginx開啟對外Port與IP才能提供服務 這裡可以看到已經開了兩個LoadBalancer, 分別是使用35.247.177.243與10.148.15.213做為External-IP對外服務 其中10.148.15.213為內部IP, 也就是我們這次想要實現的 而從介面的部分來看則是這樣 可以比較明顯的看到一個顯示外部負載平衡器, 一個則是顯示內部負載平衡器 然而, GKE的介面不允許建立內部的...這也讓我在這裡卡很久 那要怎麼做呢? 我們先刪除這兩個服務, 重新建立...
https://mshw.info/mshw/?p=26417
nginx port設定 在 用Docker 在AWS EC2 上部署LEMP 網站 - GitHub 的推薦與評價
LEMP stack 用到的就是Linux、Nginx、PHP 與MySQL,Linux 是我們正在操作的作業 ... 就會自動去docker hub 把nginx 映像檔抓下來,PORT 設定好,然後啟動nginx 容器。 ... <看更多>
nginx port設定 在 外部Nginx 與Gitlab Docker Container 並存設定方法 - GitHub ... 的推薦與評價
更改gitlab clone的external_url. 更改/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml (注意: 要設定成外部存取 ... ... <看更多>
nginx port設定 在 常用的Nginx Config 與相關指令教學: 四大步驟入門網站架設 的推薦與評價
四大步驟入門Nginx 架站基礎設定. Nginx 搭配Linux 系統(Ubuntu) 架設網站可以說是常見的解決方案,可實現反向代理(reverse proxy)、負載平衡(load ... ... <看更多>
相關內容