天天看點

Nginx 學習筆記(六)引入線程池 性能提升9倍

一、前言

1、Nignx版本:1.7.11 以上

2、NGINX采用了異步、事件驅動的方法來處理連接配接。這種處理方式無需(像使用傳統架構的伺服器一樣)為每個請求建立額外的專用程序或者線程,而是在一個工作程序中處理多個連接配接和請求。

3、NGINX工作在非阻塞的socket模式下,并使用了epoll 和 kqueue這樣有效的方法。

4、NGINX可以非常好地處理百萬級規模的并發請求。

5、阻塞操作可以毀掉NGINX的性能,我們必須不惜一切代價避免使用阻塞。

6、即使在目前官方的NGINX代碼中,依然無法在全部場景中避免使用阻塞,NGINX1.7.11中實作的線程池機制解決了這個問題

二、問題

1、通常情況下,NGINX是一個事件處理器,即一個接收來自核心的所有連接配接事件的資訊,然後向作業系統發出做什麼指令的控制器。

2、所謂“阻塞操作”是指任何導緻事件處理循環顯著停止一段時間的操作

3、操作可以由于各種原因成為阻塞操作

三、線程池

1、對NGINX而言,線程池執行的就是配貨服務的功能。它由一個任務隊列和一組處理這個隊列的線程組成。

2、當工作程序需要執行一個潛在的長操作時,工作程序不再自己執行這個操作,而是将任務放到線程池隊列中,任何空閑的線程都可以從隊列中擷取并執行這個任務。

3、磁盤的讀取速度不能比磁盤産生資料的速度快。

4、“從磁盤讀取”這個操作通常是阻塞操作最常見的示例,但是實際上,NGINX中實作的線程池可用于處理任何不适合在主循環中執行的任務。

5、線程池中執行的兩個基本操作是大多數作業系統中的read()系統調用和Linux中的sendfile()。