linux nginx線程池,nginx使用線程池提升9倍性能

眾所周知nginx使用異步,事件驅動方法處理連接。這意味著nginx使用一個worker進程處理多個連接和請求,而不是每一個請求有一個專門的進程或著線程處理(像傳統架構的服務器那樣,例如apache)。為了實現這個目的,nginx使用非阻塞模式的socket和高效的方法epoll和kqueue。

因為高負荷進程的數量少且相對不變(通常1個cpu核心配1個進程),它內存消耗少,cpu時間沒有浪費在任務切換上。這種處理請求的方式的優勢也因為nginx而被大家所熟知。nginx能夠成功處理數百萬并發請求同時擴展性非常好。

49d6a52dde3d7507df8e920f00ac5fea.png

不過異步,事件驅動方法還是有一個問題。或者像我想的那樣有一個“敵人”。這個敵人的名字是:阻塞。不幸的是,許多第三方的模塊使用阻塞調用,同時用戶(甚至作為模塊的開發者)也沒意識到缺點。阻塞操作能毀掉nginx的性能,需要不惜一切代價避免阻塞。

甚至當前nginx的官方代碼中也沒有完全避免阻塞操作在所有的例子中,為了解決這個問題,新的“thread pools”機制在nginx1.7.11中被實現了。線程池是什么以及它如何使用,一會我們就講到。

問題

首先,為了更好的理解問題,再簡單介紹一下nginx的原理。

一般,nginx是一個事件handler,一個controller接收來自內核的信息關于所有連接上發生的事件和給操作系統發送命令告訴它做什么。事實上,nginx做了所有困難的工作通過組織操作系統,而操作系統只做讀和寫字節的常規工作。所以對于nginx來說快速響應式非常重要的。

059a2f1531b44771cabffa426273a0e7.png

事件會超時,sockets的讀和寫通知,發生錯誤的通知。nginx收到許多事件然后一個一個處理它們。因此所有事情在一個簡單的循環在一個隊列上通過一個線程處理。nginx從隊列上取出一個消息事件然后做出反應通過寫或讀一個socket。在大多數情況下,這是相當快的(或許只需要幾個cpu時鐘去拷貝數據到內存)同時nginx繼續立刻處理隊列里的其他事件。

3b1e5f53f9aa69f05d76ddabcc76c85b.png

但是如果某個長和重的操作出現的時候會發生什么呢?整個事件處理循環將會被卡住等待這個操作的完成。

所以,一個阻塞的操作是指任何能夠停止事件處理循環許多時間的操作。操作被阻塞有很多原因。例如,nginx可能忙于處理長時的cpu密集操作,或者需要等待訪問一個資源(如一個硬盤,一個鎖,一個同步方式的方法調用返回訪問數據庫),主要的問題是當處理這些操作的時候,nginx的worker進程不能夠做其它的事情,也不能處理事件,即使有許多系統資源仍然可用,那些隊列里的事件可以用這些資源來處理。

想象一個商店的銷售面前排了很長的隊伍,隊首的人想要一個不在商店但在倉庫里的東西。銷售人員去庫房取東西。那么整個隊列會等幾個小時來取這個東西,隊列里的所有人都會不高興。你能想象這些人的反應嗎?隊列每個人的等待時間都增加了幾個小時,但是它們需要的東西就在店里,很快就能完成購買。

6eb92b7217a69809212f94eb284c8a9c.png

幾乎會出現同樣的事情當nginx想要讀一個不在內存中緩存的大文件,需要從磁盤中讀取的時候,硬盤很慢,然后隊列中等待的其它請求并不一定需要訪問硬盤,但他們被強制等待。結果等待時間增加,系統資源沒有完全使用。

ab9c200fa79c60eb70708f7f1b5255ee.png

某些操作系統提供了異步的接口來發送文件,nginx可以使用這些接口。一個好的例子是FreeBSD。不幸的是,linux不能這樣。雖然linux提供了異步接口來讀文件,它有許多缺點。第一就是訪問文件和緩存的對齊需求,nginx能夠處理它。第二個就更糟糕一些,異步接口需要O_DIRECT標識被設置在文件描述符上,這意味著任何對文件的訪問將會越過內存中的緩存,會增加磁盤的負載。所以并不是最優的在許多場景下。

為了解決這個問題,線程池在nginx1.7.11中被引進,它默認沒有被加入到nginx plus中。

下面介紹一下線程池時什么和它時如何工作的。

待續。。。

原文

http://nginx.com/blog/thread-pools-boost-performance-9x/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 開源項目

https://github.com/Trinea/android-open-project http://a.codekk.com/轉載于:https://www.cnblogs.com/syjhsgcc/p/4902885.html

【空間數據庫】ArcSDE 10.7+SQLEXPRESS+ArcServer 10.7.ecp企業級數據庫環境搭建

作者一直使用的是ArcGIS10.6做空間數據庫相關工作,可以參照文章《ArcGIS 10.6 Database_Server_Desktop安裝、連接數據庫服務、創建企業級數據庫》。今天我們演示安裝ArcGIS10.7自帶的數據庫服務(SQL Server 2014 Express版本)、連接數據庫服務和創建數據庫。 一、軟件準備 …

Android之解決androidx.appcompat.widget.Toolbar去掉左邊距

1 問題 androidx.appcompat.widget.Toolbar默認左邊有間距 2 解決辦法 在Toolbar下面添加如下熟悉 app:contentInsetLeft"0dp"app:contentInsetStart"0dp"app:contentInsetEnd"0dp"app:maxButtonHeight"20dp"app:titleMargin"0…

C# 配置日志記錄

在 .NET Core 中,可以給配置文件使用提供程序,例如從 JSON 或 XML文件、環境變量或命令行參數中讀取配置。只需要從 NuGet 包 Microsoft.ExtensionsConfiguration 中創建一個ConfigurationBuilder,并向此構建器添加提供程序。要添加 JSON 提供…

使用“using” 的 “Cursor”

很多時候,我們會寫下面的這段代碼: private void button1_Click(object sender, EventArgs e) {Cursor cursor Cursor.Current;this.Cursor Cursors.WaitCursor;LongTimeMethod();this.Cursor cursor; }private void LongTimeMethod() {for (int i 0…

《看聊天記錄都學不會C語言?太菜了吧》(21)(必懂!題解)在現實生活中,打擂臺比賽爭名次竟用的是冒泡排序?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

ArcGIS 10.7如何獲取矢量多邊形所有折點的坐標(平面坐標和經緯度坐標)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分類算法學習之實現Naive Bayes分類示例

1.簡介 (1) 貝葉斯分類器的分類原理發源于古典概率理論,是通過某對象的先驗概率,利用貝葉斯公式計算出其后驗概率,即該對象屬于某一類的概率,選擇具有最大后驗概率的類作為該對象所屬的類。樸素貝葉斯分類器(Naive Bayes Classifi…

linux重新做yum,Linux 系統 Centos 7.7 下重裝yum

0. 背景不小心誤刪除yum后,開始想辦法重新安裝。1. 重裝 yum1.1 步驟需要下面4個包,我們需要下載到它們yum-metadata-parserpython-iniparseyum-plugin-fastestmirroryum-3.4.3下載后,安裝它們。1.2 去哪里下載?當然,搜…

jenkins2 groovy語法

文章來自:http://www.ciandcd.com文中的代碼來自可以從github下載: https://github.com/ciandcd安裝:wget https://dl.bintray.com/groovy/maven/apache-groovy-binary-2.4.7.zipunzip apache-groovy-binary-2.4.7.zipsudo ln -s /home/osbox…

Android之glide加載圖片圓角效果

1 問題 Android加載圖片需要圓角化,有什么簡單粗暴的方法嗎?當然有,用我們的神器glide 2 解決辦法 1)簡單辦法 ImageView imageView = (ImageView)helper.getView(R.id.keepHomeAppImageview);Glide.with(mContext).asBitmap().load(iconUrl) // .ov…

一維條形碼***技術(Badbarcode)

【轉】http://future-sec.com/badbarcode.html 前言在日常生活中,條形碼隨處可見,特別在超市,便利店,物流業,但你們掃的條形碼真的安全嗎?之前TK教主在PacSec介紹的條形碼攻擊和twitter上的demo視頻太炫酷&…

ArcGIS 10.7 模型構建器Model Builder空間建模流程化作業案例----影像拼接與掩膜裁剪

Model Builder(模型構建器)是一個用來創建、編輯和管理空間分析模型的應用程序,是一種可視化的編程環境,通過對現有工具的組合完成新模型或軟件的制作,為設計和實現空間處理模型(包括工具、腳本和數據)提供了一個圖形化的模型框架。 本文以影像數據的拼接和掩膜裁剪為例…

《看聊天記錄都學不會C語言?太菜了吧》(22)(必懂!題解 1-100 內素數)素數原來是質數!為什么你不早說!

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋…

Hello Playwright:(4)自動化測試

利用 Playwright 提供的 API,我們在瀏覽器上做的很多事情都可以自動化。例如,搜索數據、填寫表單和下載文件等等。但最適合的工作,就是自動化測試 Web 應用程序。自動化測試測試是軟件開發中的一項基本任務,至少,你需要…

通才和專家:如何選擇

原文:Generalists and specialists: thoughts on hiring作者:Nicholas C. Zakas 我的職業生涯經歷過各種規模的公司,從非常小的五人創業團隊到 13000 人的大公司雅虎,再到約 1000 人規模的 Box(我目前所在)…

Android之解決NestedScrollView嵌套ViewPager導致出現左右頁面滑動沖突

1 問題 NestedScrollView里面嵌勒ViewPagerTabLayout,導致在這個頁面監聽不到左右頁面滑動,需要解決這個監聽滑動問題。 2 解決辦法 val nestedScrollView: NestedScrollView mainView!!.findViewById(R.id.nestedScrollView)nestedScrollView.isFillV…

linux和裸機的區別,操作系統與裸機的區別

我們在學習stm32到一定階段可能會了解操作系統,然后便有這種問題產生,下面我就來粗略說說“操作系統與裸機的區別,以及stm32能運行什么操作系統,能運行linux系統嗎”等問題。操作系統與裸機的區別裸機運行的程序代碼,一…

ArcGIS 10.7拆分多部件要素(Multipart Features)至單部件要素的兩種方法

GIS中經常會出現多部件要素的現象,為了便于檢查拓撲等關系,需要將其拆分為單個的部件。例如,在用同一個圖層的多個圖斑去裁剪(Clip)時,或者將多個不相鄰的圖斑進行合并(merge)時,可能會產生多部件要素,本文演示ArcGIS10.7版本中常見的兩種拆分多部件要素至單部件要素…

spring-session + redis 實現集群 session 共享

2019獨角獸企業重金招聘Python工程師標準>>> 目前市面上實現session共享的方案有很多,其中比較常用的是使用Tomcat、Jetty等web服務器提供的session共享功能,以此將session內容統一存放在數據庫(如mysql)或者緩存&…