iT邦幫忙

2

nginx connection 問題

  • 分享至 

  • xImage

各位大神好,
最近在研究 nginx 效能問題。
搜尋一下 google 大部分都是在討論 nginx connection 問題。
但有看沒有懂。

參考項目:
Nginx高并发配置
ginx并发优化.pdf
Nginx Connection 不夠用 的參數調整

  1. 像是這個
    worker_processes 8;
    假設我是把機器開在 AWS t2.medium(2vCPU,4MEM)
    我看很多人都說這個 worker processes 的是不會超過 vCPU, 多設定無意義,
    我如果是設定說 worker_processes 2;
    這樣的話我的伺服器全部的 CPU 都給 nginx worker ,
    那其他系統的 processes 不就不用工作了嗎?

  2. 連線參數我看很多都設定 1024
    worker_connections 1024;
    所以我設定
    worker_processes 2;
    worker_connections 1024;
    我可以有 2048 個連線數,
    但是知道這樣的算法後,我還是不知道有甚麼意義
    因為假設我是 LAMP 的程式。
    我用 ab -n 10000 http://example.com
    我的理解是 ab 這樣會有 10000個連線同時進來,
    就..沒有然後了,我怎麼知道我 nginx 這樣夠不夠,
    還是我機器要大一點。
    而且,這個模擬 10000 人同時間打開我的網站。
    像是網頁有動態資源(php 運算後寫入資料庫)
    只測試 ab -n 10000 http://example.com
    就沒有把消耗資源的服務考慮進來,這樣測試是不是就失準了

  3. 關於 nginx 併發看了還是不是很能理解是怎麼運作的。
    我的理解是自己的電腦會開一個亂數 port 到主機端
    client:random_port -> server:80
    以前學長是說開80就像是開個一個櫃台讓大家來訪問。
    可是如果有10000個人同時擠進 80櫃台。
    櫃檯也是要一個一個處理(排隊)
    我的想像是我就連過去網站,死都不關掉,這樣下一個人就不能訪問80,就會出現錯誤。
    但這很明顯是錯誤,隨便在 aws 安裝個 nginx 就會有一堆連線進來,
    可以用 net -ant 去看。
    還是其實不能用櫃台排隊的方式去想,

  4. 我看很多書都會寫說,伺服器能夠乘載 100000連線數,11購物節的時候我們每秒乘載 578 連線,然後就會 show top 數據,可是都沒有解釋是怎麼算出來,以及 top 它們到底參照那個數值判斷到底穩不穩定,不知道有沒有大大可以教學怎麼算出來,以及看甚麼東西。

DennisLu iT邦研究生 1 級 ‧ 2023-07-24 09:35:46 檢舉
個人看法
3.
你學長可能不是你說的那一半,應該還有一半你沒理解到。
還是要看你的網頁內容的服務而定。
櫃台承辦後,就把這位客人就叫另外一個接待員去接待,馬上就換一下一個客人繼續承辦了交給另外一個接待員,如果是靜態網頁,那接待員大概就是跟客人講一下這裡有什麼,然後就結束這位客人的服務。馬上回去櫃台那邊接手下一個客人,那接待員的人力資源負荷量的跟你公司的規模(OS+網路、硬體)還有主管調配(ngninx服務設定)的人力有關。

假設你的網頁程式工作特多或是內容特多需要花時間才能結束服務,就可能客人跟接待員相處的時間就會多。
那系統的課題就是怎樣最有效率的處理每個客戶,假設串後台資料庫,連每個SQL的時間都很斤斤計較。

所以你會server看到很多背景同時很多被連的 80 port 增增減減的。
謝謝你的解釋,所以我發出請求要一客牛排到80,他瞬間接受我的請求,然後告訴後台廚師,就把我斷開,只是我人沒感覺,就像阿罵沒感覺一樣,然後當後台廚師準備完成牛排後,再叫我進去 80 拿牛排。

應該是這樣的概念。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
ak02
iT邦研究生 1 級 ‧ 2023-07-24 05:23:52
最佳解答

1:
正常來說也關系到程式本身語法寫的處理速度問題
如果本身PROCESS 一直在工作處理
那就真的會死機
所以會有個超過多少時間就結束的機制
CPU處理程序數也要買多一點
2:
個人覺的要分二種來說
-->同時進站連線人數
-->負載人數
這很難有絕對可以很凖的
通常也只是大概
3:
參數本身也有TIMEOUTE的指令
代碼都要互相配合
才不會造成這樣的狀況
4:
我都是直接用計算連線埠數 80跟443

我只能說這門課水很深也很煩
只能說實戰經驗真的會大於理論值

  1. 你說的是 keeplived 這個參數吧
  2. 真的
  3. 甚麼的參數,代碼的話由於我不是開發,這個我只拿到產品我也只能用壓測的方式去模擬,然後就回到第二題
  4. 我理解你說的,我也覺得水深,可是跟老闆/業主報告的時候,沒有數字有夠難報告的,只能用 SLA/SLI/SLO,軟體端回傳的平均上限人數去報告。
ak02 iT邦研究生 1 級 ‧ 2023-07-24 18:14:04 檢舉

解釋這個超煩的
就算解釋完
管理不好
還不是當機
後續就軟體怪硬體
硬體怪軟體
互相怪來怪去

0
MatthewWangUS
iT邦新手 3 級 ‧ 2023-07-24 10:08:53

在單1機器的 LAMP 的架構上。你該考慮的是 php 跟 mysql 能夠同時撐多少人而不爆記憶體。nginx 它只負責靜態資源的處理,它不會是你整個網站的瓶頸。
吃資源的都是php mysql。如果你想架1個超大網站,你要作的至少是 auto scaling 跟 db cluster , nosql 的cache機制等。

你說的 ASG、db cluster、 nosql 的cache機制我都懂,
但本題是說 nginx connection 承載能力與檔案設定問題,
而不是資源耗盡問題。

那是因為現實狀況中,
會有資源沒有吃滿,
但是客戶端連線數量過大打到 nginx,
nginx 就負荷不過來這種情況。
所以才要討論 nginx 連線與負載調校。

建議您貼一下 top 跟 nginx error.log 。正常爆了 error log 應會出現相關訊息。問題也比較好判斷

我要發表回答

立即登入回答