1. 程式人生 > >性能測試四十四:性能優化思路

性能測試四十四:性能優化思路

tst 行修改 最大 tail 包括 waiting pid visualvm 事務

性能瓶頸定位整體思路,從前到後,從表象到內部
  1,首先排除壓力機的性能情況,包括cpu、內存
  2,應用服務器的硬件指標,cpu,內存,網絡IO(ethtool eth0),磁盤IO,如果發現某臺機器的這四項中的任何一項到達瓶頸,那麽這臺機器在這一方面就到達瓶頸了
  3,其他服務器,比如數據庫服務器,依賴的其他應用服務器
  4,看應用服務器的日誌,tomcat下看的是catalina.out,用tail -200 catalina.out ,看cause by:xxx TimeOut
  5,tps比較低,應用服務器cpu比較高,jvisualvm、jprofiler看下java進程,消耗cpu的方法
  6,tps比較低,應用服務器cpu也比較低,可能是java程序的線程阻塞或死鎖,也用jvisualvm看,如果紅色的線程比較多,就是阻塞的原因(blocked、timed_waiting),jstack pid
  7,tps比較低,響應時間比較長,首先要先弄清楚請求的流向,比如:LR-->nginx-->tomcat-->java-->數據庫-->緩存-->外部依賴--返回,如果排除到其他的問題,可以在java代碼加時間戳的方法來定位響應時間比較長的問題
  8,tps緩慢降低,或大幅降低,tps大幅波動,用jmap或者jvisualvm進行堆內存dump,用jstat -gcutil,看看是否有內存泄露趨勢,Jvm的FullGC是否頻繁(單次FullGC消耗的時間FGCT/FGC,最好不要超過200毫秒)
  9,排查連接數相關的內容,包含tomcat的連接數、mysql的連接數,某端口的連接數:netstat -an|grep 8080 | wc -l

技術分享圖片

Tomcat連接數相關
關於連接數,要看2方面,首先是中間件最大配置的連接數,然後就是當前連接數
tomcat的當前連接數用netstat可以看,略。最大連接數在
一般tomcat需要設置的參數,第一個就是連接數在conf/server.xml裏配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

mysql連接數:
maxThreads="200" 表示最多同時處理200個連接,默認值是200,可以改為2000,一般都是上千的,看具體配置
acceptCount="100" 當同時連接的人數達到maxThreads時,還可以接收排隊的連接,超過這個連接的則直接返回拒絕連接。默認值為100 ,可以改為500,看具體配置
第二個jvm的參數,在bin目錄下的catalina.sh第二行插入就行


數據庫架構的調優
  --讀寫分離:主從配置,AB主從關系,寫A同步到B,讀B
  --分庫分表:根據一個id來路由庫名和表名,id%10,1202922292
    user_1
    user_2
    user_3
    ...
    user_10

  --硬件調優
    普通磁盤
    SSD
    fusionIO卡

常見的一些sql優化方案
  1、在 where 及 order by 涉及的列上建立索引,避免全表掃描,索引不要太多,一個表不要超過4個索引
  2、避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描
  3、查詢語句中不要使用 *,減少內存使用
  4、盡量減少子查詢(嵌套查詢),使用關聯查詢(left join,right join,inner join)替代
  5、減少使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代
  6、or 的查詢盡量用 union或者union all 代替,(在確認沒有重復數據或者不用剔除重復數據時,union all會更好)
  7、合理的增加冗余的字段(減少表的聯接查詢)
  8、建表的時候能使用數字類型的字段就使用數字類型(type,status...),數字類型的字段作為條件查詢比字符串的快


應用程序架構調優
  代碼優化原則
  1、使用對象池減少對重復對象的創建;
  2、調整對後端的連接
  3、增加本地緩存
  4、如果不涉及事務的情況下,考慮使用Nosql進行存儲
  5、一次請求合並多次操作。
  6、由串行修改為並行操作
  7、同步修改為異步

性能測試四十四:性能優化思路