系統架構是通過分布式的方式進行部署的,登入的時候不會調用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的參數資訊:

檢視了redis使用記憶體很小,才使用了27.19M,排除了redis的記憶體使用情況
使用了speedtest-cli 指令測試了本機的網速情況
speedtest-cli指令介紹:
測試結果:
使用這個指令檢視本機網絡,貌似有問題,于是那了兩台機器之間互傳了一個較大的檔案,檢視了速度,經測試速度在5MB-6MB左右,是以排除了網絡問題】
開始認為是持久化導緻的磁盤IO飙升問題,于是更改持久化政策
先說一下持久化分為兩種方式,第一種為AOF,第二種為save的方式,格式大概為
方式一:
方式二:
注掉了從的持久化,主注掉save模式,開啟AOF模式,可是io高的問題依舊沒有解決,于是乎就有了下文
看到這個界面,好像找到了點頭緒,伺服器的磁盤IO較高,但是小編這裡也提出了疑問,redis的資料全部存放到了sdb銀盤上,而且redis的程式也都是在sdb上面,那為什麼伺服器的sda的
IO資源占用如此之高呢?
順藤摸瓜>>>就從高IO的線索查找問題根源:
iotop
<code>iotop執行指令結果,發現一個占用資源特别高的程序</code>
檢查發現,這個程序存在的作用是,當系統的實體記憶體耗盡時候,系統會激活此程序,以來調用swap分區。
這下有點明白其中的道道了,問題原因大概如下:
檢查都有那些系統應用占用了swap分區,編寫腳本:
執行結果,發現
redis的程序全部存放在了swap分區中,果然是這樣。
修改核心參數,合理配置設定記憶體使用
A.釋放實體記憶體,并且叫新應用擷取實體記憶體。
1.在釋放記憶體之前,檢查可用記憶體多少
free -m
輸出結果略
2.手動釋放記憶體
echo 1 > /proc/sys/vm/drop_caches
3.釋放完成後,檢查可用記憶體是否進行了釋放
經過上述的三個指令,發現記憶體确實進行了釋放。
4.重新開機redis服務
5.檢查swap分區使用
重新開機了redis發現記憶體走的依舊是swap分區,實體記憶體還有很多可用記憶體,但是系統為什麼分給應用swap分區呢?
B.修改系統核心參數,叫所有的應用盡量使用實體記憶體,避免使用swap分區。
仔細看,實體記憶體還有将近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,如需轉載請自行聯系原作者