如何提高服務器併發處理能力?

rammstein69


任何一臺服務器,都是有性能上限的。服務器處理請求需要消耗服務器端的資源,比如說:CPU、內存、網絡連接數、磁盤I/O等,由於服務器端的資源是有限的,所以它能同時處理的請求也是有限的。

不同運維人員管理的服務器性能上也是會有差異的,我們可以通過一系列的技術手段來提升服務器的併發處理能力。

服務器併發能力指什麼?

服務器在一段時間內能處理的請求數越多,就代表此服務器性能越好,我們就說此服務器併發能力越高。

如何提升服務器併發能力?

服務器併發能力的提升不光光要從服務端優化,客戶端的優化也是不可缺少的。這裡列舉了一些方案供大家參考:

1、服務器端優化

  • 硬件升級:不同業務類型對服務器硬件要求不同,比如數據庫服務器對硬盤和CPU要求較高,NoSQL服務器對內存要求高;

  • 帶寬升級:服務器帶寬也會限制網絡請求連接數,帶寬小請求也會越慢;

  • 請求分流:通過負載均衡、集群、分佈式架構將請求分攤到多臺服務器上,減少單一服務器的負載壓力;

  • 應用優化:代碼裡避免死循環、對於網絡請求要控制好超時時間;能異步處理的邏輯則異步化處理;

  • 數據庫優化:SQL優化以提升SQL執行效率;數據庫讀寫分離避免讀、寫鎖帶來的性能開銷;避免不必要的鎖;

  • 合理的緩存:藉助NoSQL加快數據查詢速度;

  • 動靜分離:動態請求與靜態請求分離。

2、客戶端優化

  • 減少不必要的請求:合理利用好客戶端緩存及請求合併,減少不必要的請求;


  • CDN緩存減少回源頻率:藉助CDN來緩存頁面,減少回源頻率,而CDN本身就是分佈式的。

以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!

網絡圈


既然題目中問的是提高【服務器】併發處理能力,那麼先說說關於提高單機服務器性能的方法;一臺服務器在單位時間裡,能夠處理的請求越多,就說明服務器併發處理能力越強。

  • 內存:減少內存的分配和釋放,這個本質上只為了內存分配和數據複製的時間;比如程序在啟動的時候,就申請一塊足夠大的內存,不需要再次分配;另外可以考慮內存共享。

  • CPU:使用多線程,提高CPU的併發度;但是線程數不可以無限制地增加,因為進程切換也是需要花費時間的;減少使用不必要的鎖,因為當一個資源被鎖住的時候,其餘的進程會等待鎖的釋放;改進I/O模型,使I/O和CPU計算儘量重疊進行,減少CPU空閒和調度的時間。


  • 網絡:根據應用的特點,合理地選擇使用長鏈接還是短鏈接;因為建立連接是很耗時的,但是如果要使用長鏈接,依然要考慮超時的問題,因為如果連接時間過長並且沒有使用,需要維持空閒連接,影響服務器性能。

  • 提高硬件資源:說白了,就是花更多的錢,買更好的設備,比如帶寬、更大的內存、更多的CPU、SSD等等。

還有很多手段,可以提高整個項目的併發處理能力:

  • 負載均衡、集群:一臺服務器再怎麼優化,也不如十臺服務器同時工作,通過負載均衡,把請求分發到多臺服務器上進行處理;另外一個好處,當一臺服務器發生故障的時候,並不會影響整個項目的運行;

  • 緩存:其目的就是減少服務器的計算,把數據直接返回給用戶;比如CDN、本地緩存、分佈式緩存等等;

  • 分佈式:如果說集群是把相同的項目部署在多臺服務器上,那麼分佈式相當於把一個項目拆分成多個項目,每個子項目都可以獨立地集群化部署;分佈式架構意味著可以利用更多的服務器,能過處理的併發訪問會越大。

  • 異步:調用方不需要等待被調用方處理完成,可以先做其它的事情,所有的事情可以併發處理;異步可以通過消息隊列來實現異步;


  • 冗餘、彈性擴縮容:根據訪問量,部署更多一些的服務器;當有突發流量的時候,彈性擴容機制可以保證快速地增加機器的數量,保證系統的穩定運行;

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


會點代碼的大叔


1.評估你的業務複雜度,預估用戶併發量

2.基於你的評估,拆分模塊,可以按照CQRS模型拆分,比如拆分出讀和寫,隔離核心接口。

3.考慮你的業務模型中,哪些可以異步化,可以使用多線程(線程池)或者mq形式分發給子模塊或者子系統進行處理

4.利用io多路複用模型,並調整你服務器的文件描述符、tcp鏈接等參數達到最佳

5.讀多用緩存,構建多級緩存,應用內緩存作為一級緩存,redis作為二級緩存。同時避免出現慢sql,大事務。

6.寫多嘗試mq異步化,消峰填谷。選擇合適的數據存儲方式(數據庫的存儲引擎,文件的分佈式存儲),io是最大的瓶頸,要進行優化。同時減少鎖的競爭,可使用樂觀鎖形式。

7.對你的編程語言進行優化,比如java的jvm gc也會影響性能的。

8.可嘗試跨語言編程,或者直接使用擅長高併發的語言,golang erlang rust等

9.根據你的評估選擇合適的硬件資源,性能不是硬件砸出來的,要做資源評估,對接口進行壓測。可以使用cdn,數據庫,緩存等使用物理機,應用使用容器技術。確定你的接口是io密集還是cpu密集,io密集區分硬盤io還是網絡io,分別採用ssd或高速網絡。對於cpu密集要提高cpu和內存。對於數據庫和緩存,cpu,內存和網絡都要求資源高,網絡要保證萬兆光模塊。

10.對於你的數據庫,緩存等與應用的之間的網絡建議距離越近越好,甚至是同一機房。

無論是單體應用,還是構建分佈式,微服務,無論採用何種架構模式,對於性能,都要隨時關注,不斷優化,通過壓測、觀察生產環境,確保性能穩定。同時,追求性能是好,但是不要因為追求而追求,除了性能,還有可靠性和系統的穩定性。引入一種提高性能的手段,也增加一點系統複雜度,意味著可靠性和穩定性要下降一點,我們更應該為這些下降的穩定性和可靠性做保證。


kid7157887


什麼是服務器併發處理能力

一臺服務器在單位時間裡能處理的請求越多,服務器的能力越高,也就是服務器併發處理能力越強。


服務器的本質工作就是,爭取以最快的速度將內核緩衝區中的用戶請求數據一個不剩地都拿出來,然後儘快處理,再將響應數據放到一塊又能夠與發送數據的緩衝區中,接著處理下一撥請求。


而服務器併發處理能力,可以通過吞吐率來觀察,吞吐率,單位時間裡服務器處理的最大請求數,單位req/s。可以利用Jmeter工具進行測試服務器服務器併發處理能力。


例如服務器的性能,web程序的併發能力,代碼,數據庫等等,這裡以一個Web程序為例,說明一下提高服務器處理併發能力的


服務性能提高

服務器之所以可以同時處理多個請求,在於操作系統通過多執行流體系設計使得多個任務可以輪流使用系統資源,這些資源包括CPU,內存以及I/O. 這裡的I/O主要指磁盤I/O, 和網絡I/O。


服務器的性能也可能是性能的瓶頸,這個時候,就需要更好的服務器。比如單核CPU提高到多核,內存也需要增加。


web程序的併發能力

web程序員併發能力,web在相同時間內處理更多的請求,多線程處理最為關鍵。比如SpringBoot默認使用Tomcat,而tomcat的默認線程為200,即在同一時刻,只能處理200個請求,而其他需要排隊等待,在服務器性能足夠好的情況,就需要將Tomcat的處理線程增加到合適的大小。


線程的增加,需要經過性能測試,才能知道多少合適,線程的切換也是需要資源和時間的,因此不能無限擴大。


多個web同時處理。通過對web的集群,讓web處理的併發增加。如圖:

使用nginx作為轉發,web服務器集群是的處理的請求數增加。


代碼

1. 優化代碼處理的速度,一空間換時間,對於執行的慢的程序,可以通過消耗內存(即構造新的數據結構)來進行優化。


2. 利用池化技術複用,池化技術能夠減少資源對象的創建次數,提高程序的性能,特別是在高併發下這種提高更加明顯。簡單點來說,就是提前保存大量的資源,以備不時之需。線程的創建是非常耗時和消耗資源的,通過池化池化技術解決這一點。


3. 減少使用不必要的鎖。服務器處理大量併發請求時,多個請求處理任務時存在一些資源搶佔競爭,這時一般採用“鎖”機制來控制資源的佔用,當一個任務佔用資源時,我們鎖住資源,這時其它任務都在等待鎖的釋放,這個現象稱為鎖競爭。

通過鎖競爭的本質,我們要意識到儘量減少併發請求對於共享資源的競爭。比如在允許情況下關閉服務器訪問日誌,這可以大大減少在鎖等待時的延遲時間。要最大程度減少無辜的等待時間。


數據庫

數據庫往往成為程序的瓶頸,程序多數都需要查詢數據庫,而數據庫的查詢插入都是有一定性質,特別是在數據量特別大的時候。

1. SQL優化以提升SQL執行效率;優化那些查詢慢的語句,並通過創建索引等手段來優化。

2. 數據庫讀寫分離避免讀、寫鎖帶來的性能開銷;Mysql實現主動,主插入操作,而查詢使用從數據庫。


冰魄秋雨


所謂服務器併發處理能力就是考驗同一時間段,用戶請求的數量,請求的數量越多,代表服務器的併發處理能力越強。如何提高服務器的併發處理能力,從以下四個方面進行簡單總結:

數據庫:提高sql的執行效率,可以通過創建索引等方式來優化執行緩慢的語句;同時數據庫可以採用讀寫分離的模式。

分佈式:分佈式相當於把一個系統拆分成多個子系統,每個子系統之間可以獨立的進行集群化部署,相當於使用更多的服務器提高併發處理能力。

異步:從實際的業務角度出發,考慮哪些需求可以異步化處理,即調用方不需要等到被調用方處理完成,就可以進行其他操作,同時處理,異步可以通過消息隊列來實現。

緩存:緩存實際上就是減少了服務器的運算處理過程,把數據直接呈現在前端進行展現,以此提高服務器的併發處理能力。


數通暢聯


你好,我是大蘇,我理解的提高併發處理能力的方法主要以下兩大點,希望對你有幫助

一、通過合理的架構實現高併發,高可用

單臺服務器的處理能力都是有限,如果是隻有一臺服務器那麼故障率會很高,所以這個架構主要有幾個關鍵點:

1、負載均衡服務消除單點故障,保證高併發時系統的健壯性。Web應用服務器可夠根據交易、促銷等業務需求的變化動態擴展,應對推廣、促銷等業務峰值。2、可以Web應用服務器與數據庫之間使用緩存,減少數據庫讀寫,提高性能3、圖片、Css、Js、Html等靜太文件可使用CDN加速服務,提高用戶的訪問速度,減少服務器的I/O讀寫等4、數據庫採用主備架構,避免核心數據的單點風險,提高可用性

二、代碼優化及數據庫優化

除了架構上,我們還要從下面這幾個層面優化:

1、客戶端發出請求層面,常見的手段有:儘量利用瀏覽器的緩存功能,減少訪問服務端,比如:js、css、圖片等;可以考慮使用壓縮傳輸的功能,減少網絡流量,也會提高傳輸速度;考慮使用異步請求,分批獲取數據。2、Web服務器層面,常見的手段有:使用最新的JVM,並進行配置優化;對Web服務器進行配置優化,比如:調整內存數量、線程數量等;3、Web應用層面,常見的手段有:動態內容靜態化、Java開發優化、優化處理業務邏輯的算法、合理高效的利用緩存;優化訪問數據庫的Sql,可以考慮利用存儲過程等數據庫的能力;合理使用多線程,加快業務處理;部分業務可以考慮內存數據庫,或者是進行純內存處理;儘量避免遠程調用、大量I/O等耗時的操作;合理規劃事務等較為耗資源的操作;合理使用異步處理;對部分業務考慮採用預處理或者預計算的方式,減少實時計算量;內部系統間業務儘量直接調用、直接處理,減少WebService、工作流等。4、數據庫層面,常見的手段有:合理選擇數據庫的引擎,比如Mysql的InnoDB與MyISAM引擎;進行配置優化;可以考慮使用存儲過程來處理複雜的數據邏輯;數據庫集群,進行讀寫分離;合理設計數據庫的表結構、索引等;分庫、分表,降低單庫、單表的數據量。

蘇志遠


1.提高服務器性能,升級服務器配置

2.保障性能的前提下,提高帶寬,提高吞吐能力

3.優化服務器配置,小幅度提高服務器處理能力

4.將服務器進行分割,比如數據庫不建在同一臺機器上


分享到:


相關文章: