qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          數據庫系統load飆高問題解決思路

           工作過程中有時候會接收到數據庫服務器器load 飆高的報警,比如:
            load1 15.25 base: 8.52,collect time:2014-08-30
            如何處理load 異常飆高的報警呢? 本文嘗試從原理,原因,解決方法來闡述這類問題的解決思路。
            一 原理分析
            CPU作為服務器的關鍵資源經常成為性能瓶頸的根源,CPU使用率高并不總是意味著CPU工作繁忙,它有可能是正在等待其他子系統。在進行性能分析時,將所有子系統當做一個整體來看是非常重要的,因為在子系統中可能會出現瀑布效應。衡量CPU 系統負載的指標是load,load 就是對計算機系統能夠承擔的多少負載的度量,簡單的說是進程隊列的長度。簡單的例子比如食堂有五個窗口,當有小于五個學生來打飯,五個窗口都能及時處理,但是當學生個數超過5個,必然會出現等待的學生。請求大于當前的處理能力,會出現等待,引起load升高。
            Load Average 就是一段時間(1min,5min,15min)內平均Load。平均負載的最佳值是1,這意味著每個進程都可以在一個完整的CPU 周期內完成。
            14:50:31 up 166 days,  1:54, 295 users,  load average: 0.05, 0.04, 0.00
            二 原因分析
            一般導致MySQL服務器load飆高的原因可能有以下幾種情況:
            1 業務并發調用全表掃描/帶有order by 排序的SQL語句.
            2 SQL語句沒有合適索引/執行計劃出錯/update/delete where掃描全表,阻塞其他訪問相同表的sql執行.
            3 存在秒殺類似的業務比如聚劃算10點開團或者雙十一秒殺,瞬時海量訪問給數據庫帶來沖擊。
            4 數據庫做邏輯備份(需要全表掃描)或者多實例的壓縮備份(壓縮時需要大量的cpu計算,會導致系統服務器load飆高)
            5 磁盤寫入方式改變 比如有writeback 變為 write through
            RAID卡都有寫cache(Battery Backed Write Cache),寫cache對IO性能的提升非常明顯,因為掉電會丟失數據,所以必須由電池提供支持。
            電池會定期充放電,一般為90天左右,當發現電量低于某個閥值時,會將寫cache策略從writeback置為writethrough,相當于寫cache會失效,這時如果系統有大量的IO操作,可能會明顯感覺到IO響        應速度變慢,cpu 隊列堆積系統load 飆高。
            6 其他 歡迎補充 。
            三 解決方法
            在Load average 高的情況下如何鑒別系統瓶頸?如何判斷系統是否已經Over Load呢?要去檢查判斷是CPU不足,還是io不夠快造成或是內存不足?
            這里筆者處理的方式 一般根據cpu數量去判斷,也就是Load平均要小于CPU的數量,負載的正常值在不同的系統中有著很大的差別。在單核處理器的工作站中,1或2都是可以接受的。多核處理器的服務器(比如24核)上,load 會到達20 ,甚至更高。以多實例混合公用一臺24核物理機為例,當DBA收到數據庫服務器load 飆高報警后,一般的處理步驟
            a) 數據庫層面
            1 top -u mysql -c 檢查當前占用cpu資源最多的進程命令。-c 是為了顯示出進程對應的執行命令語句,方便查看是什么操作導致系統load飆高。
            2 根據不同的情況獲取pid 或者MySQL的端口號
            3 如果是MySQL 數據庫服務導致laod 飆高,則可以使用如下命令
            show processlist;
            SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> 'sleep' AND TIME>100;
            或
            orzdba 工具檢查邏輯讀/thread active的值。用法orzdba --help
            orztop 工具檢查當前正在執行的慢sql,用法orztop -P $port
            4 獲取異常的sql之后,剩下的比較好解決了。結合第一部分中的幾條原因
            a 選擇合適的索引
            b 調整sql 語句 比如對應order by 分頁采用延遲關聯
            c 業務層面增加緩存,減少對數據庫的直接訪問等
            b) OS 系統層面 檢查系統IO
            使用iostat 命令查看r/s(讀請求),w/s(寫請求),avgrq-sz(平均請求大小),await(IO等待), svctm(IO響應時間)
            r/s ,w/s是每秒讀/寫請求的次數。
            util是設備的利用率。如果它接近100%,通常說明設備能力趨于飽和(并不絕對,比如設備有寫緩存)。有時候可能會出現大于100%的情況,這多半是計算時四舍五入引起的。
            svctm是平均每次請求的服務時間。這里有一個公式:(r/s+w/s)*(svctm/1000)=util。舉例子:如果util達到100%,那么此時  svctm=1000/(r/s+w/s),假設IOPS是1000,則svctm大概在1毫秒左右,如果長時間大于這個數值,說明系統出了問題。
            await是平均每次請求的等待時間。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大于svctm,它們的差值越小,隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
            avgqu-sz是平均請求隊列的長度。毫無疑問,隊列長度越短越好。

          posted on 2014-09-05 10:59 順其自然EVO 閱讀(1815) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 三明市| 玉龙| 沅江市| 修文县| 巴楚县| 巧家县| 襄汾县| 溧阳市| 枣庄市| 湘乡市| 蕉岭县| 上林县| 金堂县| 遵化市| 沂南县| 通化市| 恩施市| 涡阳县| 北京市| 延安市| 巨野县| 海淀区| 石狮市| 湟中县| 郑州市| 曲靖市| 张掖市| 丹巴县| 辽宁省| 图们市| 贺州市| 余姚市| 宁南县| 长治市| 平阴县| 贞丰县| 黄陵县| 金堂县| 贡山| 林口县| 临武县|