1. 並發數與伺服器配置的關系,能舉個例子說明一下嗎
做網站的話,伺服器要分前端和後端的,還有cache、負載平衡、網路帶寬專和存儲系統等問屬題要考慮,不是單講一台伺服器就能說清楚的。
只討論一台伺服器的話,3650雙路加4G內存支持到5萬並發是容易達到的,即使針對業務流比較復雜的情況,也能滿足很大程度的需要。
但是考慮到存儲子系統,比如4塊sas硬碟raid0,可能只能達到5000數量級的並發請求。如果是以另外的光纖盤陣來支持存儲則可以顯著提高硬碟傳輸帶寬的性能。
最後還要考慮到你的網路帶寬,對大多數網站來說,通常這才是最大的瓶頸所在。也就是說即使你的cpu、內存、硬碟都沒問題,也會因為租用的網路帶寬限制而影響最大的並發數。
還有一點,經過優化的網站程序對結果也有很大影響。事實上很多網站的訪問體驗很糟糕,其實不是因為硬體的原因,而是程序寫的太爛。
很抱歉我本想以單台伺服器來講,但是說著說著又變成講網站架構了。不如舉個例子吧,如果你在這台伺服器上運行discuz或動網之類的服務,在沒有特別高峰的情況下,5萬並發是沒有問題的。
2. 淺談如何提高伺服器並發能力
吞吐率,單位時間里伺服器處理的最大請求數,單位req/s
從伺服器角度,版實際並發用戶數權的可以理解為伺服器當前維護的代表不同用戶的文件描述符總數,也就是並發連接數。伺服器一般會限制同時服務的最多用戶數,比如apache的MaxClents參數。
這里再深入一下,對於伺服器來說,伺服器希望支持高吞吐率,對於用戶來說,用戶只希望等待最少的時間,顯然,雙方不能滿足,所以雙方利益的平衡點,就是我們希望的最大並發用戶數。
3. 什麼是伺服器並發量並發量如何計算
並發的意思是指網站在同一時間訪問的人數,人數越大,瞬間帶寬要求更高。伺服器並發量分為:1.業務並發用戶數;2.最大並發訪問數;3.系統用戶數;4.同時在線用戶數;
說明伺服器實際壓力,能承受的最大並發訪問數,既取決於業務並發用戶數,還取決於用戶的業務場景,這些可以通過對伺服器日誌的分析得到。
一般只需要分析出典型業務(用戶常用,最關注的業務操作)
給出一個估算業務並發用戶數的公式(測試人員一般只關心業務並發用戶數)
C=nL/T
C^=C+3×(C的平方根)
C是平均的業務並發用戶數、n是login session的數量、L是login session的平均長度、T是指考察的時間段長度、C^是指業務並發用戶數的峰值。
假設OA系統有1000用戶,每天400個用戶發訪問,每個登錄到退出平均時間2小時,在1天時間內用戶只在8小時內使用該系統。
C=400×2/8=100
C^=100+3×(100的平方根)=100+3×10=130
另外,如果知道平均每個用戶發出的請求數u,則系統吞吐量可以估算為u×C
精確估算,還要考慮用戶業務操作存在一定的時間集中性(比如上班後1小時內是OA系統高峰期),採用公式計算仍然會存在偏差。
285-104-1346
4. tomcat 怎麼修改伺服器的並發連接數
用tomcat的資料庫連接池,修改tomcat配置文件server.xml,在context標簽中加上
<Context path="" docBase="ROOT" debug="0">
<Resource name="jdbc/OracleDB" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/OracleDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@10.11.6.1:1521:dbname</value>
</parameter>
<parameter>
<name>username</name>
<value>yourname</value>
</parameter>
<parameter>
<name>password</name>
<value>yourpasswd</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>1000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value> </parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
maxActive 是最大激活連接數,這里取值為1000,表示同時最多有1000個資料庫連接。maxIdle是最大的空閑連接數,這里取值為20,表示即使沒有資料庫連 接時依然可以保持20空閑的連接,而不被清除,隨時處於待命狀態。MaxWait是最大等待秒鍾數,這里取值-1,表示無限等待,直到超時為止,也可取值 9000,表示9秒後超時。
5. 如何提高伺服器並發處理能力
消除瓶頸是復提高服務制器性能和並發能力的唯一途徑。
如果你能夠消除所有的瓶頸,你就能夠最大的發揮硬體性能,讓系統的性能和並發數到達最佳。
採用多線程多核編程,使用事件驅動或非同步消息機制,盡量減少阻塞和等待操作(如I/O阻塞、同步等待或計時/超時等)。
原理:
1、多線程多核編程,消除cpu瓶頸。
2、採用IOCP或epoll,利用狀態監測和通知方式,消除網路I/O阻塞瓶頸。
3、採用事件驅動或非同步消息機制,可以消除不必要的等待操作。
4、如果是Linux,可以採用AIO來消除磁碟I/O阻塞瓶頸。
5、在事件驅動框架或非同步消息中統一處理timer事件,變同步為非同步,而且可以在一個線程處理無數timer事件。
6、深入分析外部的阻塞來源,消除它。
比如資料庫查詢較慢,導致伺服器處理較慢,並發數上不去,這時就要優化資料庫性能。
7、如果與某個其他server通信量很大,導致性能下降較多。
可以考慮把這兩個server放在一個主機上,採用共享內存的方式來做IPC通信,可以大大提高性能。
6. 伺服器的並發是什麼意思,怎麼計算的!
伺服器並發指的是多個用戶同時訪問資料庫中的同一欄位的行為。這樣的用戶行回為對於伺服器的答性能是一種考驗。
但是,再好的伺服器也有自己的性能上限,當並發用戶數過多的時候,再好的伺服器也支持不住。事實上,我們在生活中經常能遇到由於並發用戶過多而導致的系統緩慢甚至癱瘓現象。比方說,很多使用過那些在線考試報名系統的朋友都會發現,半夜登錄系統報名比白天登錄系統報名要容,網頁反應速度也要快一些,這就是由於晚上的並發用戶數比較小的原因。
對於IT運維人員來說伺服器並發是恐怖的,因為伺服器的最大用戶並發數並不是IT運維人員所能控制的,我們能做到的只是採用各種手段來提升系統的性能,提升伺服器的性能利用率。
7. 個推伺服器的容量如何,能支持多少並發量呢
目前個推的單台伺服器並發量是500萬條的,能支持億量級的消息秒級送達的。
8. 如何提高伺服器並發能力
有什麼方法衡量伺服器並發處理能力
1. 吞吐率
吞吐率,單位時間里伺服器處理的最大請求數,單位req/s
從伺服器角度,實際並發用戶數的可以理解為伺服器當前維護的代表不同用戶的文件描述符總數,也就是並發連接數。伺服器一般會限制同時服務的最多用戶數,比如apache的MaxClents參數。
這里再深入一下,對於伺服器來說,伺服器希望支持高吞吐率,對於用戶來說,用戶只希望等待最少的時間,顯然,雙方不能滿足,所以雙方利益的平衡點,就是我們希望的最大並發用戶數。
2. 壓力測試
有一個原理一定要先搞清楚,假如100個用戶同時向伺服器分別進行10個請求,與1個用戶向伺服器連續進行1000次請求,對伺服器的壓力是一樣嗎?實際上是不一樣的,因對每一個用戶,連續發送請求實際上是指發送一個請求並接收到響應數據後再發送下一個請求。這樣對於1個用戶向伺服器連續進行1000次請求, 任何時刻伺服器的網卡接收緩沖區中只有1個請求,而對於100個用戶同時向伺服器分別進行10個請求,伺服器的網卡接收緩沖區最多有100個等待處理的請求,顯然這時的伺服器壓力更大。
壓力測試前提考慮的條件
並發用戶數: 指在某一時刻同時向伺服器發送請求的用戶總數(HttpWatch)
總請求數
請求資源描述
請求等待時間(用戶等待時間)
用戶平均請求的等待時間
伺服器平均請求處理的時間
硬體環境
壓力測試中關心的時間又細分以下2種:
用戶平均請求等待時間(這里暫不把數據在網路的傳輸時間,還有用戶PC本地的計算時間計算入內)
伺服器平均請求處理時間
用戶平均請求等待時間主要用於衡量伺服器在一定並發用戶數下,單個用戶的服務質量;而伺服器平均請求處理時間就是吞吐率的倒數,一般來說,用戶平均請求等待時間 = 伺服器平均請求處理時間 * 並發用戶數
怎麼提高伺服器的並發處理能力
1. 提高CPU並發計算能力
伺服器之所以可以同時處理多個請求,在於操作系統通過多執行流體系設計使得多個任務可以輪流使用系統資源,這些資源包括CPU,內存以及I/O. 這里的I/O主要指磁碟I/O, 和網路I/O。
多進程 & 多線程
多執行流的一般實現便是進程,多進程的好處可以對CPU時間的輪流使用,對CPU計算和IO操作重疊利用。這里的IO主要是指磁碟IO和網路IO,相對CPU而言,它們慢的可憐。
而實際上,大多數進程的時間主要消耗在I/O操作上。現代計算機的DMA技術可以讓CPU不參與I/O操作的全過程,比如進程通過系統調用,使得CPU向網卡或者磁碟等I/O設備發出指令,然後進程被掛起,釋放出CPU資源,等待I/O設備完成工作後通過中斷來通知進程重新就緒。對於單任務而言,CPU大部分時間空閑,這時候多進程的作用尤為重要。
多進程不僅能夠提高CPU的並發度。其優越性還體現在獨立的內存地址空間和生命周期所帶來的穩定性和健壯性,其中一個進程崩潰不會影響到另一個進程。
但是進程也有如下缺點:
fork()系統調用開銷很大: prefork
進程間調度和上下文切換成本: 減少進程數量
龐大的內存重復:共享內存
IPC編程相對比較麻煩
9. javaWeb如何提高並發數
對Collection、Map介面的類對象初始化時要先分配合理的空間大小,同時還要按照自已的實際需求選擇合適的對象。
2.優化循環體
循環是比較重復運行的地方,如果循環次數很大,循環體內不好的代碼對效率的影響就會被放大而變的突出。
3.少用new初始化一個實例
盡量少用new來初始化一個類的實例,當一個對象是用new進行初始化時,其構造函數鏈的所有構造函數都被調用到,所以new操作符是很消耗系統資源的,new一個對象耗時往往是局部變數賦值耗時的上千倍。同時,當生成對象後,系統還要花時間進行垃圾回收和處理。當new創建對象不可避免時,注意避免多次的使用new初始化一個對象。盡量在使用時再創建該對象,另外,應該盡量重復使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變數達到重用的目的。
4 .選擇合適的方法調用:
在Java中,一切都是對象,如果有方法(Method)調用,處理器先要檢查該方法是屬於哪個對象,該對象是否有效,對象屬於什麼類型,然後選擇合適的方法並調用。可以減少方法的調用,不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。另外,在方法前加上final,private關鍵字有利於編譯器的優化。
5.異常處理技巧
異常是Java的一種錯誤處理機制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創建一個新的對象,並進行相關的處理,造成系統的開銷,所以異常應該用在錯誤處理的情況,不應該用來控製程序流程,流程盡量用while,if等處理。在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。
6 .盡量使用局部變數
盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack) 中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。
7.同步處理技巧
同步主要出現在多線程的情況,為多線程同時運行時提供對象數據安全的機制,多線程是比較復雜話題,應用多線程也是為了獲得性能的提升,應該盡可能減少同步。
另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個方法或函數,而不是整個代碼。
8 .盡可能的使用Java自身提供的API
Java的API一般都做了性能的考慮,如果完成相同的功能,優先使用API而不是自己寫的代碼,如數組復制。
9 .盡量減少I/O操作
輸入/輸出(I/O)包括很多方面,我們知道,進行I/O操作是很消耗系統資源的。程序中應該盡量少用I/O操作。使用時可以注意: . 合理控制輸出函數System.out.println()對於大多時候是有用的,特別是系統調試的時候,但也會產生大量的信息出現在控制台和日誌上,同時輸出時,有序列化和同步的過程,造成了開銷。
特別是在發行版中,要合理的控制輸出,可以在項目開發時,設計好一個Debug的工具類,在該類中可以實現輸出開關,輸出的級別,根據不同的情況進行不同的輸出的控制。
10 .盡量使用緩存
讀寫內存要比讀寫硬碟上的文件要快很多,應盡可能使用緩沖,以便直接從內存中讀取數據。盡可能使用帶有Buffer的類代替沒有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進行處理I/O操作。
同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高
11 .盡量不使用同步:
Servlet是多線程的,以處理不同的請求,基於前面同步的分析,如果有太多的同步就失去了多線程的優勢了。
12.不用保存太多的信息在HttpSession中
很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統的開發,如網上商店系統會把購物車信息保存在該用戶的Session中,但當存儲大量的信息或是大的對象在會話中時,是有害的,特別是當系統中用戶的訪問量很大,對內存的需求就會很高。具體開發時,在這兩者之間應作好權衡。
13.清除SESSION:
通常情況,當達到設定的超時時間時,同時有些Session沒有了活動,伺服器會釋放這些沒有活動的Session,.. 不過這種情況下,特別是多用戶並訪時,系統內存要維護多個的無效Session。當用戶退出時,應該手動釋放,回收資源,實現如下:..
HttpSession theSession = request.getSession();
// 獲取當前Session
if(theSession != null){
theSession.invalidate(); // 使該Session失效
}
14 .緩存Home介面
EJB庫使用Enterprise Bean 的客戶端通過它的Home介面創建它的實例。客戶端能通過JNDI訪問它。伺服器通過Lookup方法來獲取。
JNDI是個遠程對象,通過RMI方式調用,對它的訪問往往是比較費時的。所以,在設計時可以設計一個類專門用來緩存Home介面,在系統初始化時就獲得需要的Home介面並緩存,以後的引用只要引用緩存即可。
15 .使用快速度的Jdbc驅動
JDBC API包括兩種實現介面形式,一種是純Java實現的驅動,一種利用ODBC驅動和資料庫客戶端實現,具體有四種驅動模式:
第一類:JDBC-ODBC橋,再加上ODBC驅動程序。
JDBC驅動程序是JDBC-ODBC橋再加上一個ODBC驅動程序。建議第一類驅動程序只用於原型開發,而不要用於正式的運行環境。橋接驅動程序由Sun提供,它的目標是支持傳統的資料庫系統。Sun為該軟體提供關鍵問題的補丁,但不為該軟體的最終用戶提供支持。一般地,橋接驅動程序用於已經在ODBC技術上投資的情形,例如已經投資了Windows應用伺服器。
盡管Sun提供了JDBC-ODBC橋接驅動程序,但由於ODBC會在客戶端裝載二進制代碼和資料庫客戶端代碼,這種技術不適用於高事務性的環境。另外,第一類JDBC驅動程序不支持完整的Java命令集,而是局限於ODBC驅動程序的功能,這種驅動方式也叫胖客戶,主要用於低並發請求,大數據量傳輸的應用。
第二類:本機API,部分是Java的驅動程序。
JDBC驅動程序是本機API的部分Java代碼的驅動程序,用於把JDBC調用轉換成主流資料庫API的本機調用。這類驅動程序也存在與第一類驅動程序一樣的性能問題,即客戶端載入二進制代碼的問題,而且它們被綁定了特定的平台。
第二類驅動程序要求編寫面向特定平台的代碼,主流的資料庫廠商,例如Oracle和IBM,都為它們的企業資料庫平台提供了第二類驅動程序,使用這些驅動程序的開發者必須及時跟進不同資料庫廠商針對不同操作系統發行的各個驅動程序版本。
另外,由於第二類驅動程序沒有使用純Java的API,把Java應用連接到數據源時,往往必須執行一些額外的配置工作。很多時候,第二類驅動程序不能在體系結構上與大型主機的數據源兼容;即使做到了兼容,效果也是比較差。
第三類:面向資料庫中間件的純Java驅動程序。
JDBC驅動程序是面向資料庫中間件的純Java驅動程序,JDBC調用被轉換成一種中間件廠商的協議,中間件再把這些調用轉換到資料庫API。第三類JDBC驅動程序的優點是它以伺服器為基礎,也就是不再需要客戶端的本機代碼,這使第三類驅動程序要比第一、二兩類快。另外,開發者還可以利用單一的驅動程序連接到多種資料庫。
第四類:直接面向資料庫的純Java驅動程序。
JDBC驅動程序是直接面向資料庫的純Java驅動程序,即所謂的「瘦」(thin)驅動程序,它把JDBC調用轉換成某種直接可被DBMS使用的網路協議,這樣,客戶機和應用伺服器可以直接調用DBMS伺服器。對於第四類驅動程序,不同DBMS的驅動程序不同。因此,在一個異構計算環境中,驅動程序的數量可能會比較多。但是,由於第四類驅動程序具有較高的性能,能夠直接訪問DBMS,所以這一問題就不那麼突出了, 這種驅動方式,主要用於高並發,低數據量請求的應用中。
16.使用Jdbc鏈接池
為了提高訪問資料庫的性能,我們還可以使用JDBC 2.0的一些規范和特性,JDBC是佔用資源的,在使用資料庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關閉Connection。而我們知道,獲取Connection是比較消耗系統資源的。
Connection緩沖池:當一個應用程序關閉一個資料庫連接時,這個連接並不真正釋放而是被循環利用,建立連接是消耗較大的操作,循環利用連接可以顯著的提高性能,因為可以減少新連接的建立。
一個通過DataSource獲取緩沖池獲得連接,並連接到一個CustomerDB數據源的代碼演示如下:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(「jdbc/CustomerDB」);
Connection conn = dataSource.getConnection(「password」,」username」);
17.緩存DataSorce
一個DataSource對象代表一個實際的數據源。這個數據源可以是從關系資料庫到表格形式的文件,完全依賴於它是怎樣實現的,一個數據源對象注冊到JNDI名字服務後,應用程序就可以從JNDI伺服器上取得該對象,並使用之和數據源建立連接。
通過上面的例子,我們知道DataSource是從連接池獲得連接的一種方式,通過JNDI方式獲得,是佔用資源的。
為了避免再次的JNDI調用,可以系統中緩存要使用的DataSource。
18.即時關閉使用過的資源
互聯網應用系統一般是並發的系統,在每次申請和使用完資源後,應該釋放供別人使用,使用完成後應該保證徹底的釋放。
19 .架構選型
CoreMediaCMS將整個應用分成四成架構,每一層都可以獨立於其他層而正常運行,每一層都可以分布式布署,極大的提高了應用系統的穩定性、可擴展性、支持高並發的要求,每一次之前通過中間件Corba進行穩定的傳輸數據。
20 .開發框架的選型
充分利用開源框架,可以大大提高開發效率。很多初級開發者,都採用DB JavaBean JSP這種初級的開發模式,而現在主要使用Struts、Spring等MVC開發框架。
常用開發框架構選型有:
Struts、Spring、Webwork等。
天極傳媒選擇的開發框架是:Struts Spring iBatis,在這個開發框架里,充分利用了Struts、Spring各自己的優點,可以選擇StutsMVC,也可以選擇Spring MVC。
21.分級存儲
1)資料庫數據分級存儲:
將經常訪問的數據和訪問頻度低的數據,分別存放到不同的分區,甚至存放到不同的資料庫伺服器,以便合進分配硬碟I/O及系統I/O。
2)網站內容發布之後,分級存儲:
任何一個大型的網站,一般都有海量的內容,為了提高訪問效率,應搭建分級存儲體系,根據應用的重要性和訪問並發要求,將這些內容分級存儲,同時將靜態內容中的靜態頁面文件、圖片文件、下載文件分不同的Web伺服器訪問,降低I/O爭用,提高訪問效率,同時讓數據存儲、管理、備份更加清晰。
22 .頁面靜態化
一個大型網站,既有靜態內容,也有動態內容。靜態內容,直接通過Apache或者Squid訪問,效率高,穩定可靠,更多的是受伺服器等硬體設備的I/O吞吐量、網路環境及頁面代碼本身質量限制,不受應用系統及資料庫性能限制,這些內容往往訪問速度和效率不會有較大的問題。
而動態內容,除了受硬體設備I/O、操作系統I/O及內容、網路環境及頁面代碼的影響,還要受應用伺服器和資料庫性能影響,因此,這部份內容,要盡可能作靜態化或者偽靜態,並採用緩存技術,將其緩存,以減少對應用伺服器和資料庫伺服器的操作次數,提高用戶訪問效率和穩定性。
23.緩存策略
對於構建的業務系統,如果有些數據要經常要從資料庫中讀取,同時,這些數據又不經常變化,這些數據就可以在系統中緩存起來,使用時直接讀取緩存,而不用頻繁的訪問資料庫讀取數據。
緩存工作可以在系統初始化時一次性讀取數據,特別是一些只讀的數據,當數據更新時更新資料庫內容,同時更新緩存的數據值。
例如:在CMS2005系統中,我們將很少發生變化的網站節點樹數據,緩存在客戶端,當用戶登錄時,一次性讀入到客戶端緩存起來,以後編輯在使用時,不用再從資料庫中讀取,大大提高了應用系統的訪問速度。
當然,也可以將資料庫中重復訪問的數據緩存在應用伺服器內存中,減少對資料庫的訪問次數,Java常用的緩存技術產品有:MemoryCache、OSCache等。
10. 如何測試伺服器支持的最大並發連接數
更改服來務端的I/O模型吧,這明顯是服自務端設計的問題。
你這樣設計上線使用的話,伺服器開銷太大了(主要是線程切換的開銷)。
//--------------------
Listen(socket,5),跟這個有一定關系。
int listen(int sockfd, int backlog); 第二個參數是你監聽客戶端的最大個數,如連接到主機上的客戶端超過其數listen則會返回一個錯誤代號。
backlog你可以設置大一點,如100之類的。
建議使用I/O模型吧,不要使用建立新線程來處理。
(你使用建立新線程的話,會發現每個進程所建立的最大線程數量是有一個限制的)