php 提高吞吐量,如何提高網站的吞吐量

吞吐量定義

百科

吞吐量是指對網絡、設備、端口、虛電路或其他設施,單位時間內成功地傳送數據的數量(以比特、字節、分組等測量)。

以上的定義比較寬泛,定義到網站或者接口的吞吐量是這樣的:吞吐量是指系統在單位時間內處理請求的數量。這里有一個注意點就是單位時間內,對于網站的吞吐量這個單位時間一般定義為1秒,也就是說網站在一秒之內能處理多少http(https/tcp)請求。與吞吐量對應的衡量網站性能的還有響應時間、并發數、QPS每秒查詢率。

響應時間是一個系統最重要的指標之一,它的數值大小直接反應了系統的快慢。響應時間是指執行一個請求從開始到最后收到響應數據所花費的總體時間。

并發數是指系統同時能處理的請求數量,這個也是反應了系統的負載能力。

每秒查詢率(QPS)是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準,在因特網上,作為域名系統服務器的機器的性能經常用每秒查詢率來衡量。對應fetches/sec,即每秒的響應請求數,也即是最大吞吐能力。

我們以高速收費站為例子也許更直觀一些,吞吐量就是一天之內通過的車輛數,響應時間就是車速,并發數就是高速上同時奔跑的汽車數。由此可見其實以上幾個指標是有內在聯系的。比如:響應時間縮短,在一定程度上可以提高吞吐量。

其實以上幾個指標主要反映了兩個概念:

系統在單位時間之內能做多少事情

系統做一件事情需要的時間

提高吞吐量

以下場景都是在假設程序不發生異常的情況下

服務器(進程)級別

服務器級別增加網站吞吐量也是諸多措施中最容易并且是效果最好的,如果一個網站能通過增加少量的服務器來提高吞吐量,菜菜覺得是應該優先采用的。畢竟一臺服務器的費用相比較一個程序員費用來說要低的多。但是有一個前提,就是你的服務器是系統的瓶頸,網站系統之后的其他系統并非瓶頸。如果你的系統的瓶頸在DB或者其他服務,盲目的增加服務器并不能解決你的問題。

通過增加服務器來解決你的網站瓶頸,意味著你的網站需要做負載均衡,如果沒有運維相關人員,你可能還得需要研究負載均衡的方案,比如LVS,Nginx,F5等。我曾經面試過很多入道不久的同學,就提高吞吐量問題,如果沒有回答上用負載均衡方案的基本都pass了,不要說別的,這個方案就是一個基礎,就好比學習一個語言,你連最基本的語法都不會,我憑什么讓你通過。有噴的同學可以留言哦

其實現在很多靜態文件采用CDN,本質上也可以認為是增加服務器的策略

線程級別

當一個請求到達服務器并且正確的被服務器接收之后,最終執行這個請求的載體是一個線程。當一個線程被cpu載入執行其指令的時候,在同步的狀態下,當前線程會阻塞在那里等待cpu結果,如果cpu執行的是比較慢的IO操作,線程會一直被阻塞閑置很長時間,這里的很長是對比cpu的速度而言,如果你想有一個直觀的速度對比,可以去查看菜菜以前的文章:

高并發下為什么更喜歡進程內緩存

當一個新的請求到來的時候,如果沒有新的線程去領取這個任務并執行,要么會發生異常,要么創建新的線程。線程是一種很稀缺的資源,不可能無限制的創建。這種情況下我們就要把線程這種資源充分利用起來,不要讓線程停下來。這也是程序推薦采用異步的原因,試想,一個線程不停的在工作,遇到比較慢的IO不會去等待結果,而是接著處理下一個請求,當IO的結果返回來得到通知的時候,線程再去取IO結果,豈不是能在相同時間內處理更多的請求。

程序異步化(非阻塞)會明顯提高系統的吞吐量,但是響應時間可能會稍微變大

還有一點,盡量減少線程上線文在cpu的切換,因為線程上線文切換的成本也是比較大的,在線程切換的時候,cpu需要把當前線程的上下文信息記錄下來用以下次調用的時候使用,然后把新線程的上下文信息載入然后執行。這個過程相對于cpu的執行速度而言,要慢很多。

不要拿Golang反駁以上觀點,golang的協程雖然是用戶級別比線程更小的載體,但是最終和Cpu進行交互的還是線程。

Cpu級別

在講cpu級別之前,如果有一定的網絡模型的基礎,也許會好一些。這里大體闡述一下,現代操作系統都采用虛擬尋址的方式,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操作系統將虛擬空間分為兩類:內核空間和用戶空間。內核空間獨立于用戶空間,有訪問受保護的內存空間、IO設備的權限(所有的用戶空間共享)。用戶空間就是我們的應用程序運行的空間,其實用戶空間并沒有操作各種IO設備的權限,像我們平時讀取一個文件,本質上是委托內核空間去執行讀取指令的,內核空間讀取到數據之后再把數據復制到程序運行的空間,最后應用程序再把數據返回調用方。

2d4fce657780a11e0df0ee107500dca5.gif

image

通過上圖大體可以看出,內核會為每個I/O設備維護一個buffer(同一個文件描述符讀和寫的buffer不同),應用程序發出一個IO操作的指令其實通過了內核空間和用戶空間兩個部分,并且發生了數據的復制操作。這個過程其實主要包含兩個步驟:

用戶進程發出操作指令并等待數據

內核把數據返回給用戶進程(buffer的復制操作)

根據這兩個操作的不同表現,所以IO模型有了同步阻塞,同步非阻塞,異步阻塞,異步非阻塞的概念,但是這里并非此文的重點,所以不在展開詳細介紹。

利用cpu提高系統吞吐量主要目標是提高單位時間內cpu運行的指令數,避免cpu做一些無用功:

cpu負責把buffer的數據copy到應用程序空間,應用程序再把數據返回給調用方,假如這個過程發生的是一次Socket操作,應用程序在得到IO返回數據之后,還需要網卡把數據返回給client端,這個過程又需要把剛剛得到的buffer數據再次通過內核發送至網卡,通過網絡傳送出去。由此可見cpu把buffer數據copy到應用程序空間這個過程完全沒有必要,在內核空間完全可以把buffer數據直接傳輸至網卡,這也是零拷貝技術要解決的問題。具體的零拷貝技術在這里不再展開。

不要讓任何設備停下來,不要讓任何設備做無用功

通過增加cpu的個數來增加吞吐量

網絡傳輸級別

至于網絡傳輸級別,由于協議大部分是Tcp/ip,所以在協議傳輸方面優化的手段比較少,但是應用程序級別協議可以選擇壓縮率更好的,比如采用grpc會比單純的http協議要好很多,http2 要比http 1.1要好很多。另外一方面網卡盡量加大傳輸速率,比如千兆網卡要比百兆網卡速度更快。由于網絡傳輸比較偏底層,所以人工干預的切入點會少很多。

最后總結

大部分程序員都是工作在應用層,針對應用級別代碼能提高吞吐量的建議:

加大應用的進程數,增加并發數,特別在進程數是瓶頸的情況下

優化線程調用,盡量池化。

應用的代碼異步化,特別是異步非阻塞式編程對于提高吞吐量效果特別明顯

充分利用多核cpu優勢,實現并行編程。

減少每個調用的響應時間,縮短調用鏈。例如通過加索引的方式來減少訪問一次數據庫的時間

搜索公眾號:架構師修行之路,領取福利,獲取更多精彩內容

有疑問加站長微信聯系(非本文作者)

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

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

相關文章

ubuntu下如何查找某個文件的路徑

1.whereis 文件名 特點:快速,但是是模糊查找,例如 找 #whereis mysql 它會把mysql,mysql.ini,mysql.*所在的目錄都找出來. 2.find / -name 文件名 特點:準確,但速度慢,消耗資源大,例如我想找到PHP.ini的準確位置,就需要用 #find / -name php.ini 3.locate 文件名 強力推薦的方…

事件的學習

1.鼠標單擊事件( onclick &#xff09;: onclick是鼠標單擊事件&#xff0c;當在網頁上單擊鼠標時&#xff0c;就會發生該事件。同時onclick事件調用的程序塊就會被執行&#xff0c;通常與按鈕一起使用。 <!DOCTYPE HTML> <html> <head> <meta http-equiv…

使用您自己的規則在Eclipse中自定義PMD

PMD是非常好的Java代碼掃描程序&#xff0c;可幫助您避免潛在的編程問題。 它可以輕松擴展以滿足您的需求&#xff0c;并且本文將為您帶來與JPA的Enumerated注釋用法相關的自定義PMD規則的簡單示例。 在繼續閱讀之前&#xff0c;您應該檢查我以前的文章之一-JPA-Enumerated def…

切換oracle用戶impdp,Oracle 12c pdb使用expdp/impdp導入導出

12c推出了可插拔數據庫&#xff0c;在一個容器cdb中以多租戶的形式同時存在多個數據庫pdb。在為pdb做數據泵導入導出時和傳統的數據庫有少許不同。1&#xff0c;需要為pdb添加tansnames2&#xff0c;導入導出時需要在userid參數內指定其tansnames的值&#xff0c;比如 useridus…

搭建mysql集群,使用Percona XtraDB Cluster搭建

Percona XtraDB Cluster提供的特性有&#xff1a;1.同步復制&#xff0c;事務要么在所有節點提交或不提交。2.多主復制&#xff0c;可以在任意節點進行寫操作。3.在從服務器上并行應用事件&#xff0c;真正意義上的并行復制。4.節點自動配置。5.數據一致性&#xff0c;不再是異…

使用NoSQL實現實體服務–第4部分:Java EE

現在&#xff0c;我已經準備好了框架式的合同優先型Web服務&#xff0c;并使用Ektorp和CouchDB創建了數據訪問層 &#xff0c;是時候將它們連接到一個可以正常工作的實體服務中了 。 為此&#xff0c;我將使用Java EE和Glassfish 3.1。 值得注意的是&#xff0c;對于他的那種R&…

yii2之DetailView小部件

DetailView小部件用于展示單條數據記錄&#xff0c;可配置屬性很少&#xff0c;使用也很簡單&#xff0c;直接貼代碼&#xff0c;一看就懂&#xff01; yii小部件數據小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型對象&#xff…

克隆安裝oracle,Oracle 之 Cloning $oracle_home (克隆安裝oracle軟件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多臺機器重復安裝oracle軟件1、停止相關進程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目錄[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安裝和基本維護

基本介紹 GitLab是一個自托管的Git項目倉庫&#xff0c;可以自己搭建個人代碼管理的倉庫&#xff0c;功能與github類似。 安裝 操作系統&#xff1a;CentOS6.5 gitlab官網下載安裝地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安裝依賴的包 yum install cur…

Spring配置文件和Java配置

我的上一個博客介紹了Spring 3.1的配置文件&#xff0c;并解釋了使用它們的業務案例&#xff0c;并演示了它們在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多開發人員更喜歡使用Spring的基于Java的應用程序配置&#xff0c;因此Spring設計了一種使用帶有現有Configu…

php 刪除單個文件大小,php刪除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在刪除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基礎學習Python系列之函數之 函數之定義可變參數

若想讓函數接受任意個參數&#xff0c;就可以定義一個可變的參數&#xff1a; def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解釋器把傳入的一組參數封裝在一個tuple傳遞給可變參數&#xff0c;因此在函數內部&#xff0c;直…

在Windows上構建OpenJDK

通過做一些實驗&#xff0c;我發現手頭提供JDK源代碼來進行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我決定下載并編譯該野獸。 顯然&#xff0c;這花了我一些時間&#xff0c;盡管我最初的想法是&#xff0c;它應該和運行make命令一樣簡單&#xff1a;&…

unity中怎么在InspectorI面板加LOGO

轉載于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主鍵,oracle stream配置向導

1. Stream 的工作原理Stream 是Oracle Advanced Queue技術的一種擴展應用&#xff0c;這種技術最基本的原理就是收集事件&#xff0c;把時間保存在隊列中&#xff0c;然后把這些事件發布給不同的訂閱者。從DBA的角度來說&#xff0c;就是把捕獲Oracle數據庫產生的Redo日志&…

JavaScriptDOM 十四. Event DOM的屬性

1 <!DOCTYPE html>2 <html>3 <head>4 <title></title>5 <script type"text/javascript">6 7 /*8 1. --------------- Event DOM 事件DOM 用戶交互 ------------------9 當事件發生時, 執行JS功能代碼10 11 常用…

五、創建Bean的三種方式

五、創建Bean的三種方式轉載于:https://www.cnblogs.com/ljiwej/p/7280614.html

重寫到邊緣–充分利用它! 在GlassFish上!

現代應用程序開發的一個重要主題是重寫。 自從Java Server Faces引入和Java EE 6中新的輕量級編程模型以來&#xff0c;您一直在努力使用漂亮&#xff0c;簡單&#xff0c;可添加書簽的URL。 PrettyFaces很久以來就一直存在&#xff0c;即使它在3.3.3版本中可以說是成熟的&…

php yii框架路由,yii框架路由配置

首先要在服務器配置(httpd.conf)中開啟重寫模塊#開啟重寫模塊&#xff0c;將其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允許覆蓋開啟## Possible values for the Options directive are "None", "All",# or any combinat…

前端面試總結二

一、響應式和自適應的區別&#xff1a; 聯系(相同點)&#xff1a; 響應式設計(responsive design)和自適應設計(adaptive design)都是用來解決網頁在不同分辨率的屏幕和設備上展示的一項技術(或者說一種方法)。 區別&#xff1a; 響應式設計&#xff1a;通過CSS Media Queries(…