您好,登錄后才能下訂單哦!
這篇文章主要講解了“Nginx服務器的高性能原理IO復用介紹”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Nginx服務器的高性能原理IO復用介紹”吧!
導入
Nginx的處理IO的方式是異步非阻塞。Nginx之所以高性能除了異步非阻塞之外,還有一個核心的原因:IO復用。
什么是IO復用?
從最簡單的例子說起,一個請求連接來了之后,一般情況下是怎么處理請求的呢? 如圖1所示
瀏覽器的每次請求都會分配或者新啟一個進程與之對應,去處理請求。進程上下文之間的切換和新啟進程都會很浪費資源,怎么優化呢?(舉手)把多進城變成多線程。 那么就有了如下圖2的優化結果。
這么做有啥不好呢?在思考一下,線程是進程調度的最小單位,一個進程有多個線程在同時處理請求,那么如果這個進程因為異常情況意外終止了,那么它所擁有的所有的線程都將全部終止運行,換句話說,服務掛了。哈哈,好刺激。
那么IO復用派上用場了~~前面我們提到了異步非阻塞,那么我們這樣來設計,我們設計一個進程池、事件響應守護進程、請求服務進程。那么,我們的服務器的進程架構如下圖所示:
如上圖,我們將服務器分成了三個模塊:
進程池
事件響應
事件注冊
當瀏覽器請求到達服務器之后,首先連接到(3)請求服務進程,并注冊一個事件,當請求發送數據的時候,這個時候會產生一個讀事件,這個時候會有(2)事件響應進程會響應,將事件交給(1)進程池處理,同時再注冊一個寫事件。當進程池將請求處理完成之后,會響應寫事件將處理的結果返回給瀏覽器。
那么IO復用所復用的是什么呢?
IO復用就是用一個進程來響應真實的請求事件。本質上復用的是進程。
Select與Epoll
當有讀寫事件發生了,事件守護進程響應交給進程池處理,同時再注冊一個寫事件,但是進程池怎么知道是哪個socket有事件發生了呢?所以每次有事件發生的時候,事件響應進程就會遍歷一下所有的socket連接句柄,判斷一下是否有事件發生,這種響應事件的方式就被稱為Select模型。
怎么去優化呢?如果每次有事件發生,如果能知道是確切的哪個socket連接的事件,效率就很高了,這樣方式就是Epoll模型。 舉個例子
假如餐館有人要結賬,服務員就跟老板說一聲:“有人要結賬”,老板不知道是哪一桌要結賬,就需要挨個問一遍,這樣的方式就是select,時間復雜度O(n)。
假如餐館有人要結賬,服務員就跟老板說一聲:“5號桌要結賬”,這樣的方式就是epoll,時間復雜度O(1)。
從大的方面了解一個高性能的服務器演化的過程,總結一下:池的概念會很大的提高性能,本次說到的是進程池,改成線程池(其實是多進程多線程模式)也是一樣。
感謝各位的閱讀,以上就是“Nginx服務器的高性能原理IO復用介紹”的內容了,經過本文的學習后,相信大家對Nginx服務器的高性能原理IO復用介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。