天天看點

Tomcat應用報redis逾時的故事業務背景介紹           

系統架構是通過分布式的方式進行部署的,登入的時候不會調用redis資料,假如使用者登入成功了,會跳轉到其它的項目上,并根據從redis中查到的權限緩存,像是相應的資料子產品

問題一:使用者登入失敗,系統巨卡無比

問題二:Tomcat抛出 connect timed out錯誤

:sar -n DEV 1

這裡發現了一個問題,伺服器的記憶體資源居高不下,暫且不考慮伺服器資源的正常與否

ps -ef 顯示系統程序

這裡不友善把伺服器開啟了那些程序羅列到此處,還請見諒;最後的分析結果就是,并無異常程序

這就奇怪了,到底是哪的問題呢?繼續查找

生産環境有兩個java項目都調用了這個伺服器的redis服務,然後找到了這兩個項目分别檢視日志,幾乎在相同時間都抛出了Time out的錯誤,是以斷定應該是redis單方面的問題

檢視了redis日志,并沒有什麼報錯請求

使用redis-benchmark測試了redis的壓力,也沒有什麼問題。

懷疑是有慢查詢 連接配接數不夠用 等待了 導緻逾時了

有這麼幾個指令:

  ./redis-cli -h 127.0.0.1 -p 6378 # 這個是連接配接上本機的6378的redis

  auth password #如果redis設定的有密碼,使用auth進行密碼驗證

  CONFIG GET slowlog-log-slower-than #(10000us,Redis中的執行機關是微秒,相當于10ms)

  SLOWLOG LEN #檢視redis存儲的慢查詢記錄,預設檢視128條

  SLOWLOG GET # 檢視redis存儲的慢查詢記錄,預設10條

從上面可以看出一個滿查詢在55毫秒左右,項目的配置檔案在10秒左右,是以不存在逾時的問題

懷疑redis的記憶體用到上線,是以檢視了redis的配置

<code>maxmonery # 我的配置檔案沒有設定,預設是不限制記憶體</code>

介紹Memory的參數資訊:

Tomcat應用報redis逾時的故事業務背景介紹           

檢視了redis使用記憶體很小,才使用了27.19M,排除了redis的記憶體使用情況

使用了speedtest-cli 指令測試了本機的網速情況

  speedtest-cli指令介紹:

測試結果:

Tomcat應用報redis逾時的故事業務背景介紹           

使用這個指令檢視本機網絡,貌似有問題,于是那了兩台機器之間互傳了一個較大的檔案,檢視了速度,經測試速度在5MB-6MB左右,是以排除了網絡問題】

開始認為是持久化導緻的磁盤IO飙升問題,于是更改持久化政策

先說一下持久化分為兩種方式,第一種為AOF,第二種為save的方式,格式大概為

方式一:

方式二:

注掉了從的持久化,主注掉save模式,開啟AOF模式,可是io高的問題依舊沒有解決,于是乎就有了下文

看到這個界面,好像找到了點頭緒,伺服器的磁盤IO較高,但是小編這裡也提出了疑問,redis的資料全部存放到了sdb銀盤上,而且redis的程式也都是在sdb上面,那為什麼伺服器的sda的

IO資源占用如此之高呢?

順藤摸瓜&gt;&gt;&gt;就從高IO的線索查找問題根源:

iotop

<code>iotop執行指令結果,發現一個占用資源特别高的程序</code>

檢查發現,這個程序存在的作用是,當系統的實體記憶體耗盡時候,系統會激活此程序,以來調用swap分區。

這下有點明白其中的道道了,問題原因大概如下:

Tomcat應用報redis逾時的故事業務背景介紹           

檢查都有那些系統應用占用了swap分區,編寫腳本:

執行結果,發現

redis的程序全部存放在了swap分區中,果然是這樣。

修改核心參數,合理配置設定記憶體使用

A.釋放實體記憶體,并且叫新應用擷取實體記憶體。

  1.在釋放記憶體之前,檢查可用記憶體多少

    free -m

    輸出結果略

  2.手動釋放記憶體

    echo 1 &gt; /proc/sys/vm/drop_caches

  3.釋放完成後,檢查可用記憶體是否進行了釋放

  經過上述的三個指令,發現記憶體确實進行了釋放。

  4.重新開機redis服務

  5.檢查swap分區使用

    重新開機了redis發現記憶體走的依舊是swap分區,實體記憶體還有很多可用記憶體,但是系統為什麼分給應用swap分區呢?

B.修改系統核心參數,叫所有的應用盡量使用實體記憶體,避免使用swap分區。

Tomcat應用報redis逾時的故事業務背景介紹           

仔細看,實體記憶體還有将近1GB沒有使用。但是swap已經開始被使用。懷疑是不是swappiness檔案的值沒有更改。

說明:在centos裡面,swappiness的值的大小對如何使用swap分區是有着很大的聯系的。swappiness=0的時候表示最大限度使用實體記憶體,然後才是 swap空間,swappiness=100的時候表示積極的使用swap分區,并且把記憶體上的資料及時的搬運到swap空間裡面。兩個極端,對于Centos的預設設定,這個值等于60,建議修改為10。具體這樣做:

最後重新加載swap虛拟記憶體:

但是上面操作後,重新開機了redis應用,系統依舊分給了redis swap分區。

C. 最後重新開機伺服器,并再次啟動redis服務,最後問題得到了解決。swap分區為0了

本文轉自 xinsir999 51CTO部落格,原文連結:http://blog.51cto.com/xinsir/2050754,如需轉載請自行聯系原作者