Redmine性能優化方案

近來公司redmine服務器表現很糟糕,在16核,64GRAM的機器上,壓測結果居然只有每秒5~7個請求,部分頁面一個都出不來。html

 

如下是我對Redmine性能優化方案: mysql

redmine服務器性能問題排查與優化建議:
 
如下建議的方案是基於redmine運行期的log文件中的render耗時、activerecord耗時,linux系統性能指標採樣與 mysql 性能指標採樣分析,以及redmine在不一樣web server下的benchmark而得:
 
一. 問題排查與定量分析
經過分析redmine運行期的log,對比mysql高峯時段的請求量與此時系統cpu、mem、disk、iowait等指標,以及我在本地的相同環境下的僞造併發量的性能測試結果,能夠看出服務器中高峯時段並未有效利用cpu與內存. 最主要的4個緣由是:
1. rails框架過於笨重,運行效率低,
2. 一個ruby進程只能利用單核cpu,其多線程受GIL所控,多線程效率較低,沒法有效利用多核cpu,所以在高峯時段只有passenger進程佔用的幾個cpu滿載,其他利用率基本爲0。
3. 目前redmine的發佈方式是apache+passenger, passenger沒有進過優化,只開啓了6個worker,並且只是進程級支持,這致使了iredmine服務器的吞吐量很是低。
4. mysql的運行模式沒有進過優化配置,基本裸跑。
 
1.1 性能指標說明:
linux性能指標數據使用shell腳原本採集,已經存儲,如需分析能夠參考以下:
  1. linux系統採樣腳本:在~/performanceLog/collectLog.sh中,或者看這篇 linux系統性能指標的採集博客;
     採樣結果在~/performanceLog下,以日期命名的文件中。
     注: 若是之後想使用此腳本採集數據,若是mysql的地址或者目錄有更換,此腳本中dstat 的mysql相關數據的採集須要重寫其mysql鏈接部分的代碼。
  2. mysql的指標數據能夠經過運行以下命令: 
      mycheckpoint --user=root --password=xxxx --socket=/redmine/mysql/tmp/mysql.sock --database=mycheckpoint http
      而後瀏覽器打開:  http://172.26.1xx.xx:8080/mycheckpoint/ 能夠查看mysql的各項指標。
 
1.2 redmine服務器的壓測、benchmark定量分析方法說明:僞造併發http請求,查看每秒併發10個請求時,不一樣web server的性能表現。
針對不一樣web server的負載測試方法以下:
在量化性能時,本方案帶來的的性能提高時,爲了方便ab測試,建議關閉redmine代碼中csrf保護,並利用session,自動登錄,以保證測試的地址有sql操做,確保測試過程包含sql請求,方法以下:
 
取消csrf保護方法:
找到redmine發佈的代碼中controller目錄下的ApplicationController.rb文件,將其中的csrf保護函數protect_from_forgery中cookie.delete(auto_cookie_name)行註釋掉。 (production模式記得調回來)
 
ab模擬併發測試步驟:
0.  ./ctlscript.sh stop apache
1.  使用puma -w 16 -t 16 -p 8080 /redmine/apps/redmine/htdocs/config.ru啓動 redmine
2.  chrome瀏覽器,打開url, 查看inspect tools, 複製cookies
3.  使用ab工具: ab -n 800 -c 16  -H 「Cookie: Key1=Value1; Key2=Value2」    http://localhost:8080/issues/48575
 
 
二:優化方案說明:
1. 併發量過大時反應慢的問題                                 #ok,使用multi-process * multi-thread的 web server
2. 數據庫讀寫性能太低                                          #ok,打開mysql查詢緩存等。
3. 使用異步io庫em-Synchrony,提高IO吞吐量。      #failed, 經測試,不穩定,接口版本有時不匹配,需3.1以上版的rails。
4. 使用rubinus or jruby 提高執行性能                     #failed,經測試jruby 內存損耗太大, rubinus有兼容性問題。
5. 去除rails默認加載的非必需的middleware             #rails默認加載20多箇中間件,有些是無需的。
 
進過以上幾個步驟的優化調整,進過ab測試發現,吞吐量能夠提高2到3倍, 負載能力也有提高,但沒有去測極限數據。
 
 
三:web服務器優化建議:
     建議使用多進程多線程版的puma替代多進程單線程passenger, 或者 任然使用passenger,可是配置成默認開啓14個worker,方便高峯時段留兩個cpu給mysql使用。 另外, 因爲puma能夠必定程度利用多線程來serve http請求,爲了保證線程安全,需修改iredmine代碼: 
    添加config.threadsafe!到config/enviroment目錄下的production.rb文件中
    # enable multithread, and keep thread safe.
    config.threadsafe!
1. puma的使用: 啓動14個工做進程*16個線程,提高吞吐率。
    puma -w 14 -t 16 -p 8080 /redmine/apps/redmine/htdocs/config.ru
 
2. 配置passenger方法:
    配置文件在:/redmine/apache2/conf/bitnami 目錄下,添加如下:
    PassengerMaxPoolSize 14
 
 
四:mysql服務器優化建議:
mysql的服務器優化主要依賴mycheckpoint 採集的mysql性能指標可視化以後的分析,以及mysqltuner.pl的調優建議。
1. 在mysql的配置文件中開啓一下設置(如下有兩個變量設置後須要重啓mysql):
    Threads_cached  -> ON
    thread_cache_size = 64;
    query_cache_size (>= 8M)
    join_buffer_size (> 128.0K)
    tmp_table_size (> 16M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)
    table_open_cache (> 800)
    innodb_buffer_pool_size (>= 371M)
另外還有: thread_concurrency = 32;  (cpu*2)
關於mysql的用戶請求壓力狀況,請查看http://172.26.1xx.xx:8080/mycheckpoint/
 
 
五:rails優化建議: 刪除不須要的middleware
請聯合目前redmine插件開發人員,根據當前rails的實際middleware使用狀況進行篩選刪除。
方法:能夠在application configuration 文件中添加如下代碼來刪除。
# config/application.rb
config.middleware.delete "Rack::Lock"
config.middleware.delete 'Rack::Cache'                          # 整頁緩存,彷佛在redmine中沒有用上。
config.middleware.delete 'Rack::Runtime'                      # 記錄X-Runtime(方便客戶端查看執行時間)
config.middleware.delete 'ActionDispatch::RequestId'     # 記錄X-Request-Id(方便查看請求在羣集中的哪臺執行)
config.middleware.delete 'ActionDispatch::RemoteIp'      # IP SpoofAttack
config.middleware.delete 'ActionDispatch::Callbacks'       # 在請求先後設置callback
config.middleware.delete 'ActionDispatch::Head'             # 若是是HEAD請求,按照GET請求執行,可是不返回body
config.middleware.delete 'ActionDispatch::BestStandardsSupport' # 設置X-UA-Compatible, 在nginx上設置
等等。。
 
 
六: 去除production 模式下rails不須要的log 與 某些異常的修正。
1. 因爲在production.log中發現了大段的debug模式才須要的log所有輸出到了log文件中,耗時較長,建議刪除。
2. 某些url出現了 runexception. 建議修正, 或者在 middleware中去除名稱爲: use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions

 

七: 部分redmine插件寫的比較糟糕,render耗時長達3000ms linux

 

相關信息:nginx

1. linux系統性能定位與排查: http://www.cnblogs.com/ToDoToTry/p/4423577.htmlweb

2. redmine的ab壓力測試方法:http://www.cnblogs.com/ToDoToTry/p/4442384.htmlsql

3. mysql性能記錄與分析:http://www.cnblogs.com/ToDoToTry/p/4394249.htmlchrome

4. mysql優化工具:shell

5. linux IO問題分析與排查:數據庫

6. mysql性能測試工具與方法: apache

相關文章
相關標籤/搜索