2013年12月6日 星期五

apache 與 nginx

http://ithelp.ithome.com.tw/question/10122157?tag=ithome.nq

Rellik: 之前跟你談到 nginx ..
Rellik: 大概要從 apache1 介紹起才會比較清楚..
Rellik: 傳統的 apache 1.x 是走的是 multi process 模型
Rellik: 意思是一個連線,就 fork 一個獨立的 proces 處理 ..
Rellik: 這樣的模型程式寫起來沒啥問題,也不容易出錯, 但可想而知效率不好
Rellik: 因為 fork 一個 process , fork 需要成本, process 也需要記憶體
Rellik: 雖然 linux 核心後來大幅優化 fork 的成本,使其和 thread 差不多,但有人實測,還是有差 ...
Rellik: 而且他無法面對海量的連線,比如同時 10000 個連線 <---- 要 10000 個 process
Rellik: 所以後來演變成 multi thread . . .
Rellik: thread 和 fork 最大的差別在於 thread 其實是同一個 process,但是每個 thread 可以用不同的 CPU 資源,因此 multi thread 優勢在於比較省記憶體
Rellik: 但 multi thread 由於會共用資源... 所以程式一但大起來很很頭痛,程式設計師必須處理多個 thread 同時存取同一份資源的問題
Rellik: 然後一樣, thread 有其數量限制,所以他依然不能處理 10000 這種海量同時連線 ...
Rellik: 所以後來就出現 event based 的 function ... 也就是 select / poll / epoll
Rellik: 前兩者算是 POSIX 標準,特別是 select 連 windows 都可以用 ...
Rellik: 但是前兩者各有限制,也是吃不了海量資料 = =
Rellik: 所以後來各種 os 乾脆自己在 kernel space 做自己的 event based function
Rellik: 像是 freebsd 有 kqueue , linux 有 epoll, windows 有 iocp
Rellik: 但程式寫起來不好寫,因為他是 event based ..
Rellik: nginx 和 light 就是基於 kernel event base 下開發的 http server
Rellik: apache 在 2 版開始也開始支援 event base
Rellik: 但是..效果不太好
Rellik: 面對 100k 海量連線的話可能就會死翹翹

沒有留言:

張貼留言