2015-04-29 48 views
3

NGNIX使用epoll通知來了解套接字上是否有數據要讀取。我們假設: 有兩個請求到服務器。 nginx的是notificated瞭解這個兩個請求,並且開始:單線程NGINX如何處理如此多的連接?

  • 接收第一請求

  • 解析IST頭

  • 檢查boudary(車身尺寸)

  • 發送向上遊服務器的第一請求

nginx是單線程的,只能同時執行一個操作。

但第二個請求會發生什麼?

  1. nginx在解析第一個請求時是否收到第二個請求?

  2. 或者在第一次完成後開始處理第二個請求?

  3. 或其他我不明白的東西。

如果1.是正確的比我不明白如何在一個單一的線程內是可能的。

如果2.是正確的比nginx怎麼會這麼快?因爲nginx會按順序處理所有傳入的請求。在任何時候,只有一個請求處理是可能的。

請幫我理解。 謝謝

+0

可能相關:unix套接字比使用TCP更慢。另一件事:nginx是單線程的,但創建的工作人員很少,默認情況下4,你的問題是關於一個特定的工人內部發生了什麼? –

+0

請參閱我的答案以獲得解釋:http://stackoverflow.com/a/19324665/362536 – Brad

回答

1

Nginx不是一個單線程的應用程序。它不會爲每個連接啓動線程,但會在啓動過程中啓動多個工作線程。 nginx體系結構在http://www.aosabook.org/en/nginx.html中有很好的描述。

實際上,單線程無阻塞應用程序是單處理器硬件最高效的設計。當我們只有一個CPU並且應用程序完全沒有阻塞時,應用程序可以充分利用CPU的功率。非阻塞應用程序意味着應用程序不會調用任何可能等待事件的函數。所有的IO操作都是異步的。這意味着應用程序不會從套接字調用簡單的read(),因爲該調用可能會等待數據可用。非阻塞應用程序使用一些機制來告知應用程序數據是否可用,並且它可以調用read()而沒有呼叫等待的風險。所以理想的非阻塞應用程序只需要一個系統中的一個CPU的線程。由於nginx使用非阻塞調用,所以多線程中的處理沒有意義,因爲不會有CPU執行其他線程。

當網卡發出中斷時,從網卡接收到緩衝區的實際數據在內核中完成。然後nginx在緩衝區中獲取請求並處理它。直到當前的請求處理完成或直到當前的請求處理需要可能阻止(例如磁盤讀取)的動作時,開始處理另一個請求沒有任何意義。