現象:前端頁面,有時會打不開;有時個別請求無返回信息;f12 查看請求,提示「no-referrer-when-downgrade」前端
分析過程:java
一、查看請求對應的服務端是否正常(查看服務器日誌),發現服務端對於請求能夠正常響應;從前端來看,同一個請求,有時有返回信息,有時無返回信息nginx
二、查看nginx access 日誌,發現部分請求返回http 499;同一個uri,有返回http 200 和http 499redis
三、查看nginx upstream 配置,發現配置中存在一個無效的服務端地址數據庫
結論:緩存
nginx 不會檢測upstream 中配置的服務器是否有效,當配置了無效的服務端地址時,請求經過nginx 轉發到該無效的服務器時,就會形成請求不可用,nginx 會將該請求的響應封裝爲 http 499服務器
現象:dubbo 提示線程池已滿;前端顯示服務不穩定多線程
分析過程:less
一、查看dubbo 服務日誌,日誌僅顯示線程池已滿ssh
二、查看服務對應的 error 日誌,發現zookeeper 分佈式鎖有時會釋放失敗,而後去查看zookeeper 日誌,未發現異常
三、阿里雲監控報警,數據庫CPU 佔比超過90%
結論:
查詢某列表未使用緩存,致使大量請求(每分鐘5W次左右)在短期內訪問數據庫(自己查詢速度沒問題,可是請求量太大),形成數據庫瓶頸,並對正常的寫業務形成影響,大量對於數據庫的訪問,都在排隊,形成響應時間過長,dubbo服務線程池壓滿
解決方案:
一、按需對查詢增長 redis 緩存,JVM 緩存,nginx 緩存
二、對數據庫進行讀寫分離處理,防止下一次大量請求致使的數據庫瓶頸問題
現象:
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
緣由:多線程狀態下,公用一個HttpClient對象,一個請求未結束,再次發起新的請求,就會報這個錯
解決方法:
一、低版本的HttpClient,可使用 ThreadSafeClientConnManager 來代替 BasicClientConnManager
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
cm.setMaxTotal(20);
HttpClient client = new DefaultHttpClient(cm, httpParams);
二、高版本的HttpClient,可使用 PoolingHttpClientConnectionManager
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(20);
CloseableHttpClient client = HttpClients.custom().setConnectionManager(pcm).build();
數據文件的清理:使用 truncate table_name 來清理數據量多的表
使用delete 的話,不會釋放磁盤空間,須要使用:optimize table tab_name 來釋放。
注意:optimize 會鎖表,應在空閒時期進行處理
select sum(data_length + index_length + data_free) / 1024 / 1024 from information_schema.tables;
查詢數據文件所佔空間
解決方案:
挖礦病毒假裝爲 ntp 進程,但正常的ntp進程名爲ntpd
rm -rf /var/spool/cron/crontabs
rm -rf ~/.ssh/KHK75NEOiq
rm -rf /opt/KHK75NEOiq33
rm -rf /opt/*
rm -rf /etc/init.d/ntp
rm -rf /usr/sbin/ntp
rm -rf /usr/local/etc
pkill minerd
kill -9 (/usr/sbin/ntp的進程號)
一、top 命令查看cpu和內存佔用較大的進程pid
二、根據進程pid,查看內部線程佔用cpu狀況
ps -mp 1316 -o THREAD,tid,time | sort -rn | less
(sort -rn 以數值的方式進行逆序排列)
三、找出佔用cpu比較高的TID,須要將TID轉換爲十六進制,例如:printf "%x\n" 1731,結果 6c3
四、使用 jstack 1316 查看具體對應的線程
五、使用 jstat -gcutil 1316 1000 100 查看jvm內存和gc狀況
./bin/zkCleanup.sh -n 50 使用 zookeeper 自帶的清理腳本,可清理 log 和 snapshot,-n 50 是指保留50個文件(注意:是log和snapshot各保留50個的意思)
zookeeper 版本在3.4 以上的,也能夠在配置中配置自動清理(zoo.cfg):
autopurge.snapRetainCount=50 # 保留50個
autopurge.purgeInterval=72 # 自動清理間隔,單位:小時