性能調優之訪問日誌IO性能優化 性能調優之訪問日誌IO性能優化

性能調優之訪問日誌IO性能優化

 

poptest是國內惟一一家培養測試開發工程師的培訓機構,以學員能勝任自動化測試,性能測試,測試工具開發等工做爲目標。若是對課程感興趣,請你們諮詢qq:908821478,諮詢電話010-84505200。html

在高併發量的場景下磁盤IO每每是性能的瓶頸所在,訪問日誌涉及到頻繁的寫操做,因此這部分要儘量地優化,否則將拖累系統的總體性能。針對文件記錄及數據庫記錄兩種方式能夠有如下措施提升寫性能,數據庫

避免頻繁的打開關閉文件。將日誌寫入文件的通常操做步驟是打開-寫入-關閉,但假如在須要頻繁寫入日誌的場景下,這種方式在性能上確定會存在問題,由於每次打開關閉都是須要成本開銷的,因此必需要想一想是否有別的更好的方式,居然問題出如今打開關閉的次數,那麼解決問題思路就從這裏下手,能夠在第一次打開寫入日誌後不進行關閉操做,保持打開的狀態,下一次寫入則無需再次打開可直接寫入。而因爲實際過程當中訪問日誌產生的量很是大,確定不可能只往一個文件中寫入數據,可能會按時間間隔天天寫一個文件或按文件大小每50M寫一個文件,因此在實際設計中會涉及到更換文件的操做,更換時須要把原來的文件流關閉。經過上述措施避免了文件頻繁的打開關閉操做,但它同時也存在一些缺點,文件流不關閉會一直佔用操做系統資源,且若是不及時關閉可能在程序運行過程當中發生異常未正確處理而致使文件流未能關閉,進而將會致使內存泄漏。性能優化

添加緩衝區:添加緩衝區的做用簡單地說應該是減小文件真實寫入磁盤的次數,通常將文件寫入的方式是每執行一次寫入操做就把這次須要寫入的數據寫入磁盤介質中,而緩衝區模式則是把要寫入的數據先寫入內存中,當緩衝區內存量達到必定程度才寫入磁盤,因此添加了緩衝區的文件操做並不是每次寫入都是存儲介質中,緩衝區對於IO操做是一個十分重要的概念,緩衝區具體的實現能夠參考我前面相關的章節,固然jdk已經提供了相關的緩衝類並不用咱們重複製造輪子。緩衝區的添加無疑提升了操做性能,但它一樣存在缺點,它沒法百分之百保證全部數據都成功記錄到存儲介質中,可能在系統發生意外時致使緩衝區沒法寫入文件,而丟失的僅僅是緩衝區的數據。多線程

利用「池」技術優化鏈接避免每次建立鏈接,池技術更多的是針對以數據庫作爲存儲端的方案,便是咱們最熟悉的鏈接池了,JDBC每次建立鏈接都須要很大的成本開銷,若是每次寫入都從新創建鏈接這對系統來講簡直沒法忍受,因而能夠在系統初始化時就建立一個鏈接池,池內包含了不少創建好的鏈接,每次使用時只需往池裏取出,使用完不關閉鏈接而是把鏈接從新放回池裏便可。此種方式的好處顯而易見,操做性能大大地提升,而若是真要說有哪些缺點的話估計只能說鏈接池須要佔用一些操做系統資源,即便沒有被使用。但對於如今的機器這點成本消耗基本能夠忽略不計。併發

優化鎖競爭,首先,在一個高併發的場景中日誌的寫入確定是多線程的,多線程的使用在提升系統性能的做用是毋庸置疑的;其次,居然在文件流的寫入操做是多線程的,那必然涉及到鎖競爭的問題,由於若是沒有鎖的保護文件可能被寫得亂七八糟且正確性沒法獲得保證,因此線程必定是在寫入前先嚐試競爭寫入鎖,只有成功獲取鎖的線程才能執行寫入操做,一旦寫完就釋放鎖;最後,這種鎖的競爭跟JDK的實現及JVM的實現相關,多是全部競爭的線程採用自旋方式獲取鎖,也多是採用線程掛起方式,對於自旋方式及掛起方式在不一樣場景有各自的優點,線程自旋模式可能會消耗資源,一樣掛起恢復也可能會消耗資源,在實際使用中可經過性能測試比較決定使用哪一種方式。在JDK的自帶的併發包是先嚐試自旋獲取,若干次失敗後進行掛起操做。異步

考慮使用非阻塞模式,所謂非阻塞(NIO)是指在進行IO操做時當執行寫入操做時不等待執行結果而是直接放棄對CPU的使用,這種模式基於事件驅動,不一樣的事件由某一或若干線程處理,在實際中NIO模式被證明在某些場景中是性能提高的利器。它的惟一缺點估計是讓你程序變得更加複雜。高併發

使用異步IO,異步IO(AIO)是JDK1.7後提供的一種新IO模式,它主要是針對CPU的優化,是CPU級別的優化嘗試,在實際中使用須要對系統使用場景作性能測試對比再決定是否進行AIO改造。工具

相關文章
相關標籤/搜索